events permission and one ACTIVE PULL subscription.
End to end
1
Create a PULL subscription
POST /api/v0/webhooks/subscriptions with "deliveryMode": "PULL" and no target. It never delivers anything — it carries the eventFilter and schemaVersion this feed reads. One live PULL subscription per partner. See Create a PULL subscription.2
Poll this endpoint
Send your API key and secret, optionally with
types and limit.3
Read the page
Take
data.events — oldest first — and data.nextCursor.4
Paginate
Call again with
?after=<nextCursor> until nextCursor is null. A short page that still carries a cursor is normal, so keep going.5
Checkpoint and deduplicate
Persist the cursor, and deduplicate on
eventId. Pull responses are not signed.Query parameters
string
Narrows your subscription’s filter. Repeatable. It cannot widen the filter beyond what the subscription allows.
string
Pagination cursor.
integer
default:"25"
Page size, maximum 100.
data.events[] oldest first, data.count, and data.nextCursor.
Same projection as PUSH. The feed renders through the exact projection PUSH signs, with every leaf value as a string, so what you poll reconciles with what a PUSH delivery would have contained.
Status codes
Status codes
200 · 400 bad limit, missing events permission, or INVALID_CURSOR · 401 authentication · 404 no active PULL subscription · 503 directory unavailable