Webhook
Berlangganan sistem Anda sendiri ke acara Flash. Daftarkan endpoint HTTPS untuk acara yang Anda pedulikan, dan Flash mengirimkan payload tipis yang ditandatangani saat masing-masing dipicu — tanpa polling, tanpa ekspor malam. Tanda tangan mengikuti spesifikasi Webhooks Standar, pengiriman dicoba ulang dengan penundaan, dan setiap upaya dicatat.
Daftarkan titik akhir
Buat endpoint webhook dengan kunci Bearer fl_live_ yang menyimpan cakupan webhooks:manage. Kirimkan HTTPS url dan daftar eventTypes yang ingin Anda kirimkan ke sana. Rahasia penandatanganan dalam respons dan tidak akan pernah lagi — simpan dengan aman; Anda membutuhkannya untuk memverifikasi setiap pengiriman.
curl -X POST https://flash.socialhub.ai/api/v2/webhooks \
-H "Authorization: Bearer fl_live_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.your-app.com/flash",
"description": "prod ingest",
"eventTypes": ["member.created", "loyalty.tier_upgraded"]
}'
# 201 Created
# {
# "data": {
# "id": "whe_...",
# "url": "https://hooks.your-app.com/flash",
# "eventTypes": ["member.created", "loyalty.tier_upgraded"],
# "status": "active",
# "secret": "whsec_..." <-- shown ONCE, store it now
# }
# }Kelola titik akhir nanti dengan GET /api/v2/webhooks (daftar, tanpa rahasia), PATCH /api/v2/webhooks/{id} (ubah url / acara / status, atau kirim { "action": "rotate_secret" } untuk mengganti rahasia), dan DELETE /api/v2/webhooks/{id}. Anda juga dapat mendaftar, melakukan ping uji, dan memutar ulang pengiriman dari Pengaturan → Webhooks.
Katalog acara
Tanyakan kepada API acara mana yang dapat Anda ikuti. Katalog ini berasal dari sumber kebenaran pemicu otomatisasi langsung, sehingga hanya mencantumkan peristiwa yang benar-benar terjadi hari ini — dikelompokkan berdasarkan tahap siklus hidup (akuisisi, keterlibatan, loyalitas, retensi, perdagangan, advokasi) — masing-masing dengan kunci peristiwanya, deskripsi, dan contoh muatan. Respons juga mendokumentasikan amplop muatan bersama dan header tanda tangan.
curl https://flash.socialhub.ai/api/v2/events/catalog \
-H "Authorization: Bearer fl_live_..."
# { "data": { "events": [
# { "event": "member.created", "label": "Member created",
# "stage": "acquisition", "examplePayload": { ... } },
# { "event": "loyalty.tier_upgraded", "label": "Tier upgraded",
# "stage": "loyalty", "examplePayload": { ... } },
# ...
# ],
# "payload": { "schema": { ... }, "headers": { ... } }
# } }Masukkan kunci event suatu acara langsung ke eventTypes array saat Anda berlangganan. Membutuhkan cakupan webhooks:manage.
Muatan data yang tipis dan tidak mengandung informasi pribadi (PII)
Setiap pengiriman membawa amplop kecil yang sama: sebuah id yang stabil, peristiwa type, sebuah created_at timestamp, dan blok data yang ringkas. Muatan tidak pernah berisi data pribadi — tidak ada email, nama, telepon, atau alamat. Saat Anda membutuhkan detail anggota, ambil kembali melalui API yang telah diautentikasi menggunakan member_ref. Ini menjaga PII (Informasi Identitas Pribadi) pada catatan anggota dan tidak tercatat dalam log webhook Anda.
POST https://hooks.your-app.com/flash
webhook-id: evt_a1b2c3... # stable across retries — dedupe on this
webhook-timestamp: 1767225600 # unix seconds
webhook-signature: v1,K5x0mF...== # base64 HMAC-SHA256 (may be space-separated during rotation)
Content-Type: application/json
{
"id": "evt_a1b2c3...",
"type": "loyalty.tier_upgraded",
"created_at": "2026-01-01T00:00:00.000Z",
"data": {
"resource_id": "mbr_...",
"member_ref": "mbr_...", // opaque member id — fetch PII via the API
"tier": "Gold", // present on loyalty / tier events
"amount_band": "100-500" // coarse band on commerce events — never the exact amount
}
}Verifikasi setiap tanda tangan
Flash menandatangani setiap pengiriman dengan rahasia whsec_ titik akhir Anda menggunakan Webhooks Standar (HMAC-SHA256). Hitung ulang tanda tangan di atas {webhook-id}.{webhook-timestamp}.{body} dan bandingkan, dalam waktu konstan, dengan header webhook-signature. Tolak apa pun yang tidak cocok, dan tolak webhook-timestamp yang terlalu lama untuk dipertahankan terhadap tayangan ulang. Kunci penandatanganan adalah byte yang didekode base64 dari rahasia setelah awalan whsec_, sesuai spesifikasi. Selama rotasi rahasia, header membawa beberapa nilai v1,… yang dipisahkan spasi — terima pengiriman jika any cocok.
import crypto from "node:crypto";
// req.body must be the RAW, unparsed request body string.
function verifyFlashWebhook(headers, rawBody, whsec) {
const id = headers["webhook-id"];
const ts = headers["webhook-timestamp"];
const sigHeader = headers["webhook-signature"]; // "v1,<b64> v1,<b64> ..."
// reject stale deliveries (5 min tolerance)
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const key = Buffer.from(whsec.replace(/^whsec_/, ""), "base64");
const expected = crypto
.createHmac("sha256", key)
.update(`${id}.${ts}.${rawBody}`)
.digest("base64");
return sigHeader
.split(" ")
.map((p) => p.split(",")[1])
.some((sig) =>
sig &&
sig.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected)),
);
}Percobaan ulang, idempotensi & log pengiriman
Kembali 2xx dengan cepat
Konfirmasi dengan 2xx apa pun dan lakukan pekerjaan Anda secara asinkron. 429, 5xx, waktu habis, atau kesalahan koneksi dianggap dapat dicoba ulang.
Percobaan ulang otomatis dengan penundaan
Kegagalan yang dapat dicoba ulang akan dicoba ulang dengan penundaan eksponensial, jitter penuh. 3xx atau 4xx non-429 diperlakukan sebagai kegagalan permanen dan tidak dicoba ulang.
Deduplikasi berdasarkan webhook-id
id identik di seluruh percobaan ulang, jadi pengiriman setidaknya sekali aman: perlakukan webhook-id yang berulang sebagai sudah ditangani.
Log pengiriman & pemutaran ulang
Setiap upaya dicatat. Jika percobaan ulang habis, pengiriman ditandai gagal; Anda dapat memeriksa dan memutar ulang pengiriman dari Pengaturan → Webhooks.