Dotdigital · AsyncAPI Specification
Dotdigital Webhooks
Version
View Spec
View on GitHub
Marketing AutomationEmail MarketingSMSMMSWhatsAppContactsCampaignsPush NotificationsTransactional EmailEngagementAutomationCPaaSOmnichannelCustomer DataConsent ManagementPersonalizationLoyaltyE-CommerceEventWebhookAsyncAPIEvents
AsyncAPI Specification
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.
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.