A webhook is a URL Talqing POSTs a signed JSON event to when something happens in your workspace: a call ended, an agent was published, a batch stopped. Use it to push call results into a CRM instead of polling. Webhooks are workspace-wide: one subscription receives events for every agent, so filter on the envelope’s agent_id yourself. The payload of every event type is on webhook events.

Create a webhook

The plaintext secret is returned only in the create and rotate responses. Reads return secret_hint (whsec_…ab12). Lost it? Rotate.
A webhook also carries status (active or disabled), last_status (delivered or failed) and last_delivered_at. PATCH /v1/webhooks/{webhook_id} changes url, subscribed_events or status; a disabled webhook receives nothing. DELETE removes it.

Verify the signature

Each request carries Content-Type: application/json, User-Agent: talqing-webhooks/1 and: Compute the HMAC over the exact body bytes before parsing; re-serialized JSON will not match. Compare in constant time.

Delivery rules

One attempt, no retry. Each event is POSTed once per matching webhook with a 5-second timeout. A non-2xx, a redirect (redirects are not followed), a timeout or a connection error is logged as failed and never re-sent.
  • Answer within five seconds. Verify, enqueue, return 2xx, then do the work.
  • Treat webhooks as a notification, not the record. Run a periodic sweep over GET /v1/calls with start and end to catch anything missed, and use the delivery log to see which events failed.
  • Point at the final URL. The connection is pinned to the address that passed the public-address check. A private, loopback, link-local, reserved or metadata address is refused at save (400 url not allowed: …) and logged as blocked destination: … if DNS changes later.

Delivery log

GET /v1/webhooks/{webhook_id}/deliveries lists attempts newest first, in the standard page shape (default 50, max 200).

Test-fire

POST /v1/webhooks/{webhook_id}/test sends one signed webhook.test event ({"message": "talqing test event", "webhook_id": "…"}) and returns {webhook_id, status, status_code, error} with what your endpoint answered. It ignores subscribed_events, is written to the delivery log, and is refused for a disabled webhook (400 webhook is disabled; enable it before testing).

Rotate the secret

POST /v1/webhooks/{webhook_id}/rotate-secret returns the webhook with a new plaintext secret.
Rotation is immediate with no overlap: every delivery after the call returns is signed with the new secret. Make your receiver accept both secrets before rotating, or accept failed verifications until you update it.

In the dashboard

Webhooks lists each subscription with its status, URL, events and secret hint. Creating one shows the plaintext secret once. Each row has Test, Enable/Disable, Log (the delivery history) and Delete.

Webhook events

The envelope and every event’s payload.

Calls

The same facts as session.completed, on demand.