Skip to main content
Inbound webhooks let external systems (Five9, Stripe, anything that can POST) trigger one of your Definitions. You create a webhook config bound to an active Definition; the sender POSTs signed deliveries to a per-customer receive URL; each verified delivery starts a normal batch (trigger_type: "webhook").
This surface is inbound-only — deliveries coming into GetDialed. Outbound webhooks (a flow calling an external URL) are a separate catalog action, not receiver machinery.

How inbound webhooks work

  1. An admin creates a webhook config (POST /flows/webhooks) bound to an active Definition. GetDialed mints a signing secret and returns it once.
  2. GetDialed returns a receive_url — a relative path /flows/webhooks/{slug}/{webhook_id}.
  3. Your external sender computes an HMAC-SHA256 signature over each delivery body and POSTs to the public receive URL.
  4. The receiver verifies the signature on the raw bytes, then starts a batch with the normalized payload as input_data.

Step 1 — Create the webhook

The X-API-Key header is admin-equivalent; a Clerk JWT needs the admin role. Only provider: "standard" (Standard Webhooks, HMAC-SHA256) and mode: "trigger" are implemented today — other values are rejected with 422.
The 201 response carries two show-once fields, signing_secret and receive_url:
The signing_secret is returned exactly once — here, and again only if you explicitly rotate it. It is never retrievable from any GET. Copy it into the sending system immediately. If you lose it, use POST /flows/webhooks/{webhook_id}/rotate-secret (24h old-secret overlap).

Step 2 — Build the receive URL

The receive_url is a relative path with no host and no version segment — it already carries its flows group segment. Prepend https://api.getdialed.ai/v1 — host plus version only — to get the address your sender calls:
For the example above that is https://api.getdialed.ai/v1/flows/webhooks/acme/8a9c86a8b78c48d3a3e5e00ad0ed5b96. Note the base stops at /v1: repeating the flows group segment yields /v1/flows/flows/webhooks/..., and every delivery to that address 404s. The webhook_id is a 128-bit opaque hex value, so the URL is unguessable by construction. The tenant is identified by the slug; the webhook by the webhook_id.

Step 3 — Sign and send a delivery

The receiver carries no X-API-Key/Authorization requirement — the trust boundary is the HMAC-SHA256 signature over the raw request body, verified per the Standard Webhooks spec before the body is parsed. Every delivery must carry three headers: The standardwebhooks library computes the signature for you — never hand-roll the HMAC.
The receiver acks within ~50ms with 202 — batch creation happens asynchronously after the ack.

Step 4 — Confirm the delivery dispatched

The receiver’s 202 only means “accepted.” Check the delivery log to see whether it started a batch:
Each delivery record moves receiveddispatched (with the created batch_id) or failed (with an error).

Next steps

Webhooks

The full object reference, signing spec, and receiver semantics.

Batches and executions

Every verified delivery starts a batch — track it end to end.