Skip to content

API de Webhooks

Els webhooks notifiquen la teva aplicació en temps real quan passa alguna cosa amb les teves credencials: quan se n'emet, se'n lliura, se'n revoca o se'n visualitza una. En lloc de sondejar l'API, registres un endpoint HTTPS i badges.ninja li envia un POST signat per cada esdeveniment al qual et subscrius.

Tots els endpoints de gestió requereixen autenticació mitjançant la capçalera X-Api-Key. Consulta Autenticació. Crear o esborrar endpoints requereix una clau amb àmbit d'escriptura; llistar requereix lectura. Consulta Claus API.

Registrar un endpoint

POST /webhooks

Paràmetres

ParàmetreTipusObligatoriDescripció
urlstringEl teu endpoint HTTPS. Ha de començar per https://.
eventsstring[]NoTipus d'esdeveniment als quals subscriure's. Omet-lo o passa ["*"] per rebre tots els esdeveniments.

Exemple

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

Resposta

201 Created. El secret de signatura es retorna només una vegada: desa'l ara; no el podràs recuperar de nou.

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

Llistar endpoints

GET /webhooks

Retorna els teus endpoints registrats. Els secrets de signatura mai s'hi inclouen.

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

Esborrar un 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"

Els lliuraments a l'endpoint s'aturen immediatament.

Tipus d'esdeveniment

EsdevenimentEs dispara quan…
credential.issuedS'emet una credencial a un destinatari.
credential.deliveredS'envia al destinatari el correu de notificació d'una credencial (individual o massiu).
credential.revokedEs revoca una credencial.
credential.viewedEs visualitza per primera vegada la pàgina pública de la credencial d'un destinatari.

Cos del lliurament (payload)

Cada lliurament és un POST amb un cos JSON amb aquesta forma:

json
{
  "id": "b1c2d3e4-...",
  "type": "credential.issued",
  "createdAt": 1787685415083,
  "data": { }
}
CampDescripció
idId únic del lliurament (fes-lo servir per eliminar duplicats).
typeEl tipus d'esdeveniment.
createdAtMarca de temps de l'esdeveniment (mil·lisegons epoch).
dataPayload específic de l'esdeveniment (vegeu més avall).

data per tipus d'esdeveniment

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

Capçaleres de la sol·licitud

Cada lliurament porta aquestes capçaleres:

CapçaleraDescripció
X-Bws-EventEl tipus d'esdeveniment (igual que type al cos).
X-Bws-DeliveryL'id del lliurament (igual que id al cos).
X-Bws-Signaturesha256= seguit de l'HMAC-SHA256 del cos brut de la sol·licitud, amb clau el secret del teu endpoint.
User-Agentbadges.ninja-webhooks/1

Verificar signatures

Verifica sempre la signatura abans de confiar en un lliurament. Calcula l'HMAC-SHA256 del cos brut de la sol·licitud fent servir el secret de signatura del teu endpoint i compara'l (en temps constant) amb la capçalera 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);
}

Fes servir exactament els bytes que has rebut: analitzar i tornar a serialitzar el JSON abans canviarà els bytes i trencarà la signatura.

Reintents i fiabilitat

  • Un lliurament es considera correcte quan el teu endpoint respon amb un estat 2xx.
  • Els lliuraments fallits es reintenten un nombre reduït de vegades. Els endpoints que continuen fallant acumulen un failureCount; després de 20 fallades consecutives, un endpoint es desactiva automàticament (active: false) i deixa de rebre lliuraments fins que el corregeixis i registris un endpoint nou.
  • Els lliuraments poden arribar més d'una vegada. Fes servir l'id X-Bws-Delivery (o l'id del cos) per fer que el teu gestor sigui idempotent.
  • Respon amb rapidesa (en uns ~10 segons). Fes la feina pesant de manera asíncrona després de confirmar-ne la recepció.

Gestionar webhooks al tauler

També pots gestionar els endpoints sense l'API: obre Webhooks a la barra lateral del tauler per afegir, llistar i esborrar endpoints i triar quins esdeveniments rep cadascun.

badges.ninja Documentation