İçeriğe geç

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);
}

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:

Terminal window
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.