Mailchimp · AsyncAPI Specification

Mailchimp Marketing Webhooks

Version 1.0.0

AsyncAPI description of Mailchimp Marketing audience webhooks. Mailchimp delivers list/audience events to a customer-configured callback URL via HTTP POST with an `application/x-www-form-urlencoded` body. The shared envelope is `type`, `fired_at`, and `data[...]`. Six event types are supported: `subscribe`, `unsubscribe`, `profile`, `cleaned`, `upemail`, and `campaign`. Source documentation: * Guide: https://mailchimp.com/developer/marketing/guides/sync-audience-data-webhooks/ * API Reference (events + sources flags): https://mailchimp.com/developer/marketing/api/list-webhooks/ Notes / fidelity: * The full form-urlencoded payload field set is documented by Mailchimp only for `subscribe` and `unsubscribe` in the cited guide. Those two operations carry strongly-typed payload schemas below. * For `profile`, `cleaned`, `upemail`, and `campaign`, Mailchimp's published OpenAPI confirms the event names, titles, and trigger semantics but does not enumerate the form field names of the POST body. Those operations therefore use the documented envelope (`type`, `fired_at`, `data`) where `data` is an open object. Do not treat the open object as authoritative for individual field names.

View Spec View on GitHub CampaignsEmail MarketingMarketing AutomationNewslettersTransactional EmailAudience ManagementSMSE-CommerceWebhookMarketing AnalyticsAsyncAPIWebhooksEvents

Channels

/
publish receiveAudienceWebhookEvent
Receive Mailchimp audience webhook events.
The single callback path the consumer registered with Mailchimp. All six event types are delivered to this same URL; subscribers discriminate on the `type` form field.

Messages

Subscribe
List Subscribe
A new subscriber was added to a list.
Unsubscribe
List Unsubscribe
A list member unsubscribed or was removed.
Profile
Subscriber Profile Updated
A subscriber's profile was updated.
Cleaned
Email Cleaned From List
A subscriber's email address was cleaned from the list.
Upemail
Subscriber Email Address Updated
A subscriber's email address was changed.
Campaign
Campaign Sending Status
A campaign was sent or cancelled.

Servers

https
consumer {callbackHost}
The HTTPS endpoint the Mailchimp account holder registers via `POST /lists/{list_id}/webhooks` as the callback URL. Mailchimp strongly recommends HTTPS and a hard-to-guess secret in the path.

AsyncAPI Specification

Raw ↑
asyncapi: '2.6.0'
info:
  title: Mailchimp Marketing Webhooks
  version: '1.0.0'
  description: >-
    AsyncAPI description of Mailchimp Marketing audience webhooks. Mailchimp
    delivers list/audience events to a customer-configured callback URL via
    HTTP POST with an `application/x-www-form-urlencoded` body. The shared
    envelope is `type`, `fired_at`, and `data[...]`. Six event types are
    supported: `subscribe`, `unsubscribe`, `profile`, `cleaned`, `upemail`,
    and `campaign`.


    Source documentation:

      * Guide: https://mailchimp.com/developer/marketing/guides/sync-audience-data-webhooks/
      * API Reference (events + sources flags): https://mailchimp.com/developer/marketing/api/list-webhooks/

    Notes / fidelity:

      * The full form-urlencoded payload field set is documented by Mailchimp
        only for `subscribe` and `unsubscribe` in the cited guide. Those two
        operations carry strongly-typed payload schemas below.
      * For `profile`, `cleaned`, `upemail`, and `campaign`, Mailchimp's
        published OpenAPI confirms the event names, titles, and trigger
        semantics but does not enumerate the form field names of the POST
        body. Those operations therefore use the documented envelope
        (`type`, `fired_at`, `data`) where `data` is an open object. Do not
        treat the open object as authoritative for individual field names.
  contact:
    name: Mailchimp Developer
    url: https://mailchimp.com/developer/marketing/
  license:
    name: Mailchimp API Use Policy
    url: https://mailchimp.com/legal/api_use/

defaultContentType: application/x-www-form-urlencoded

servers:
  consumer:
    url: '{callbackHost}'
    protocol: https
    description: >-
      The HTTPS endpoint the Mailchimp account holder registers via
      `POST /lists/{list_id}/webhooks` as the callback URL. Mailchimp
      strongly recommends HTTPS and a hard-to-guess secret in the path.
    variables:
      callbackHost:
        default: example.com
        description: Hostname (and optional secret path prefix) the consumer exposes.

channels:
  /:
    description: >-
      The single callback path the consumer registered with Mailchimp. All
      six event types are delivered to this same URL; subscribers
      discriminate on the `type` form field.
    bindings:
      http:
        bindingVersion: '0.3.0'
        type: request
        method: POST
    x-signature:
      # Added 2026-08-13 from
      # https://mailchimp.com/developer/marketing/guides/sync-audience-data-webhooks/
      # (HTTP 200). Optional HMAC signing, enabled per webhook.
      header: X-Mailchimp-Signature
      format: 't={unix_seconds},v1={hex_sha256}'
      algorithm: HMAC-SHA256
      signed_string: '{timestamp}.{raw_body}'
      key: >-
        The webhook signing_secret, returned exactly once in the create response
        (POST /lists/{list_id}/webhooks) and not retrievable afterwards.
      tolerance_seconds: 300
      comparison: constant-time
      required: false
      note: >-
        Verify against the raw, unmodified request bytes — URL-decoding or JSON
        parsing before verification changes the bytes and breaks the digest.
    publish:
      operationId: receiveAudienceWebhookEvent
      summary: Receive Mailchimp audience webhook events.
      description: >-
        Mailchimp POSTs an `application/x-www-form-urlencoded` body to the
        registered URL. If the URL is unavailable or takes more than 10
        seconds to respond, the request is canceled and retried over a
        roughly 75 minute window. When HMAC signing is enabled on the webhook,
        each delivery also carries an `X-Mailchimp-Signature` header — see
        `x-signature` on this channel.
      message:
        oneOf:
          - $ref: '#/components/messages/Subscribe'
          - $ref: '#/components/messages/Unsubscribe'
          - $ref: '#/components/messages/Profile'
          - $ref: '#/components/messages/Cleaned'
          - $ref: '#/components/messages/Upemail'
          - $ref: '#/components/messages/Campaign'

components:
  messages:
    Subscribe:
      name: subscribe
      title: List Subscribe
      summary: A new subscriber was added to a list.
      description: >-
        Fired when a list subscriber is added. Payload field set is
        documented in the Sync Audience Data with Webhooks guide.
      contentType: application/x-www-form-urlencoded
      bindings:
        http:
          bindingVersion: '0.3.0'
      payload:
        $ref: '#/components/schemas/SubscribePayload'

    Unsubscribe:
      name: unsubscribe
      title: List Unsubscribe
      summary: A list member unsubscribed or was removed.
      description: >-
        Fired when a list member unsubscribes. Payload field set is
        documented in the Sync Audience Data with Webhooks guide.
      contentType: application/x-www-form-urlencoded
      bindings:
        http:
          bindingVersion: '0.3.0'
      payload:
        $ref: '#/components/schemas/UnsubscribePayload'

    Profile:
      name: profile
      title: Subscriber Profile Updated
      summary: A subscriber's profile was updated.
      description: >-
        Fired when a subscriber's profile is updated. The cited guide does
        not enumerate the form fields of this payload; the schema below
        only constrains the envelope (`type`, `fired_at`, `data`).
      contentType: application/x-www-form-urlencoded
      bindings:
        http:
          bindingVersion: '0.3.0'
      payload:
        $ref: '#/components/schemas/EnvelopeProfile'

    Cleaned:
      name: cleaned
      title: Email Cleaned From List
      summary: A subscriber's email address was cleaned from the list.
      description: >-
        Fired when a subscriber's email address is cleaned from the list
        (e.g. hard bounce, abuse report). The cited guide does not
        enumerate the form fields of this payload; the schema below only
        constrains the envelope (`type`, `fired_at`, `data`).
      contentType: application/x-www-form-urlencoded
      bindings:
        http:
          bindingVersion: '0.3.0'
      payload:
        $ref: '#/components/schemas/EnvelopeCleaned'

    Upemail:
      name: upemail
      title: Subscriber Email Address Updated
      summary: A subscriber's email address was changed.
      description: >-
        Fired when a subscriber's email address is changed. The cited
        guide does not enumerate the form fields of this payload; the
        schema below only constrains the envelope (`type`, `fired_at`,
        `data`).
      contentType: application/x-www-form-urlencoded
      bindings:
        http:
          bindingVersion: '0.3.0'
      payload:
        $ref: '#/components/schemas/EnvelopeUpemail'

    Campaign:
      name: campaign
      title: Campaign Sending Status
      summary: A campaign was sent or cancelled.
      description: >-
        Fired when a campaign is sent or cancelled. The cited guide does
        not enumerate the form fields of this payload; the schema below
        only constrains the envelope (`type`, `fired_at`, `data`).
      contentType: application/x-www-form-urlencoded
      bindings:
        http:
          bindingVersion: '0.3.0'
      payload:
        $ref: '#/components/schemas/EnvelopeCampaign'

  schemas:
    SubscribePayload:
      type: object
      required: [type, fired_at, data]
      properties:
        type:
          type: string
          const: subscribe
        fired_at:
          type: string
          description: Time the event fired, formatted `YYYY-MM-DD HH:MM:SS`.
          example: '2009-03-26 21:35:57'
        data:
          type: object
          required: [id, list_id, email, email_type]
          properties:
            id:
              type: string
              description: Mailchimp subscriber hash / id.
              example: 8a25ff1d98
            list_id:
              type: string
              description: The list/audience id.
              example: a6b5da1054
            email:
              type: string
              format: email
              example: api@mailchimp.com
            email_type:
              type: string
              example: html
            ip_opt:
              type: string
              description: IP address recorded at confirmed opt-in.
              example: 10.20.10.30
            ip_signup:
              type: string
              description: IP address recorded at signup.
              example: 10.20.10.30
            merges:
              type: object
              description: >-
                Merge fields for the subscriber. Keys are merge tags
                configured on the audience.
              additionalProperties:
                type: string
              example:
                EMAIL: api@mailchimp.com
                FNAME: Mailchimp
                LNAME: API
                INTERESTS: Group1,Group2

    UnsubscribePayload:
      type: object
      required: [type, fired_at, data]
      properties:
        type:
          type: string
          const: unsubscribe
        fired_at:
          type: string
          description: Time the event fired, formatted `YYYY-MM-DD HH:MM:SS`.
          example: '2009-03-26 21:40:57'
        data:
          type: object
          required: [id, list_id, email, email_type, action]
          properties:
            action:
              type: string
              description: >-
                The unsubscribe action recorded by Mailchimp (e.g. `unsub`).
              example: unsub
            reason:
              type: string
              description: Reason recorded for the unsubscribe (e.g. `manual`).
              example: manual
            id:
              type: string
              example: 8a25ff1d98
            list_id:
              type: string
              example: a6b5da1054
            email:
              type: string
              format: email
              example: api+unsub@mailchimp.com
            email_type:
              type: string
              example: html
            ip_opt:
              type: string
              example: 10.20.10.30
            campaign_id:
              type: string
              description: Campaign that triggered the unsubscribe, if any.
              example: cb398d21d2
            merges:
              type: object
              additionalProperties:
                type: string
              example:
                EMAIL: api+unsub@mailchimp.com
                FNAME: Mailchimp
                LNAME: API
                INTERESTS: Group1,Group2

    Envelope:
      type: object
      required: [type, fired_at, data]
      properties:
        type:
          type: string
          description: The event type discriminator.
        fired_at:
          type: string
          description: Time the event fired, formatted `YYYY-MM-DD HH:MM:SS`.
        data:
          type: object
          description: >-
            Event-specific payload. Field names are not enumerated in the
            cited source for this event type.
          additionalProperties: true

    EnvelopeProfile:
      allOf:
        - $ref: '#/components/schemas/Envelope'
        - type: object
          properties:
            type:
              const: profile

    EnvelopeCleaned:
      allOf:
        - $ref: '#/components/schemas/Envelope'
        - type: object
          properties:
            type:
              const: cleaned

    EnvelopeUpemail:
      allOf:
        - $ref: '#/components/schemas/Envelope'
        - type: object
          properties:
            type:
              const: upemail

    EnvelopeCampaign:
      allOf:
        - $ref: '#/components/schemas/Envelope'
        - type: object
          properties:
            type:
              const: campaign