Immutable · AsyncAPI Specification

Immutable Webhooks

Version

View Spec View on GitHub CompanyGamingBlockchainNFTWeb3WalletsMarketplaceAnalyticsAttributionCustomer Data PlatformAuthenticationDeveloper PlatformAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
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.
All 92 tools

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 email required.

A second provider on the same verified email joins the account you already have.