Dotdigital · AsyncAPI Specification

Dotdigital Webhooks

Version

View Spec View on GitHub Marketing AutomationEmail MarketingSMSMMSWhatsAppContactsCampaignsPush NotificationsTransactional EmailEngagementAutomationCPaaSOmnichannelCustomer DataConsent ManagementPersonalizationLoyaltyE-CommerceEventWebhookAsyncAPIEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-13'
method: searched
source: >-
  https://marketing.developer.dotdigital.com/reference/webhooks,
  https://marketing.developer.dotdigital.com/reference/message-events,
  https://marketing.developer.dotdigital.com/reference/profile-events,
  https://marketing.developer.dotdigital.com/reference/chat-events,
  openapi/dotdigital-webhook-openapi.yml, openapi/dotdigital-events-openapi.yml,
  openapi/dotdigital-data-firehose-openapi.yml
spec_type: none
asyncapi_published: false
description: >-
  Dotdigital has a substantial, well-documented event surface across three distinct mechanisms —
  outbound webhooks (CPaaS), an Events in/out API with durable subscriptions, and Data Firehose
  batch streaming to cloud storage — but publishes NO AsyncAPI document for any of them. This
  artifact captures the webhook contract so the event surface is machine-readable somewhere.
  Probes for /asyncapi.yaml and /asyncapi.json on the developer and API hosts returned 404.
mechanisms:
  - name: Webhooks
    kind: push
    management_api: openapi/dotdigital-webhook-openapi.yml
    docs: https://marketing.developer.dotdigital.com/reference/webhooks
    discovery_operations:
      - 'GET /cpaas/webhooks/availableevents  — retrieves the available webhook event types'
      - 'GET /cpaas/webhooks/availabletemplates — retrieves the event payload templates'
    note: >-
      The authoritative event-type list is served by the API itself (availableevents), which is
      account-scoped and therefore requires credentials to enumerate. The event families below
      are read from the public documentation.
  - name: Events API (in/out)
    kind: pull with durable subscription
    management_api: openapi/dotdigital-events-openapi.yml
    docs: https://marketing.developer.dotdigital.com/reference/events-overview
    note: >-
      Create a subscription with filters (filters are ANDed; repeat the event type to OR), then
      poll exportEvents with a checkPoint cursor. A subscription not read within 30 days is
      automatically set inactive. Large payload fields are fetched separately via retrieveLob.
  - name: Data Firehose
    kind: batch stream to cloud storage
    management_api: openapi/dotdigital-data-firehose-openapi.yml
    docs: https://marketing.developer.dotdigital.com/docs/dotdigital-data-firehose-developer-reference
    targets: [Amazon S3, Azure Blob Storage, FTPS, SFTP, Google Cloud Storage]
    status: private preview
    note: The spec's own description says it is in private preview and should not be used.
transport:
  protocol: HTTPS POST to a caller-supplied URL
  content_type: application/json
  batching:
    supported: true
    recommended: true
    max_events_per_batch: 500
    min_events_per_batch: 1
    batch_timeout_seconds: {min: 1, max: 60}
    shape: JSON array of envelopes
  receiver_response_contract:
    - {status: '200/201/2xx', meaning: Data accepted}
    - {status: 400, meaning: Could not process the data sent — this will NOT be retried}
    - {status: 401, meaning: Sender authentication failed or HMAC not valid}
    - {status: other, meaning: Failed to accept — will be retried}
  receiver_timeout_seconds: 10
security:
  signing: HMAC
  algorithm: SHA-1
  header: X-Comapi-Signature
  encoding: hex (NOT base64 — the docs call this out explicitly)
  computed_over: the raw HTTP body, UTF-8
  secret: caller-configured on the webhook registration
  secret_guidance: at least 16 characters, 36 or more recommended
  note: >-
    A mismatch must be answered with HTTP 401. The header name retains the `Comapi` prefix from
    the acquired platform, which is a discoverability trap for anyone searching for
    "X-Dotdigital-Signature".
delivery:
  retry: exponential-ish fixed backoff schedule
  max_retry_window_hours: 24
  drop_after_window: true
  schedule_seconds: [5, 10, 30, 60, 120, 300, 600, 900, 1800, 3600, 7200, 14400, 14400, 14400, 14400, 14400]
envelope:
  fields:
    - {name: eventId, type: string, required: true, description: Unique identifier for this event}
    - {name: accountId, type: integer, required: true, description: The account the event belongs to}
    - {name: apiSpaceId, type: string, required: true, description: The API Space the event came from}
    - {name: name, type: string, required: true, description: The event type name, e.g. message.sent}
    - {name: payload, type: object, required: true, description: Event-type-specific body}
    - {name: revision, type: integer, required: true, description: Increments with each event for the entity}
    - {name: etag, type: string, required: true, description: HTTP ETag entity hash for change detection}
    - {name: timestamp, type: string, format: date-time, required: true, description: UTC ISO 8601 time the event occurred}
  routing_field: name
  note: One registration can carry many event types; dispatch on `name`.
event_families:
  - family: message
    docs: https://marketing.developer.dotdigital.com/reference/message-events
    events:
      - {name: message.sent, description: Message has been sent on the channel}
      - {name: message.sentRequest, description: Send request accepted for the channel}
      - {name: message.delivered, description: Message delivered}
      - {name: message.read, description: Message read/opened, on channels that support it}
      - {name: message.expired, description: Not delivered within expiresOn or the channel default window}
      - {name: message.failed, description: Message failed to be delivered}
  - family: interaction
    events:
      - {name: interaction.click, description: 'Trackable link clicked; supported on transactional email links and shortened SMS links'}
  - family: profile
    docs: https://marketing.developer.dotdigital.com/reference/profile-events
    scope: Omnichannel API profiles (not Marketing contacts)
    events:
      - {name: profile.create}
      - {name: profile.update}
      - {name: profile.delete}
      - {name: profile.undelete}
      - {name: profile.devicesUpdated, description: Devices associated with a profile changed}
  - family: chat
    docs: https://marketing.developer.dotdigital.com/reference/chat-events
    events:
      - {name: chat.create}
      - {name: chat.channelUpdated, description: Chat switched channel, e.g. web chat to email}
      - {name: chat.closed}
      - {name: chat.delete}
  - family: app-messaging conversation
    docs: https://marketing.developer.dotdigital.com/reference/app-messaging-conversation-events
  - family: app-messaging message
    docs: https://marketing.developer.dotdigital.com/reference/app-messaging-message-events
  - family: app-messaging session
    docs: https://marketing.developer.dotdigital.com/reference/app-messaging-session-events
  - family: chat message
    docs: https://marketing.developer.dotdigital.com/reference/chat-message-events
  - family: chat presence
    docs: https://marketing.developer.dotdigital.com/reference/chat-presence-events
  - family: facebook
    docs: https://marketing.developer.dotdigital.com/reference/facebook-events
correlation:
  mechanism: metadata echo
  note: >-
    Values passed in the `metadata` facility on a send are included on the resulting webhook
    events; the docs recommend this for reconciling receipts back to sends.
gaps:
  - No AsyncAPI (or CloudEvents) document for any of the three mechanisms.
  - >-
    HMAC-SHA1 is the only signing option; SHA-256 is not offered, and the signature is not
    timestamped, so replay protection is left to the receiver.
  - >-
    The complete event-type list is only obtainable from an authenticated call to
    GET /cpaas/webhooks/availableevents; there is no public enumeration.

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/dotdigital-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.