Immutable · AsyncAPI Specification
Immutable Webhooks
Version
View Spec
View on GitHub
CompanyGamingBlockchainNFTWeb3WalletsMarketplaceAnalyticsAttributionCustomer Data PlatformAuthenticationDeveloper PlatformAsyncAPIEvents
AsyncAPI Specification
generated: '2026-08-23'
method: searched
source:
- https://docs.immutable.com/docs/products/audience/webhooks
- https://docs.immutable.com/docs/products/indexer/webhooks
asyncapi_published: false
asyncapi_note: >-
Immutable publishes NO AsyncAPI document. Searched the docs host, the llms.txt
OpenAPI Specs section (which lists only the two REST specs), the GitHub org's
35 public repos, and /asyncapi.yaml + /asyncapi.json on every Immutable host —
nothing. The event surface is real and well documented in prose, so this
artifact captures the webhook catalogue instead and apis.yml carries a
`Webhooks` pointer rather than an `AsyncAPI` one. Nothing here is fabricated
into spec form.
event_surfaces:
- name: Audience CDP webhooks
docs: https://docs.immutable.com/docs/products/audience/webhooks
configured_in: Immutable Hub -> Settings -> Webhooks
transport: Signed AWS SNS notification delivered as an HTTP POST to your HTTPS endpoint
content_type: text/plain
content_type_note: >-
SNS delivers with Content-Type text/plain, not application/json — a receiver
must configure a raw text body parser and JSON.parse itself. This trips up
most default JSON middleware.
max_endpoints: 10 per environment
envelope:
fields: [id, type, api_version, created_at, project_id, data]
api_version_example: '2026-05-01'
id_example: evt_11111111-1111-1111-1111-111111111111
events:
- name: audience_joined
fired_when: A player newly enters your project's audience
data: player.id plus linked_accounts[] (provider, provider_account_id, username, linked_at)
- name: audience_account_linked
fired_when: A player links an external account while already in your audience
data: player.id plus linked_account (provider, provider_account_id, username, linked_at)
- name: audience_account_unlinked
fired_when: A player disconnects an external account while already in your audience
data: player.id plus linked_account
providers_enum: [steam, discord, epic_games, x, telegram, tiktok, twitch]
security:
method: AWS SNS RSA message signature
shared_secret: false
custom_header: false
verification: '`sns-validator` npm package, plus a TopicArn equality check'
topic_arn: 'arn:aws:sns:us-east-2:362750628221:webhook-outbound-prod'
note: >-
There is no shared secret and no signature header. Checking `TopicArn`
is what proves the event came from Immutable rather than any other SNS
publisher.
delivery:
retries: 15 attempts, exponential backoff from 5s up to 260s between tries
total_retry_cap: 60 minutes (AWS HTTPS endpoint cap)
dead_letter: held 14 days, then discarded
manual_redelivery: false
manual_redelivery_note: >-
No manual redelivery from Hub. If your endpoint is down longer than the
retry window, those events are lost — an explicit, published data-loss
boundary.
ordering: not guaranteed; sort by envelope `created_at`
duplicates: possible; deduplicate on `id`
unknown_types: log and skip; the catalogue is explicitly an open set
- name: Indexer / blockchain webhooks
docs: https://docs.immutable.com/docs/products/indexer/webhooks
configured_in: Immutable Hub -> Webhooks
transport: HTTP POST to your HTTPS endpoint
envelope:
fields: [event_name, event_id, timestamp, data]
events:
- name: imtbl_zkevm_mint_request_updated
fired_when: A mint request changes status
data: reference_id, status, token_id, transaction_hash, collection_address, owner_address
event_categories:
- mints
- transfers
- orders
- trades
event_category_note: >-
The docs name these four categories but publish a full event-name list for
mint requests only. The remaining event names are not enumerated in public
docs; they are NOT invented here.
security:
method: HMAC-SHA256 over the raw payload
header: x-immutable-signature
secret: per-webhook secret configured in Hub
delivery:
timeout: 30 seconds
retries: 5 attempts — immediate, 1 min, 5 min, 30 min, 2 hours
manual_redelivery: true
manual_redelivery_note: After 5 failed attempts, view and retry in Hub.
duplicates: possible; deduplicate on `event_id`
divergence_warning: >-
The two webhook systems do NOT share an envelope, a signature scheme, a retry
policy or a redelivery capability. Audience uses SNS + RSA + `id` + no manual
redelivery; Indexer uses a direct POST + HMAC in `x-immutable-signature` +
`event_id` + Hub retry. A single receiver cannot handle both with one code
path, and nothing in the docs cross-references the other system. This is the
single largest inconsistency found on Immutable's event surface.
streaming:
websockets: false
server_sent_events: false
note: >-
No streaming API. The only real-time paths are the two webhook systems above
and direct JSON-RPC subscription against the chain RPC endpoints
(rpc.immutable.com / rpc.testnet.immutable.com), which is Ethereum-standard
rather than an Immutable API.
Work with this as data
Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for asyncapi
4 MCP tools reach this
find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/immutable-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.