Skip to main content

Async terminal callbacks

Async runs can call your backend when execution reaches a terminal state.
Webhook URLs must be public http or https URLs. Localhost, private network, link-local, and metadata-service targets are rejected or skipped.

Payload

Webhook payloads include the run, conversation, model, terminal status, and either result or error.
Use conversationId as the public conversation identifier. threadId is included in the current payload for compatibility and has the same value for CREAO CLI conversations. Failed run example:

Delivery behavior

CREAO makes up to three delivery attempts with short backoff. A non-2xx response, a connection error, or no response within 10 seconds is retried. Redirects are not followed, so a 3xx response counts as a failed attempt. The first 2xx response ends delivery, marks the webhook as delivered, and sets webhook_delivered_at on the run object. Every request carries these headers: Delivery is at least once: a retry can repeat a request your endpoint already processed, for example when it timed out before responding. Design webhook handlers to be idempotent and deduplicate on X-Creao-Delivery-Id (or runId). Respond with a 2xx quickly and do slow work afterwards.

Polling fallback

Webhooks are best-effort delivery. Your backend can always poll: