Skip to main content
Two delivery patterns are supported:
  • Per-request — include webhook_url on a single generation call. One-shot; fires once for that task.
  • Subscriptions — call POST /webhooks once per org; fires for every matching event thereafter.
Subscriptions are the right default for production. Per-request is handy for ad-hoc scripts or testing.

Events

Currently we fire two events:
  • run.completed — a task transitioned to status=completed
  • run.failed — a task transitioned to status=failed
Subscriptions are opt-in per event via the events field when subscribing (see below). Subscribe only to the events you actually handle.

Subscribing

Response:
The secret is shown only once. Save it — you need it to verify signatures. Losing it means deleting the subscription and creating a new one.

Per-request webhooks

If you just want a single callback for one task:
This fires against your org’s primary webhook secret (from GET /verify), not a per-subscription one. Same signature scheme.

Payload shape

On run.failed the shape is:

Verifying signatures

The signature is computed as:
Where timestamp is the X-Overten-Timestamp header value and raw_body is the exact bytes of the POST body (not re-serialized JSON).

Retry policy

Non-2xx responses trigger retries with exponential backoff:
Seven attempts total, ~1.5h total window. After the last attempt we give up; the task itself is still completed (or failed) on our side — only the notification was lost. Your application should be idempotent and not depend on the webhook firing exactly once. 4xx responses are not retried — if your endpoint returns 400/401/404, we assume your service is saying “don’t try again.”

Best practices

Return 200 immediately and enqueue the work internally. We time out at 15 seconds per attempt; if your handler runs synchronously longer than that we’ll treat it as a failure.
Retries and edge cases can cause duplicate deliveries. Key your processing on (run_id, event) and skip if already handled.
Webhook URLs are attacker-reachable. Signatures prove it came from us. Never trust the payload without verifying.
If it leaks, rotate by deleting the subscription and recreating it — the new subscription will issue a fresh secret. Old signatures will stop validating immediately.

Debugging

The dashboard’s Webhooks → Delivery log shows every attempt for the last 30 days with:
  • HTTP status received
  • Response body (truncated to 1KB)
  • Latency per attempt
  • Retry schedule remaining
If deliveries are failing, check there first before reaching out to support.