Skip to main content
Everything that happens to your applications and your account is an event. Each one is written to your event log, and delivered to your webhook when you subscribed to it. The log is readable as a feed, so your backend can poll it instead of running a webhook, or catch up after an outage without losing anything.

The events

Every service.* event carries service_id and application_id (the same value; service_id is the legacy name) and your external_id. And, opt-in because they come one per code or message, the events a client application would get on its own webhook, with your external_id added to the data:

Subscriptions

By default every service.* event and balance.low reach your webhook; the verification and message events do not until you opt in. Change the set in the partner console under Integration, or with PUT /v1/partner/webhook:
An empty list delivers nothing; null resets the default set. GET /v1/partner/webhook shows the current set beside default_events and available_events. A subscription changes delivery only: lifecycle and balance events are written to the log whatever you subscribed to, while the opt-in events are written only when subscribed, since they are readable through the logs anyway.
Endpoints that existed before subscriptions did keep receiving exactly the seven events they always received (service.approved, service.rejected, service.suspended, service.paused, service.owner_accepted, service.owner_revoked, balance.low) until you opt in to more. Nothing new reaches an existing integration on its own.

The feed

GET /v1/partner/events lists the log oldest first, up to 100 rows a page, each with the event, your external_id, the data the webhook would carry, and the delivery it produced when there was one.
  • Resume with the cursor. next_cursor points after the last row you received, whether or not more rows exist now; keep it and pass it back as cursor on the next call. has_more says whether a page is waiting right now. An empty page answers null, so keep the cursor you had.
  • Start from a time. since takes an ISO 8601 date or datetime for the first call, when you have no cursor yet.
  • Filter with event (one event name) and application (your external_id).
  • Two seconds behind. Rows younger than two seconds are held back, so a cursor you save never skips a row whose sequence was taken earlier but committed later.
  • At least once. Treat the feed like the webhook: dedupe by the event id.
  • Ninety days. Events and finished deliveries older than 90 days are pruned.
The feed and the webhook carry the same events with the same data; a webhook delivery’s event header is the same name. Read the deliveries when you want to know whether a specific webhook call succeeded.