events

Send an automation event

Trigger a saved Blueticked automation from a booking system, CRM, website form or other external app.

Create an API key with the least-privilege events:send scope.

The contact must already exist; identify it with exactly one of contact_id, email, or phone.

Phone accepts international or South African national forms, spaces and punctuation, normalized by the callback's rule. This endpoint never creates a contact or grants consent.

HTTP 202 means accepted, not provider delivery. Read outcome.kind and outcome.outcomes (flowId, channel, kind, reason, messageIds): queued means message rows were queued, even when a later step was then refused (the refusal is kept in the automation's run history); not_sent is a refusal or failure, and a line that failed after making message rows still lists their ids in messageIds, some of which may have gone; no_flow means no listener; ran means non-send actions ran. Dry-run evaluation returns 200 with outcome: null and queues nothing. Free-text WhatsApp needs an open 24-hour reply window; an approved template is required outside it.

channel (email, sms or whatsapp) selects which automations fire. Omit it and your workspace's own live automations decide: the one channel whose automation matches this event and can reach this contact fires, and the response tells you which. When automations on more than one channel qualify, the request fails with validation_failed, and that refusal is built for programmatic recovery: error.details[0].candidates lists the qualifying channels and error.next_steps[0].action is choose_channel, so branch on the action, pick a candidate, and retry with channel set. Never parse the message sentence. There is no silent default, ever; the contact identifier does not choose the channel.

events:send is a trigger scope, not a send scope: it fires the automations your workspace has already configured, and those automations are the send authority, so this key never needs messages:send or a per-channel send scope, even though an automation may end up sending. A fired event can only run pre-authored automations for an existing contact; it cannot choose the message content, template or recipient. (This mirrors triggering a Twilio Studio flow or a Stripe workflow: the trigger credential doesn't carry the flow's send rights.)

While integrating, add test_mode: true (or use a blu_test_ key) to evaluate the automation without sending live messages. The dry-run responds 200 (not 202) with test_mode: true and a matched_filter_label alongside the matched filter and action ids. A dry run needs no connected channel: evaluation sends nothing, so it works before WhatsApp or email is set up.

Use an Idempotency-Key header so external retries do not fire duplicate actions.

post/api/v1/events/send

Request

  • Base URL: https://app.blueticked.com
  • URL: https://app.blueticked.com/api/v1/events/send
  • Auth: HTTP bearer

Headers

Idempotency-Keystring

A unique key (e.g. a UUID) that makes a POST safe to retry: replaying the same key within 24h returns the original result instead of acting twice.

Request body

OR
OR

Response

Automation evaluation only: queues nothing, no provider sends or billing. outcome is null.

acceptedboolean required
test_modetrue required
outcomeunknown required
handledboolean required
eventstring required
channel'whatsapp' | 'sms' | 'email' | 'null' nullable required
business_idstring uuid nullable required
contact_idstring uuid required
matched_filter_idstring
matched_filter_labelstring
action_idsstring[]
request_idstring required

Changes

No recorded changes to this operation across all 1 revision of this API.