Webhook imzası
Acil bildirim onaylanınca callback adresine şu gövdeyle POST gelir:
{ "receipt": "…", "acknowledged": true, "acknowledged_at": 1793057112, "acknowledged_by": "u_…", "acknowledged_by_device": "iphone" }Bildirimdeki http butonuna basılınca butonun adresine şu gövdeyle POST gelir (user, abone olan kişide projeye özel anahtardır; aynı kişinin 10 saniye içinde tekrar basması tek istektir):
{ "event": "action", "message_id": "01a17…", "action": { "index": 0, "title": "Kapıyı aç" }, "user": "u_…", "device": "iphone", "at": 1793057112 }PushBell-Signature: t=<unix>,v1=<hex> başlığını projenin webhook sırrıyla (panelde projenin Ayarlar sayfası → Webhook imza sırrı) doğrula: v1 = HMAC-SHA256(sır, t + "." + gövde). 5 dakikadan eski t değerlerini reddet. Yanıtın 2xx değilse 1 dakika sonra, sonra artan aralıklarla (en fazla 1 saat) 24 saat boyunca tekrar denenir.
import crypto from "node:crypto";
function verify(secret, header, body) { const [, t, v1] = /t=(\d+),v1=([0-9a-f]+)/.exec(header) ?? []; if (!t || Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; const want = Buffer.from(crypto.createHmac("sha256", secret).update(`${t}.${body}`).digest("hex")); const got = Buffer.from(v1); return want.length === got.length && crypto.timingSafeEqual(want, got);}Olay abonelikleri
Bölüm başlığı “Olay abonelikleri”Mesaj başına callback yerine projenin bütün acil bildirim onaylarını tek bir adrese almak için (Zapier, Make, n8n gibi otomasyonlar) proje API anahtarıyla abone ol:
curl -X POST https://api.pushbell.app/v1/hook-subscriptions \ -H "Authorization: Bearer pb_live_…" -H "Content-Type: application/json" \ -d '{"event": "emergency.acknowledged", "url": "https://ornek.com/pushbell/olay"}'Biri bir acil bildirimi onaylayınca adrese şu gövdeyle imzalı POST gelir (imza ve tekrar denemeler yukarıdaki gibi):
{ "id": "rL3f…", "event": "emergency.acknowledged", "project_id": "…", "receipt": "rL3f…", "message_id": "…", "title": "Duman alarmı", "acknowledged_at": 1793057112, "acknowledged_by": "u_…", "acknowledged_by_device": "iphone" }id her olay için tektir; aynı olay iki kez gelirse onunla ayıkla. Abonelikleri GET /v1/hook-subscriptions ile listele, DELETE /v1/hook-subscriptions/{id} ile sil. Aboneliği açan anahtar kapatılınca olay gönderilmez. Proje başına en fazla 25 abonelik olur. Son olaylar: GET /v1/events?event=emergency.acknowledged&limit=10.