Skip to main content
    Skip to content
    NorruvaDeveloper Docs
    Sandbox · verified 2026-07-29
    This page
    Whole docs
    Machine formats

    PlaygroundGet API keys
    IntroductionQuickstartAuthenticationErrors & conventionsSandbox & environments
    Entity modelProducts & categoriesPassports & versionsDigital Link & resolutionCompliance & regulationsWebhooks & eventsAutoID print loopImport jobsObservability & audit
    OverviewAuth & API keysProductsCompliance & regulationsPassportsResolver & publicWebhooksPrint jobs & devicesImport / bulkObservabilityBeyond happy path
    Integration playbookWebhook receiver guideRun a print deviceDeviations & gotchas
    EN 18222 API methodsAnnex ZA — ESPR correspondence
    Docs/Concepts/Webhooks & events

    Webhooks & events

    Subscribe to events instead of polling. A Webhook is a tenant-scoped endpoint + subscribed event set + signing secret; a Delivery is a signed, replay-protected, retried attempt to reach it.

    Event catalogue

    Subscribe only to catalogue events (the dispatcher’s WEBHOOK_EVENT_TYPES — nothing else is ever delivered); an unknown name returns 422 UNKNOWN_EVENT_TYPE. The AutoID print-cycle trio closes the print loop event-driven: carrier.generated ("codes ready — pull carriers/export"), then print.confirmed / print.failed fan out the print layer's POST /carriers/print-status reports (one aggregate event per outcome class with the serial list) — full walkthrough in AutoID print loop.

    product.createdproduct.updatedproduct.deleted (reserved)product.published compliance.verified (reserved)compliance.violation_created (reserved)passport.anchored (reserved) scan.recorded (reserved)import.completedimport.failed carrier.generatedprint.confirmedprint.failed

    Types marked reserved are subscribable but do not fire yet — no platform code path emits them today. All other types are live.

    Envelope

    External events use the platform envelope — the WebhookEvent value object (PRD F9). Field names are exactly these; there is no Stripe-style created/livemode/data.object nesting:

    JSON
    { "id": "<uuid>", "type": "product.published",
      "timestamp": "2026-07-20T12:00:00.000Z", "apiVersion": "2024-12-05",
      "data": { /* event-specific fields */ } }

    Delivery contract

    • Signatures: X-Norruva-Signature (V1) plus X-Norruva-Timestamp and X-Norruva-Signature-V2 (timestamped HMAC).
    • Replay window: 5 minutes — a stale timestamp is rejected.
    • Dedup: the delivery id is stable across retries; use it for receiver-side idempotency.
    • Retries: 4xx → no retry; 5xx/timeout → backoff retries. Manual redelivery is available.
    ▲
    One gap to know. There is no local end-to-end receiver harness yet (signing/retry are unit-verified). Secret rotation IS available — POST /webhooks/{id}/rotate-secret with a 24 h overlap window. See the receiver guide.
    Was this page helpful?
    Thanks — noted.Feedback goes to the docs team by email.
    ← PreviousCompliance & regulationsNext →AutoID print loop
    On this page
    Event catalogueEnvelopeDelivery contract
    Norruva DPP API · sandbox developer docsGenerated 2026-07-29 · PRD-aligned (TSC roadmap rev 2) · statuses reflect E2E-verified sandbox behaviour — not marketing