A subscription is the core resource in Off the Hook. It ties together a destination URL, the event types you want to receive, and the address filters that tell the service which on-chain activity matters to you. When a transfer matches one of your watched addresses, Off the Hook constructs a signed webhook payload and delivers it to your destination. No subscription means no deliveries — everything flows from this single resource.Documentation Index
Fetch the complete documentation index at: https://docs.offthehook.dev/llms.txt
Use this file to discover all available pages before exploring further.
Key fields
Unique identifier for the subscription, prefixed
sub_. Use this ID in all subsequent API calls that reference the subscription.Where Off the Hook sends webhook deliveries.
The event kinds this subscription delivers. You must provide at least one. Example:
["wallet.transfer.broadcasted"]. See event types for the full list.The blockchain addresses this subscription watches. Each entry pairs a
chainId with an address. If this list is empty, no webhooks fire — Off the Hook has nothing to match against.Present and
true when the subscription has more than 200 watched addresses. Paginate the full list using GET /v1/subscriptions/:id/filters/addresses."enabled" or "disabled". Disabled subscriptions do not receive any deliveries. Use this to pause monitoring without deleting your subscription.An optional free-text label for your own reference. It has no effect on matching or delivery.
ISO 8601 timestamp of when the subscription was created.
ISO 8601 timestamp of the most recent update to the subscription or its address filters.
Example subscription
The
destination.secret field only appears in the response to POST /v1/subscriptions and POST /v1/subscriptions/:id/secrets/rotate. Copy it before leaving the page — there is no way to retrieve it again.Address filters
Each entry infilters.addresses is scoped to a specific chain. The same base58check address on tron:mainnet and tron:nile are tracked independently — you need a separate entry for each chain you want to monitor.
When you fetch a subscription with GET /v1/subscriptions/:id, the response inlines up to 200 addresses directly in the filters.addresses array. If you have more than 200, the response includes "hasMore": true and you retrieve the rest by paginating GET /v1/subscriptions/:id/filters/addresses using the nextPageToken cursor.
Idempotency
POST /v1/subscriptions accepts an Idempotency-Key header. If you send the same key twice, Off the Hook returns the original response without creating a duplicate subscription. This is useful when a network timeout leaves you uncertain whether the first request succeeded.
Next steps
- Create a subscription — full API reference with all request parameters
- Webhook events and payload structure — understand what your endpoint receives