Outgoing webhook management (supervisor/admin only). Delivery is at-least-once: events are captured durably (Redis stream) and retried with exponential backoff, so the same event may be POSTed more than once (e.g. after a transient receiver/network failure or a dispatcher restart). Receivers must be idempotent — deduplicate on the event's natural identifiers in the JSON body (timestamp plus the relevant id under data, e.g. data.message.id / data.conversation_id) together with the X-Omnistream-Event header, and verify the X-Omnistream-Signature HMAC. Do not assume exactly-once. Deliveries that exhaust all retry attempts (default 8, capped exponential backoff) move to a dead-letter queue (status = dead_letter) and can be replayed. During a secret-rotation overlap window each delivery carries two signatures — X-Omnistream-Signature (new secret) and X-Omnistream-Signature-Previous (old secret); accept the delivery if EITHER header matches the secret you have stored. Full runbook: docs/webhook-reliability.md.
List outgoing webhooks
Supervisor or admin only.
List outgoing webhooks › Responses
Outgoing webhooks
idnameurleventsJSON array of subscribed event type strings
is_activeconsecutive_failurescreated_atupdated_atsecretHMAC signing secret. Write-only — never returned in responses. The staged rotation secret (secret_next) is likewise never returned; a pending rotation is only visible via secret_rotated_at.
secret_rotated_atWhen the current secret-rotation overlap window started. Null when no rotation is in progress (cleared on complete, cancel, or the 24-hour auto-promote).
created_bylast_triggered_atlast_success_atCreate an outgoing webhook
Supervisor or admin only.
Create an outgoing webhook › Request Body
nameurlMust start with http:// or https://
secreteventsValid types: message.received, message.sent, message.status, conversation.created, conversation.resolved, conversation.assigned, contact.created
Create an outgoing webhook › Responses
Webhook created
idnameurleventsJSON array of subscribed event type strings
is_activeconsecutive_failurescreated_atupdated_atsecretHMAC signing secret. Write-only — never returned in responses. The staged rotation secret (secret_next) is likewise never returned; a pending rotation is only visible via secret_rotated_at.
secret_rotated_atWhen the current secret-rotation overlap window started. Null when no rotation is in progress (cleared on complete, cancel, or the 24-hour auto-promote).
created_bylast_triggered_atlast_success_atAggregated delivery statistics
Supervisor or admin only. Per-status delivery counts (including dead-lettered rows) plus average response time, over an optional created_at date range.
query Parameters
fromtoAggregated delivery statistics › Responses
Delivery statistics
totalsuccessfailedFailed but still retryable (attempt < max_attempts)
pendingdead_letterTerminally failed deliveries awaiting replay or 30-day cleanup
avg_response_time_msAverage milliseconds between created_at and completed_at
Bulk-replay deliveries by id
Supervisor or admin only. Resets each failed/dead-lettered delivery in place — status back to pending, attempt counter zeroed, response fields cleared — so the scheduler re-sends it with the original payload. Ids that are unknown or not replayable are skipped and excluded from replayed.
Bulk-replay deliveries by id › Request Body
delivery_idsDeliveries to replay; only failed/dead_letter rows are reset
Bulk-replay deliveries by id › Responses
Replay summary
replayedRows actually reset to pending
requestedIds received in the request
Replay all dead-lettered deliveries
Supervisor or admin only. Resets every dead_letter delivery in place for re-sending. The body is optional — omit it (or send {}) to replay across all webhooks, or pass webhook_id to scope the replay to a single webhook.
Replay all dead-lettered deliveries › Request Body optional
webhook_idRestrict the replay to this webhook's deliveries
Replay all dead-lettered deliveries › Responses
Replay summary
replayedReplay a single delivery
Supervisor or admin only. Resets one failed or dead-lettered delivery in place (status back to pending, attempt counter zeroed, response fields cleared); the scheduler re-sends it with the original payload within ~30 seconds.
path Parameters
delivery_idReplay a single delivery › Responses
Delivery queued for replay
delivery_idstatusAlways "queued" on success
messageUpdate an outgoing webhook
Supervisor or admin only.
path Parameters
idUpdate an outgoing webhook › Request Body
nameurlsecreteventsis_activeUpdate an outgoing webhook › Responses
Webhook updated
idnameurleventsJSON array of subscribed event type strings
is_activeconsecutive_failurescreated_atupdated_atsecretHMAC signing secret. Write-only — never returned in responses. The staged rotation secret (secret_next) is likewise never returned; a pending rotation is only visible via secret_rotated_at.
secret_rotated_atWhen the current secret-rotation overlap window started. Null when no rotation is in progress (cleared on complete, cancel, or the 24-hour auto-promote).
created_bylast_triggered_atlast_success_atList deliveries for a webhook
Supervisor or admin only. Paginated, newest first.
path Parameters
idquery Parameters
pageper_pageList deliveries for a webhook › Responses
Webhook deliveries
idwebhook_idevent_typepayloadstatuspending = queued, awaiting the next scheduler tick; sending = claimed by a dispatcher worker (15-minute lease, reclaimed if the lease expires); success = delivered (HTTP 2xx); failed = last attempt failed but retries remain; dead_letter = terminal (attempts exhausted, webhook missing/inactive, or URL blocked) — never retried automatically, only a replay re-queues it.
attemptmax_attemptsDelivery attempts before dead-lettering (default 8)
created_athttp_statusresponse_bodyerror_messagenext_retry_atcompleted_atStart a signing-secret rotation
Supervisor or admin only. Stages a new HMAC secret and opens a 24-hour overlap window: deliveries are signed with the NEW secret in X-Omnistream-Signature and with the OLD secret in X-Omnistream-Signature-Previous, so receivers can switch secrets without dropping deliveries. Complete (or cancel) the rotation explicitly, or it auto-promotes after 24 hours. The new secret is returned once in this response and never again.
path Parameters
idStart a signing-secret rotation › Request Body optional
secretOptional custom secret (16–255 chars after trimming). Omit to have the server generate a 64-character lowercase-hex secret.
Start a signing-secret rotation › Responses
Rotation started
idsecretThe new signing secret — shown once, never returned again
rotated_atStart of the dual-signature overlap window
overlapHuman-readable note that the previous secret keeps working for up to 24 hours or until the rotation is completed
Complete a pending secret rotation
Supervisor or admin only. Promotes the staged secret to the active signing secret and ends the overlap window — the old secret stops matching immediately.
path Parameters
idComplete a pending secret rotation › Responses
Rotation completed
idnameurleventsJSON array of subscribed event type strings
is_activeconsecutive_failurescreated_atupdated_atsecretHMAC signing secret. Write-only — never returned in responses. The staged rotation secret (secret_next) is likewise never returned; a pending rotation is only visible via secret_rotated_at.
secret_rotated_atWhen the current secret-rotation overlap window started. Null when no rotation is in progress (cleared on complete, cancel, or the 24-hour auto-promote).
created_bylast_triggered_atlast_success_atCancel a pending secret rotation
Supervisor or admin only. Discards the staged secret and keeps the OLD secret active; deliveries return to a single X-Omnistream-Signature header.
path Parameters
idCancel a pending secret rotation › Responses
Rotation cancelled
idnameurleventsJSON array of subscribed event type strings
is_activeconsecutive_failurescreated_atupdated_atsecretHMAC signing secret. Write-only — never returned in responses. The staged rotation secret (secret_next) is likewise never returned; a pending rotation is only visible via secret_rotated_at.
secret_rotated_atWhen the current secret-rotation overlap window started. Null when no rotation is in progress (cleared on complete, cancel, or the 24-hour auto-promote).
created_bylast_triggered_atlast_success_at