Cordial · AsyncAPI Specification
Cordial Webhooks
Version
View Spec
View on GitHub
CompanyMarketingMarketing AutomationMessagingEmailSMSPush NotificationsCustomer Data PlatformPersonalizationCustomer EngagementArtificial IntelligenceRetailE-CommerceAsyncAPIWebhooksEvents
AsyncAPI Specification
generated: '2026-08-04'
method: searched
source: https://support.cordial.com/hc/en-us/articles/13584534464141-Webhooks
event_catalog_source: https://support.cordial.com/hc/en-us/articles/4411361663501-System-events-reference-page
spec_type: none
asyncapi_published: false
note: >-
Cordial documents a real, configurable outbound webhook surface and publishes a complete system-event
reference, but ships NO AsyncAPI document. Nothing here is a synthesized AsyncAPI — this artifact is
the webhook/event catalogue as the provider publishes it. The event names and descriptions below are
verbatim from the system-events reference page (last updated 2025-09-25) plus events announced in the
monthly release notes.
surface:
type: outbound webhooks
description: >-
Webhooks stream real-time event data from Cordial to an external HTTP endpoint. Multiple webhooks
can be enabled, each configured to stream a specified set of system and/or custom events.
configuration_path: 'Cordial UI: Integrations > Webhooks > New'
api_configurable: false
api_gap: >-
There are no webhook CRUD operations in either published Swagger document. Webhooks cannot be
created, listed, updated, or deleted programmatically — a real gap for anyone provisioning
Cordial per-tenant.
delivery:
modes:
- {mode: single, description: Sends a single event with each request.}
- {mode: batched, description: 'Sends an array of events with each request. Requires setting a maximum number of events and a maximum payload size.'}
rate_limiting:
default: 100 per second
configurable: true
guidance: 'Set within the receiving API''s own rate threshold.'
request_headers: 'Arbitrary headers (e.g. authorization keys or tokens) configurable per webhook.'
payload_transformation:
mechanism: setPayload utility in the Payload Editor
description: >-
Payloads are reshaped inside Cordial to match the schema the receiving API expects, using
Cordial's Smarty templating. This means the wire schema is account-defined, not provider-fixed —
which is precisely why no AsyncAPI document could describe it generically.
edit_constraint: 'An enabled webhook must be disabled before its payload can be edited, then re-enabled.'
triggers:
scope: per channel
modes: [Send all events, Allowed events, Blocked events, Block all events]
channels:
- channel: all
events:
- {name: crdl_subscribeStatusChange, description: Contact's subscribe status changed.}
- {name: message-sent, description: Message was sent as directed.}
- channel: email
events:
- {name: bounce, description: Email was bounced and unable to be delivered to the address.}
- {name: click, description: Embedded link was clicked.}
- {name: complaint, description: Email was marked as spam by the recipient.}
- {name: open, description: Email was opened by the recipient.}
- {name: optout, description: Recipient unsubscribed from the message.}
- channel: push
events:
- {name: crdl_app_close, description: App was closed by the user.}
- {name: crdl_app_install, description: App was installed by the user.}
- {name: crdl_app_open, description: App was opened by the user.}
- {name: 'crdl_{channelKey}_send_failure', description: Error received when trying to send to the device.}
- {name: crdl_deep_link_open, description: A deep link was opened from within the app.}
- {name: crdl_device_notifications_manual_optin, description: Push notifications for the app were enabled by the user.}
- {name: crdl_device_notifications_manual_optout, description: Push notifications for the app were disabled by the user.}
- {name: crdl_device_notifications_optout, description: Push notifications for the app were disabled automatically.}
- {name: crdl_device_notifications_uninstalled, description: The application was uninstalled from a device.}
- {name: crdl_in_app_message_auto_dismiss, description: The in-app message was dismissed automatically.}
- {name: crdl_in_app_message_shown, description: The in-app message was displayed.}
- {name: crdl_in_app_message_manual_dismiss, description: The in-app message was closed by the user.}
- {name: crdl_inbox_read, description: The in-app message was read by the user.}
- {name: 'crdl_in-app-dismissed', description: The in-app message was dismissed.}
- {name: crdl_notification_tap, description: A notification was tapped by the user.}
- {name: crdl_push_enabled_change, description: 'Fired whenever a contact''s push notification enabled status changes. Properties: toPushEnabled, fromPushEnabled, deviceID, method. Added March 2026.'}
- channel: sms
events:
- {name: crdl_phone_deactivation, description: Phone number was deactivated by the mobile carrier.}
- {name: crdl_sms_delivered, description: SMS message was delivered by Cordial.}
- {name: crdl_sms_doi_optin, description: Double opt-in message sent.}
- {name: crdl_sms_doi_confirm, description: Double opt-in confirmed.}
- {name: crdl_sms_failed, description: SMS message failed to deliver.}
- {name: crdl_incoming_sms, description: SMS message received from contact.}
- {name: optout, description: Recipient unsubscribed from the message.}
- channel: rcs
events:
- {name: crdl_sms_delivered, description: 'RCS message was delivered by Cordial. Carries "sendType": "rcs".'}
- {name: crdl_incoming_sms, description: 'RCS message received from contact. Carries "sendType": "rcs".'}
- {name: crdl_rcs_fallback, description: RCS message failed to deliver, attempting fallback channel.}
- {name: crdl_rcs_open, description: Recipient successfully opened the message.}
- channel: podium
description: Orchestration (journey) lifecycle events.
events:
- {name: crdl-pdm-triggered, description: An orchestration was triggered.}
- {name: crdl-pdm-actn-success, description: The action associated with the orchestration was a success.}
- {name: crdl-pdm-actn-failed, description: The action associated with the orchestration failed.}
- {name: crdl-pdm-actn-filtered, description: Contact action has been filtered from the orchestration.}
- {name: crdl-pdm-actn-ignored, description: The action associated with the orchestration was ignored.}
- {name: crdl-pdm-actn-expired, description: The orchestration session has expired.}
- {name: crdl-pdm-goal-met-organic, description: An orchestration goal was met.}
- channel: rest-api
events:
- {name: 'crdl_{channelKey}_send_failure', description: Error received when trying to send to the device.}
- channel: other
events:
- {name: crdl_contact_update_unique_constraint_error, description: A contact update failed because a uniquely constrained attribute value was supplied and is already in use for another contact record.}
- {name: crdl_graph_identified, description: 'Identity-graph match event. (The provider''s own reference page carries a copy-paste error here, describing it as "Phone number was deactivated by the mobile carrier.")'}
- {name: crdl_merged_contacts, description: Two contact records were merged into a single record along with respective events and orders.}
custom_events:
supported: true
description: >-
Any custom-named event (browse, cart, order, or arbitrary IoT/behavioural events) can be posted to
POST /v2/contactactivities with free-form JSON properties, and then selected as a webhook trigger
alongside the system events above.
ingest_operation: 'openapi/_original/cordial-v2-openapi-original.json#addActivity'
counts:
system_events: 41
channels: 8
related_streaming:
- name: Amazon Kinesis integration
docs: https://support.cordial.com/hc/en-us/articles/360026363972-Amazon-Kinesis-integration
note: A second event-egress path alongside webhooks, documented in the integrations category.
- name: Contact activity export
operation: 'openapi/_original/cordial-v2-openapi-original.json#createExportCAJob'
note: 'Batch egress of the same event stream to FTP/SFTP/HTTP in CSV or JSON.'
x-evidence:
fetched: '2026-08-04'
probes:
- {url: 'https://support.cordial.com/api/v2/help_center/en-us/articles/13584534464141.json', http_status: 200, updated: '2025-06-24'}
- {url: 'https://support.cordial.com/api/v2/help_center/en-us/articles/4411361663501.json', http_status: 200, updated: '2025-09-25'}
asyncapi_probes:
- {url: 'https://api.cordial.io/asyncapi.yaml', http_status: 401}
- {url: 'https://developers.cordial.com/asyncapi.yaml', result: 'HTML shell (SPA catch-all)'}