Skip to content

Webhooks-API

Webhooks stellen je applicatie in realtime op de hoogte wanneer er iets met je credentials gebeurt — wanneer er een wordt uitgegeven, afgeleverd, ingetrokken of bekeken. In plaats van de API te pollen, registreer je een HTTPS-endpoint en stuurt badges.ninja het een ondertekende POST voor elke gebeurtenis waarop je je abonneert.

Alle beheerendpoints vereisen authenticatie via de X-Api-Key-header. Zie Authenticatie. Het aanmaken of verwijderen van endpoints vereist een sleutel met write-scope; het opsommen vereist read. Zie API-sleutels.

Een endpoint registreren

POST /webhooks

Parameters

ParameterTypeVerplichtBeschrijving
urlstringJaJe HTTPS-endpoint. Moet met https:// beginnen.
eventsstring[]NeeGebeurtenistypen om je op te abonneren. Laat weg of geef ["*"] door om alle gebeurtenissen te ontvangen.

Voorbeeld

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"]
  }'

Antwoord

201 Created. Het ondertekeningsgeheim wordt slechts één keer teruggegeven — bewaar het nu; je kunt het niet opnieuw ophalen.

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

Endpoints opsommen

GET /webhooks

Geeft je geregistreerde endpoints terug. Ondertekeningsgeheimen worden nooit meegestuurd.

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
    }
  ]
}

Een endpoint verwijderen

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"

Afleveringen naar het endpoint stoppen onmiddellijk.

Gebeurtenistypen

GebeurtenisWordt geactiveerd wanneer…
credential.issuedEen credential aan een ontvanger wordt uitgegeven.
credential.deliveredDe notificatie-e-mail van een credential naar de ontvanger wordt verzonden (afzonderlijk of in bulk).
credential.revokedEen credential wordt ingetrokken.
credential.viewedDe openbare credentialpagina van een ontvanger voor de eerste keer wordt bekeken.

Afleveringspayload

Elke aflevering is een POST met een JSON-body van deze vorm:

json
{
  "id": "b1c2d3e4-...",
  "type": "credential.issued",
  "createdAt": 1787685415083,
  "data": { }
}
VeldBeschrijving
idUnieke afleverings-id (gebruik deze om te dedupliceren).
typeHet gebeurtenistype.
createdAtTijdstempel van de gebeurtenis (epoch-milliseconden).
dataGebeurtenisspecifieke payload (zie hieronder).

data per gebeurtenistype

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" }
}

Request-headers

Elke aflevering draagt deze headers:

HeaderBeschrijving
X-Bws-EventHet gebeurtenistype (hetzelfde als type in de body).
X-Bws-DeliveryDe afleverings-id (hetzelfde als id in de body).
X-Bws-Signaturesha256= gevolgd door de HMAC-SHA256 van de ruwe request-body, met het geheim van je endpoint als sleutel.
User-Agentbadges.ninja-webhooks/1

Handtekeningen verifiëren

Verifieer altijd de handtekening voordat je een aflevering vertrouwt. Bereken de HMAC-SHA256 van de ruwe request-body met het ondertekeningsgeheim van je endpoint en vergelijk deze (in constante tijd) met de X-Bws-Signature-header.

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

Gebruik exact de bytes die je hebt ontvangen — de JSON eerst parsen en opnieuw serialiseren verandert de bytes en breekt de handtekening.

Nieuwe pogingen & betrouwbaarheid

  • Een aflevering wordt als geslaagd beschouwd wanneer je endpoint met een 2xx-status antwoordt.
  • Mislukte afleveringen worden een klein aantal keren opnieuw geprobeerd. Endpoints die blijven falen, bouwen een failureCount op; na 20 opeenvolgende mislukkingen wordt een endpoint automatisch uitgeschakeld (active: false) en ontvangt het geen afleveringen meer totdat je het herstelt en een nieuw endpoint registreert.
  • Afleveringen kunnen meer dan één keer aankomen. Gebruik de X-Bws-Delivery-id (of de id in de body) om je handler idempotent te maken.
  • Antwoord snel (binnen ~10 seconden). Doe zwaar werk asynchroon nadat je de ontvangst hebt bevestigd.

Webhooks beheren in het dashboard

Je kunt endpoints ook zonder de API beheren — open Webhooks in de zijbalk van het dashboard om endpoints toe te voegen, op te sommen en te verwijderen en te kiezen welke gebeurtenissen elk endpoint ontvangt.

badges.ninja Documentation