Dotdigital · AsyncAPI Specification

Dotdigital Webhooks

Version

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

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.