Skip to main content

Webhooks API

Register outbound webhook endpoints with HMAC signing Base path: /api/v1/webhooks Endpoint count: 30

Get a platform event-stream sink config

GET /api/v1/developer/event-sinks/{kind}
Return the current streaming-sink configuration for one transport kind. A sink streams the platform event taxonomy (message.*, call.*, … — the same events the per-event HTTP webhooks fan out) to your own Kafka topic or batch HTTP collector. The secret credential (Kafka SASL password or HTTP bearer token) is encrypted at rest and is never returned — the read surfaces only a credentials_configured presence flag. The last_run_* fields are worker-owned run status, read-only. Requires an owner, admin, or developer role.
string (enum: kafka|http_batch)
required
Sink transport. One of kafka or http_batch.

List webhook endpoints

GET /api/v1/webhooks/
List all webhook endpoints for the tenant, cursor-paginated.
string
Opaque cursor for the next page (from previous response meta.pagination.cursor)
integer
Number of items per page (1–200, default 25)

Get a webhook endpoint

GET /api/v1/webhooks/{id}
Retrieve a single webhook endpoint by its ID.
string
required

List webhook deliveries

GET /api/v1/webhooks/{id}/deliveries
List delivery attempts for a webhook endpoint, cursor-paginated. Filter by status, event_type, event_id, and a from_date/to_date range.
string
required

Get a webhook delivery

GET /api/v1/webhooks/{id}/deliveries/{deliveryId}
Retrieve full detail for a single delivery attempt, including the request payload (PII redacted), response body, and timing information.
string
required
string
required

Get webhook endpoint health

GET /api/v1/webhooks/{id}/health
Per-endpoint health over the last 24 hours: success rate, p50/p95 latency, the last five errors, a week-over-week degradation delta, and a red/amber/green colour band.
string
required

Get bulk replay job status

GET /api/v1/webhooks/{id}/replay-range/{jobId}
Poll the status and progress of a bulk replay job: queued, running, done, or failed, plus processed/total counts and the replayed window.
string
required
string
required

Get webhook rotation status

GET /api/v1/webhooks/{id}/rotation/status
Report the in-flight rotation state for an endpoint: whether a rotation is active, the grace-window expiry, the candidate secret fingerprint, and how many recent deliveries the receiver verified with the new secret.
string
required

List dead-lettered webhook deliveries

GET /api/v1/webhooks/dlq
List deliveries that exhausted every retry tier and landed in the dead-letter queue, cursor-paginated. Filter by endpoint_id.

List webhook event schemas

GET /api/v1/webhooks/event-schemas
Return the machine-readable catalog of every event type Orbit emits. Each entry carries a Draft-07 envelope JSON Schema (with the type literal pinned) plus a realistic example payload, for OpenAPI codegen, runtime validation, or type generation without mining the docs by hand.

List webhook events (tenant timeline)

GET /api/v1/webhooks/events
Cross-endpoint delivery timeline for the tenant, cursor-paginated. Filter by status, event_type, endpoint_id, a free-text search over the event type, and a from_date/to_date range. Scoped to the authenticated tenant — there is no organization_id parameter.

Get webhook reliability rollup

GET /api/v1/webhooks/reliability
Per-endpoint reliability rollup across the tenant: success rate, p95 latency, the oldest still-pending delivery, and the last-event timestamp over a configurable window_hours (default 24).

Register a webhook endpoint

POST /api/v1/webhooks/
Register a webhook endpoint to receive event notifications. URL must be HTTPS and not target a private/loopback/link-local/CGNAT host (SSRF defense). Optional secret is used to compute the X-Orbit-Signature HMAC (canonical header); X-Devotel-Signature carries the same value for back-compat, except during a secret-rotation grace window, when it additionally carries the previous secret’s signature (a second v1=) so verifiers holding either secret keep validating. If omitted, Orbit auto-generates one and returns it in the response (this is the only time the secret is returned in cleartext — it is encrypted at rest after). See Webhook Security for verification instructions.
string
required
HTTPS endpoint URL.
string[]
required
Subscribed event types. See Webhook Events (e.g. message.delivered, call.completed, verification.approved).
string
Optional shared secret. Used to verify the X-Orbit-Signature HMAC (canonical header) on every delivery. X-Devotel-Signature carries the same value for back-compat, except during a secret-rotation grace window, when it additionally carries the previous secret’s signature (a second v1=). Prefer X-Orbit-Signature in verifier code.
boolean
Whether to start dispatching events immediately.
string
integer
Per-endpoint HTTP delivery timeout in seconds (1-30). The dispatcher aborts an in-flight delivery once this many seconds elapse. Defaults to 30 (the platform hard ceiling) when omitted.
object
Custom HTTP request headers merged onto every delivery to this endpoint, as a string-to-string map. Up to 20 headers; each value is capped at 2048 characters and may not contain line breaks. Header names reserved by Orbit (the signature, identity, idempotency, and Content-Type headers) are rejected so you can’t shadow the headers we sign. Omit to send none. On update, pass {} to clear previously-configured headers.
object
Per-endpoint payload transform that reshapes or filters the event before it is signed and delivered.
string
Scope this endpoint to a single AI agent. When set, the endpoint only receives events whose payload identifies that agent, rather than the tenant-global event stream. Omit for tenant-global delivery. On update, pass null to remove the scope.
Retry timing is managed by Orbit on a fixed schedule and is not configurable per endpoint. A failed delivery (non-2xx response or timeout) is retried automatically — one initial attempt plus 6 retries at 1m → 5m → 30m → 2h → 8h → 24h (each delay carries +0–20% jitter) — after which the event is moved to the dead-letter queue for replay. See Retry Schedule for the full table and idempotency guidance.

Replay a webhook delivery

POST /api/v1/webhooks/{id}/deliveries/{deliveryId}/replay
Re-dispatch a stored delivery’s original payload through the standard dispatch pipeline. Like retry, single-row replay is failed-only: a delivery whose status is not failed returns 409 CONFLICT. To re-send a delivery that already succeeded, use the bulk POST /webhooks/{id}/replay-range endpoint, which re-dispatches every stored delivery in a from/to window.
string
required
string
required

Retry a webhook delivery

POST /api/v1/webhooks/{id}/deliveries/{deliveryId}/retry
Re-queue a failed delivery attempt for another retry.
string
required
string
required

Pause a webhook endpoint

POST /api/v1/webhooks/{id}/pause
Temporarily pause deliveries for a webhook endpoint. Set a bounded window via duration_minutes or an explicit until timestamp; deliveries auto-resume once the window passes. Distinct from PUT /:id with active: false, which is an open-ended deactivation.
string
required

Start a bulk webhook replay

POST /api/v1/webhooks/{id}/replay-range
Enqueue a bulk replay of every stored delivery in the from/to window (optionally filtered by eventTypeFilter). Returns 202 with a job_id to poll via GET /webhooks/:id/replay-range/:jobId. Returns 409 with machine-readable error code BULK_REPLAY_IN_PROGRESS when a bulk replay is already running or queued for the endpoint (at most one active bulk replay per endpoint) — wait for the in-flight job to finish before retrying.
string
required

Preview a bulk webhook replay

POST /api/v1/webhooks/{id}/replay-range/preview
Dry-run a bulk replay: count how many stored deliveries fall in the from/to window (optionally filtered by eventTypeFilter) without enqueuing any job.
string
required

Resume a webhook endpoint

POST /api/v1/webhooks/{id}/resume
Clear an in-flight pause window so deliveries resume immediately. Idempotent — calling it on an endpoint that is not paused returns the endpoint unchanged.
string
required

Rotate a webhook signing secret

POST /api/v1/webhooks/{id}/rotate-secret
Rotate the signing secret for a webhook endpoint. The new secret is returned in cleartext exactly once — persist it immediately, since later reads only show a masked prefix. Pass ?force=true to override the 24-hour previous-secret grace window (e.g. after a confirmed leak).
string
required

Cancel a webhook secret rotation

POST /api/v1/webhooks/{id}/rotation/cancel
Discard the candidate secret and keep the current canonical secret in place. Idempotent.
string
required

Complete a webhook secret rotation

POST /api/v1/webhooks/{id}/rotation/complete
Promote the candidate secret to canonical and end the dual-signing grace window. Pass force=true to skip the auto-complete eligibility check (recent deliveries verified with the new secret).
string
required

Initiate a webhook secret rotation

POST /api/v1/webhooks/{id}/rotation/initiate
Mint a new candidate signing secret and open a grace window during which deliveries are dual-signed with the old and new secret. The plaintext secret is returned exactly once. Idempotent within the 24-hour dedup window.
string
required

Test a webhook endpoint

POST /api/v1/webhooks/{id}/test
Send a test event to a registered webhook endpoint to verify connectivity and signature handling.
string
required

Fire a synthetic test event

POST /api/v1/webhooks/{id}/test-fire
Fire a synthetic event of a given type at a registered endpoint. Optionally override the sample payload or pick a variant (success | failure | minimal). Returns a stable event_id you can poll the deliveries list with for the real receiver outcome.
string
required

Requeue a dead-lettered delivery

POST /api/v1/webhooks/dlq/{deliveryId}/requeue
Move a single dead-lettered delivery back into the retry queue — resets its status to pending and clears the attempt counter so the retry scheduler picks it up again.
string
required

Send an ad-hoc test webhook

POST /api/v1/webhooks/test
Send a one-off test event to an arbitrary HTTPS URL without registering an endpoint. The URL is SSRF-guarded (HTTPS-only; private/loopback/link-local/CGNAT hosts rejected; DNS pinned to the validated IP). Returns the receiver’s status code, latency, and truncated response body.

Update a webhook endpoint

PUT /api/v1/webhooks/{id}
Update an existing webhook endpoint’s URL, subscribed events, active state, description, or per-endpoint delivery timeout.
string
required

Update a platform event-stream sink config

PATCH /api/v1/developer/event-sinks/{kind}
Merge a partial configuration into one sink kind. Only the fields you send are written; worker-owned last_run_* run-status fields are never accepted. The request body is discriminated on the path kind: an http_batch sink takes destination.url (https-only, SSRF-checked) and an optional max_batch_size; a kafka sink takes destination.topic plus brokers, sasl_mechanism, and sasl_username. A destination.kind must equal the path kind. Send credentials to store the encrypted secret (Kafka SASL password or HTTP bearer token); send an empty string to clear it. Requires an owner, admin, or developer role; every write is audit-logged (key names only, never the credential).
string (enum: kafka|http_batch)
required
Sink transport to update. One of kafka or http_batch.

Delete a webhook endpoint

DELETE /api/v1/webhooks/{id}
Delete a webhook endpoint. Stored deliveries are removed with it; returns 204 No Content on success.
string
required