Skip to main content
A subscription records where your events go and which ones you want. Every endpoint on this page requires the webhooks permission and is scoped to your partner account.
The signing secret is returned on exactly two endpoints — create and rotate — and only once each. Store it when you receive it.

The subscription object

uuid
Subscription id.
enum
PUSH (default) or PULL. See delivery modes.
string | null
Your HTTPS receiver URL. Present for PUSH, null for PULL.
string[]
The types you receive. ["*"] means all of them.
string
Version of the delivered payload. Defaults to "1.0".
enum
ACTIVE, PAUSED, SUSPENDED, or DELETED.
string
A non-sensitive fingerprint of the signing secret.
string
The plaintext signing secret. Returned only on create and rotate.
date-time
When the subscription was created.

Create a subscription

Registers a subscription — PUSH by default, or PULL — and returns your signing secret once.

Body

enum
default:"PUSH"
PUSH or PULL. See delivery modes.
string
required
Required for PUSH; ignored for PULL, where it is stored as null. Must be an absolute https:// URL on a public host, using an allowed port, with no embedded credentials. Maximum 512 characters.
string[]
default:"[\"*\"]"
The event types to receive.
string
default:"1.0"
Payload version to deliver.
Store the secret now. webhook_secret is shown only in this response. If you lose it, your only option is to rotate.

Create a PULL subscription

Omit target and set "deliveryMode": "PULL". A PULL subscription never delivers anything — it authorizes and configures the event feed, carrying the eventFilter and schemaVersion that feed reads. You may have one live PULL subscription per partner, and it requires the events permission. A signing secret is still returned: PULL responses are unsigned, but rotation and the secret hint stay consistent across both modes.
201 created · 400 invalid or blocked target, target missing for PUSH, or missing permission · 409 duplicate target, active cap of 5 reached, or a live PULL subscription already exists · 422 SQS or SSE requested · 401 / 503 authentication

List subscriptions

Returns all your non-deleted subscriptions, newest first, as data.subscriptions[] with data.totalCount. Never includes webhook_secret. There is no pagination — you get everything.
200 · 400 missing permission · 401 / 503 authentication

Get a subscription

Fetches one subscription by its UUID.
200 · 404 not found, not yours, or deleted · 400 non-UUID id or missing permission · 401 / 503 authentication

Update a subscription

A partial update: a null or omitted field is left unchanged. You can change the status and the event filter.

Body

enum
PAUSED holds events, ACTIVE resumes delivery, DELETED soft-deletes. SUSPENDED is rejected with a 400 — only Endl sets it.
string[]
Replaces the current filter. An empty list resets it to ["*"].
The target URL is immutable. A request that includes target is rejected. To send events somewhere else, delete the subscription and create a new one, which issues a fresh signing secret. This is deliberate: it stops a compromised key from silently repointing a live, signed event stream at an attacker.
200 · 400 SUSPENDED requested, target supplied, or missing permission · 404 not found · 409 resuming would exceed the active cap · 401 / 503 authentication

Rotate the signing secret

Issues a new signing secret and returns it once. This is the only endpoint besides create that returns webhook_secret.
Endl signs with the new secret immediately — there is no overlap window. Accept both the old and the new secret in your verifier until every instance has rolled over. See replay and rotation.
200 rotated · 404 not found · 400 missing permission · 401 / 503 authentication

Delete a subscription

Soft-deletes the subscription. It returns 200 with status: "DELETED", not an empty 204. In-flight deliveries are cancelled, delivery history is kept, and the URL can be registered again later.
200 · 404 not found or already deleted · 400 missing permission · 401 / 503 authentication

Send an event to a subscription

Manually sends an already-recorded event to this subscription. This is useful for a subscription that did not exist when the event first occurred. It queues a delivery rather than sending synchronously, and returns a deliveryId you can follow in Deliveries.

Body

string
required
The event id — the value delivered as X-WEBHOOK-EVENT-ID. Maximum 64 characters.
A 200 here means the delivery was queued, not received. Track the returned deliveryId to find out what actually happened.
200 queued · 400 bad eventId, a PULL subscription, a send rate limit, or missing permission · 404 subscription or event not found · 409 conflicting delivery · 401 / 503 authentication