Campaign Monitor · AsyncAPI Specification

Campaignmonitor Webhooks

Version

View Spec View on GitHub Email MarketingCampaignsSubscribersTransactional EmailSegmentsNewslettersAutomationMarketing AutomationWebhookEmail DeliverabilityMarketingAsyncAPIWebhooksEvents

AsyncAPI Specification

campaignmonitor-webhooks.yml Raw ↑
generated: '2026-08-13'
method: searched
source: https://www.campaignmonitor.com/api/v3-3/webhooks/
description: >-
  Campaign Monitor publishes no AsyncAPI document and no event-streaming surface.
  It does publish a real, dated webhook contract for subscriber-list events,
  managed through the Lists API. This artifact captures that catalog verbatim
  from the provider's webhooks reference. Searched for an AsyncAPI at
  /asyncapi.yaml, /asyncapi.json on both api.createsend.com and
  www.campaignmonitor.com and across the github.com/campaignmonitor
  organization — no result, so no AsyncAPI pointer is claimed.
asyncapi_published: false
event_surface: webhooks
transport: HTTP POST to a subscriber-supplied URL
payload_formats: [json, xml]
payload_format_note: >-
  The format is fixed at webhook-creation time (PayloadFormat property) and
  applies to every delivery for that webhook.
management_api:
  create: POST https://api.createsend.com/api/v3.3/lists/{listid}/webhooks.{xml|json}
  list: GET https://api.createsend.com/api/v3.3/lists/{listid}/webhooks.{xml|json}
  test: GET https://api.createsend.com/api/v3.3/lists/{listid}/webhooks/{webhookid}/test.{xml|json}
  activate: PUT https://api.createsend.com/api/v3.3/lists/{listid}/webhooks/{webhookid}/activate.{xml|json}
  deactivate: PUT https://api.createsend.com/api/v3.3/lists/{listid}/webhooks/{webhookid}/deactivate.{xml|json}
  delete: DELETE https://api.createsend.com/api/v3.3/lists/{listid}/webhooks/{webhookid}.{xml|json}
  docs: https://www.campaignmonitor.com/api/v3-3/lists/
scope: per subscriber list
event_count: 3
events:
  - name: Subscribe
    description: >-
      Someone subscribes to one of your lists. Triggered when subscribers are
      manually entered on the Add Subscribers page, imported from file, moved
      from an inactive state to Active, subscribe via a signup form, or are added
      through the API. For confirmed opt-in lists the event fires when the
      verification link in the confirmation email is clicked.
    payload_fields: [Type, Date, EmailAddress, Name, SignupIPAddress, "CustomFields[]", ListID]
  - name: Update
    description: >-
      A subscriber's details are updated — on the Edit Subscriber page, by
      re-importing an existing subscriber from file, by the subscriber via the
      Preference Center, or by re-adding/updating through the API.
    payload_fields: [Type, Date, OldEmailAddress, EmailAddress, Name, State, "CustomFields[]", ListID]
  - name: Deactivate
    description: A subscriber in your list is de-activated.
    payload_fields: [Type, Date, EmailAddress, Name, State, "CustomFields[]", ListID]
envelope:
  shape: '{"Events": [ {...}, ... ], "ListID": "<list id>"}'
  note: The payload is always an envelope carrying a batch of events plus the ListID, never a single bare event.
delivery:
  batching: true
  max_events_per_request: 1000
  batching_note: >-
    Events are batched into one POST wherever possible. An import of 6,500
    subscribers arrives as a series of POSTs of up to 1,000 subscribe events each.
  retry_policy: >-
    Campaign Monitor does not publish a retry schedule. It does publish the
    failure outcome: sustained errors on a URL for more than a week cause the
    webhook to be automatically deactivated.
  auto_deactivation_after: 7 days of sustained errors
  expected_response: HTTP 2xx
signing:
  supported: false
  header: null
  note: >-
    No signature or shared-secret header is documented. A receiver cannot verify
    that a delivery originated from Campaign Monitor other than by network
    controls or by treating the payload as untrusted and re-reading state from
    the API. This is the single largest gap in the webhook contract.
testing:
  endpoint: GET /lists/{listid}/webhooks/{webhookid}/test.{xml|json}
  note: >-
    Campaign Monitor's own docs point at third-party tools (RequestBin, ngrok)
    for local webhook development; there is no first-party event simulator.
errors:
  - code: 601
    message: Invalid Webhook URL
  - code: 602
    message: Invalid Webhook Format — supported formats are json and xml
  - code: 603
    message: Invalid Webhook Event — at least one supplied event is not valid
  - code: 610
    message: The webhook request has failed (test delivery could not reach the URL)