Skip to content
Select themeSelect language

Conversation webhook delivery

POST

Intercom support-conversation webhook (#596). Intercom POSTs conversation.user.created / conversation.user.replied topics; authenticated by the X-Hub-Signature HMAC-SHA1 header over the raw body against the trigger’s per-trigger signing secret (the Intercom app client_secret). A user message enqueues a gated reactive-backlog item. Path: POST /api/workflows/triggers/intercom/{token}.

Media typeapplication/json

The generic webhook / trigger delivery body: an arbitrary JSON object the caller posts. SupaCloud does not impose a fixed shape — the whole object is handed to the workflow run as the trigger context (SC_TRIGGER_CONTEXT). This is an honest record-of-unknown, NOT a fake structure: the runtime never deserializes it into named fields.

object
key
additional properties

Arbitrary trigger payload fields, forwarded verbatim to the run as SC_TRIGGER_CONTEXT. Flattened so the component IS the open object the caller posts (not a wrapper); the runtime never deserializes named fields.

Examplegenerated
{
"additionalProperty": "example"
}

Delivery accepted (enqueued or skipped).

Media typeapplication/json

The ack body returned by the #596 conversation receivers (chatwoot/intercom): { "status": "enqueued" | "skipped", "backlog_item_id": "<uuid>"?, "reason": "<text>"? }. A matched new conversation / incoming message ENQUEUES a gated reactive-backlog item (carrying its id); a verified-but-non-actionable delivery (filtered, notify-only, a stale replay, or a dedupe) is acked skipped with a reason — never an error. (Distinct from WebhookAck: an enqueue is not a fired run, so the id field is backlog_item_id, not run_id.)

object
backlog_item_id

The enqueued backlog item id — present only when status = "enqueued".

string | null format: uuid
reason

Why a delivery was skipped — present for skipped.

string | null
status
required

enqueued (a reactive-backlog item was created) or skipped.

string
Examplegenerated
{
"backlog_item_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"reason": "example",
"status": "example"
}

Malformed body (non-JSON / rejected content-type).

Media typeapplication/json

The canonical JSON body of every error response — the single source of truth the frontend binds to. Every AppError serializes as this exact shape, and the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is what the frontend error schema is generated from, so there is no hand-written error schema on either end.

object
code
required

Machine-readable, stable error code.

string
Allowed values: not_found unauthorized forbidden bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited quota_exceeded database_error docker_error vault_error internal_error
details
One of:
null
error
required

Human-readable message (the server’s English text; the client may localize by code).

string
Example
{
"code": "not_found"
}

Invalid or missing HMAC signature.

Media typeapplication/json

The canonical JSON body of every error response — the single source of truth the frontend binds to. Every AppError serializes as this exact shape, and the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is what the frontend error schema is generated from, so there is no hand-written error schema on either end.

object
code
required

Machine-readable, stable error code.

string
Allowed values: not_found unauthorized forbidden bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited quota_exceeded database_error docker_error vault_error internal_error
details
One of:
null
error
required

Human-readable message (the server’s English text; the client may localize by code).

string
Example
{
"code": "not_found"
}

Unknown trigger token.

Media typeapplication/json

The canonical JSON body of every error response — the single source of truth the frontend binds to. Every AppError serializes as this exact shape, and the generated OpenAPI component ApiErrorBody (with its ErrorCode enum) is what the frontend error schema is generated from, so there is no hand-written error schema on either end.

object
code
required

Machine-readable, stable error code.

string
Allowed values: not_found unauthorized forbidden bad_request unprocessable precondition_failed conflict method_not_allowed rate_limited quota_exceeded database_error docker_error vault_error internal_error
details
One of:
null
error
required

Human-readable message (the server’s English text; the client may localize by code).

string
Example
{
"code": "not_found"
}