Skip to content

Webhooks API

Webhook memberi tahu aplikasi Anda secara real time ketika terjadi sesuatu pada kredensial Anda — ketika kredensial diterbitkan, dikirimkan, dicabut, atau dilihat. Alih-alih melakukan polling ke API, Anda mendaftarkan endpoint HTTPS dan badges.ninja mengirimkan POST bertanda tangan untuk setiap peristiwa yang Anda langgani.

Semua endpoint pengelolaan memerlukan autentikasi melalui tajuk X-Api-Key. Lihat Autentikasi. Membuat atau menghapus endpoint memerlukan kunci dengan cakupan write; menampilkan daftar memerlukan read. Lihat Kunci API.

Mendaftarkan Endpoint

POST /webhooks

Parameter

ParameterTipeWajibDeskripsi
urlstringYaEndpoint HTTPS Anda. Harus diawali dengan https://.
eventsstring[]TidakTipe peristiwa yang akan dilanggani. Kosongkan atau berikan ["*"] untuk menerima semua peristiwa.

Contoh

bash
curl -X POST https://api.badges.ninja/webhooks \
  -H "X-Api-Key: bws_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/hooks/badges",
    "events": ["credential.issued", "credential.delivered"]
  }'

Respons

201 Created. Rahasia penanda tangan hanya dikembalikan sekali — simpan sekarang; Anda tidak dapat mengambilnya lagi.

json
{
  "id": "e4b19ff5-063d-4799-bd75-d03641be624f",
  "url": "https://example.com/hooks/badges",
  "events": ["credential.issued", "credential.delivered"],
  "secret": "2be6d335682c1658242fde3a523fd8a2493bab8c"
}

Menampilkan Daftar Endpoint

GET /webhooks

Mengembalikan endpoint terdaftar Anda. Rahasia penanda tangan tidak pernah disertakan.

json
{
  "webhooks": [
    {
      "id": "e4b19ff5-063d-4799-bd75-d03641be624f",
      "url": "https://example.com/hooks/badges",
      "events": ["credential.issued", "credential.delivered"],
      "active": true,
      "failureCount": 0,
      "createdAt": 1787685415083,
      "lastStatus": 200,
      "lastDeliveryAt": 1787685480777
    }
  ]
}

Menghapus Endpoint

DELETE /webhooks/{id}
bash
curl -X DELETE https://api.badges.ninja/webhooks/e4b19ff5-063d-4799-bd75-d03641be624f \
  -H "X-Api-Key: bws_your_api_key_here"

Pengiriman ke endpoint tersebut berhenti seketika.

Tipe Peristiwa

PeristiwaTerpicu ketika…
credential.issuedSebuah kredensial diterbitkan kepada penerima.
credential.deliveredEmail notifikasi kredensial dikirim kepada penerima (tunggal atau massal).
credential.revokedSebuah kredensial dicabut.
credential.viewedHalaman kredensial publik seorang penerima dilihat untuk pertama kalinya.

Payload Pengiriman

Setiap pengiriman adalah POST dengan isi JSON berbentuk berikut:

json
{
  "id": "b1c2d3e4-...",
  "type": "credential.issued",
  "createdAt": 1787685415083,
  "data": { }
}
FieldDeskripsi
idId pengiriman unik (gunakan untuk deduplikasi).
typeTipe peristiwa.
createdAtStempel waktu peristiwa (epoch milidetik).
dataPayload spesifik peristiwa (lihat di bawah).

data berdasarkan tipe peristiwa

credential.issued

json
{
  "awardId": "https://api.badges.ninja/certify-badge/award/<guid>",
  "badgeId": "https://api.badges.ninja/certify-badge/badge/<guid>",
  "badgeName": "Advanced Certification",
  "recipient": { "email": "jane@example.com", "name": "Jane Doe" },
  "issuedOn": "2026-08-25",
  "expires": null
}

credential.delivered

json
{
  "awardId": "https://api.badges.ninja/certify-badge/award/<guid>",
  "recipient": { "email": "jane@example.com", "name": "Jane Doe" },
  "badgeName": "Advanced Certification"
}

credential.revoked

json
{ "awardId": "https://api.badges.ninja/certify-badge/award/<guid>", "reason": "Issued in error" }

credential.viewed

json
{
  "awardId": "https://api.badges.ninja/certify-badge/award/<guid>",
  "recipient": { "email": "jane@example.com", "name": "Jane Doe" }
}

Tajuk Permintaan

Setiap pengiriman membawa tajuk-tajuk berikut:

TajukDeskripsi
X-Bws-EventTipe peristiwa (sama dengan type pada isi).
X-Bws-DeliveryId pengiriman (sama dengan id pada isi).
X-Bws-Signaturesha256= diikuti oleh HMAC-SHA256 dari isi permintaan mentah, dengan kunci rahasia endpoint Anda.
User-Agentbadges.ninja-webhooks/1

Memverifikasi Tanda Tangan

Selalu verifikasi tanda tangan sebelum mempercayai suatu pengiriman. Hitung HMAC-SHA256 dari isi permintaan mentah menggunakan rahasia penanda tangan endpoint Anda, lalu bandingkan (dalam waktu konstan) dengan tajuk X-Bws-Signature.

js
import crypto from "node:crypto";

function verify(rawBody, signatureHeader, secret) {
  const expected = "sha256=" +
    crypto.createHmac("sha256", secret).update(rawBody, "utf8").digest("hex");
  const a = Buffer.from(signatureHeader);
  const b = Buffer.from(expected);
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

Gunakan byte persis seperti yang Anda terima — mem-parsing dan menserialisasi ulang JSON terlebih dahulu akan mengubah byte dan merusak tanda tangan.

Percobaan Ulang & Keandalan

  • Suatu pengiriman dianggap berhasil ketika endpoint Anda merespons dengan status 2xx.
  • Pengiriman yang gagal dicoba ulang beberapa kali secara terbatas. Endpoint yang terus gagal mengakumulasi failureCount; setelah 20 kegagalan berturut-turut, sebuah endpoint dinonaktifkan secara otomatis (active: false) dan berhenti menerima pengiriman hingga Anda memperbaikinya dan mendaftarkan endpoint baru.
  • Pengiriman dapat tiba lebih dari sekali. Gunakan id X-Bws-Delivery (atau id pada isi) untuk membuat handler Anda idempoten.
  • Respons dengan cepat (dalam ~10 detik). Lakukan pekerjaan berat secara asinkron setelah memberikan konfirmasi.

Mengelola Webhook di Dasbor

Anda juga dapat mengelola endpoint tanpa API — buka Webhooks di bilah sisi dasbor untuk menambahkan, menampilkan daftar, dan menghapus endpoint serta memilih peristiwa mana yang diterima masing-masing.

badges.ninja Documentation