Skip to main content
A registration sits pending until a trader acts on it, and nothing on your side knows when that happens unless you ask. Two webhook events answer it as it happens: registration.linked and registration.revoked. This guide is about those two events only. The endpoint, the signature, the retries, and the delivery log are the same for every event type and live in Receive events — wire that first, then come back here.
1

Subscribe to the two registration events

Create a webhook with an events filter when a system only cares about onboarding. An omitted or empty events list receives everything, including event types added later.
Five endpoints per firm, so an onboarding service and a billing service can each hold their own filter rather than sharing one handler.
2

Read the payload

Every delivery is a POST with the same envelope: a type, a createdAt, and a data object. For these two, data names the registration, the trader’s email, and the account number — exactly the three things you sent when you created it, so your own record is findable without a lookup table.
There is no event for a registration expiring. A pending registration that nobody links reaches its expiresAt silently, so expiry is something you notice on the list, not something that arrives.
3

Make the handler idempotent

A non-2xx answer — including a timeout — is retried with backoff for about nine hours in total, so your endpoint may see the same event twice. Key your processing on the delivery id from the log, or on registrationId in the payload. Either is stable; the arrival is not.
4

Reconcile against the list route

List your registrations is the settling read. It returns every registration your firm has made, newest first, with its current status and linkedAt, and it is computed from the same records the events are emitted from.
Run it on a schedule and diff it against your own table. Anything your table calls pending that the list calls linked is a delivery you dropped; anything the list calls expired is a trader who never arrived.

When your records and ours disagree

Work down this order — each step is cheaper than the one after it.
  1. The list route. It is the source of truth for status. If it says linked, the handoff happened, whatever your table says.
  2. The delivery log. Every attempt for one endpoint, newest first, each row carrying the exact payload we sent — so an event your receiver dropped can be replayed from here rather than lost. pending means the delivery is still inside its retry schedule; failed means the schedule was exhausted and we stopped.
  3. A test delivery. A signed ping, right now, reporting exactly what your endpoint answered. It separates a broken delivery from a handler that is refusing.
Terminal delivery rows age out after 60 days; a pending row is never swept. If you delete an endpoint, its delivery log goes with it — read anything you still need first.

Where to go deeper