developers  · docsKonto
Hent tokenet ditt
Docs · Webhooks

Webhooks

Oppdatert Aug 2026 · API v3

Registrer et HTTPS-endepunkt, så kaller pon deg når noe skjer — ingen polling-løkke, ingen bortkastede requests. Administrer webhooks på my.pon.app → Webhooks eller via API-et.

Topics

Topic Utløses når
list.changed Noe som helst ved en liste ble endret (grovkornet, koalesert — standarden)
item.added En vare havnet på en liste
item.removed En vare ble slettet
item.checked En vare ble huket av under handleturen (å fjerne avhukingen utløser bare list.changed)
list.members.changed Noen ble med i eller forlot en liste

Abonner på det du faktisk trenger. Et valgfritt listIds-filter (opptil 50, kun dine egne lister — ukjente id-er svarer 400 med invalidListIds) avgrenser leveransene til bestemte lister.

Registrer

POST /v3/webhooks

curl -X POST https://api.pon.app/v3/webhooks \
  -H "Authorization: Bearer pon_pat_XXXX" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://hooks.example.com/pon",
        "events": ["item.checked"],
        "listIds": ["LIST_ID"] }'

Svaret inneholder signeringshemmeligheten din (whsec_…) — vist én gang. Registrerer du samme URL på nytt, oppdateres abonnementet og hemmeligheten beholdes. Opptil 5 webhooks per konto.

Registreringen pinger URL-en din umiddelbart.

pon sender et signert ping-event og forventer 2xx — svar på det før du sjekker signaturen (hemmeligheten kommer først i svaret). En død URL avvises med 422 WEBHOOK_UNREACHABLE.

Leveranser

Hver leveranse er en POST med headerne PON-Event: <topic> og PON-Signature: sha256=<hmac>:

{ "event": "item.checked", "listId": "6led…", "cursor": 123, "at": "2026-08-09T19:00:00.000Z" }

Leveranser er best-effort uten retries — er endepunktet ditt nede, tar neste event (eller en fetch fra din side) deg à jour. Redirects følges ikke. Flere matchende endringer i én skriving koaleseres til én leveranse per abonnert topic.

Verifiser signaturen

Beregn en HMAC-SHA256 over den rå request-bodyen med hemmeligheten din og sammenlign den — i konstant tid — med headeren:

import { createHmac, timingSafeEqual } from "node:crypto";

function verify(rawBody, header, secret) {
  const expected = "sha256=" +
    createHmac("sha256", secret).update(rawBody).digest("hex");
  return (
    header.length === expected.length &&
    timingSafeEqual(Buffer.from(header), Buffer.from(expected))
  );
}
import hashlib, hmac

def verify(raw_body: bytes, header: str, secret: str) -> bool:
    expected = "sha256=" + hmac.new(
        secret.encode(), raw_body, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(header, expected)

Circuit breaker

En 2xx kvitterer for en leveranse. Etter 20 feil på rad (alt annet, inkludert timeouts) pauser webhooken seg selv (status: paused, pausedReason: auto_failures). Fiks endepunktet ditt, og reaktiver så på my.pon.app eller via PATCH /v3/webhooks/{id} med { "status": "active" } — reaktivering nullstiller telleren. Et manuelt test-ping er POST /v3/webhooks/{id}/pings (teller aldri som feil).

Webhooks slår polling — alltid.

En polling-løkke på 5 minutter gjør ~8 600 requests i måneden og regnes som tung bruk på fair-use-måleren. En webhook gjør nøyaktig så mange som listene dine endres.