Overview
Webhooks allow you to receive HTTP POST notifications when events occur in your Voicy account. When a call ends, Voicy sends the full call data — transcript (STT text, not audio), summary, extracted variables, a recording link, and more — to your server in real time. Each agent supports up to 5 webhooks, all firing in parallel. Use them to push call data to your CRM, analytics platform, or any custom integration.Creating a Webhook
1
Open Agent Settings
In the Voicy Dashboard, navigate to your agent and open the Settings tab. Scroll down to the Webhooks section and expand it.
2
Add a Webhook
Click the + button to add a new webhook. Fill in the fields:
Click Add to save.
3
Deploy the Agent
Webhooks are part of the agent configuration. After adding or modifying webhooks, deploy the agent for changes to take effect on phone calls.
Changes take effect immediately for web (test) calls, but phone calls use the deployed version.
4
Test It
Make a test call from the dashboard’s built-in call simulator. When the call ends, your endpoint will receive a POST request with the full call payload.
Managing Webhooks
- Edit — Click the pencil icon on any webhook to change its name, URL, or secret. Leave the secret field blank to keep the existing secret.
- Delete — Click the trash icon to remove a webhook.
- Limit — Up to 5 webhooks per agent. The badge shows your current count (e.g. “2/5”).
Managing Webhooks via the API
Prompt-based agents’ webhooks can also be set through the Agent API, with the same fields and limits as the dashboard. Changes are deployed immediately — no separate deploy step.- Create — pass
webhooksto Create Agent. - Update — pass
webhooksto Update Agent. It replaces the agent’s whole list: a webhook you leave out is deleted, and[]removes them all. Omit the field to leave webhooks unchanged. - Read — every Agent response includes
webhooks, withhas_secret/has_headersin place of the values.
null) to keep what is stored; send "" to remove a secret, or {} to remove all headers. Include each webhook’s id to update it in place — without one, a webhook with the same url is updated.
Custom Headers
Custom headers let you attach arbitrary HTTP headers to every webhook request — useful when your receiving endpoint requires authentication (e.g.Authorization: Bearer <token>) or a vendor-specific API key header.
Limits: Up to 10 headers per webhook. Names must be valid RFC 7230 tokens. Values cannot contain line breaks.
Reserved headers that cannot be overridden: Content-Type, x-voicy-event, x-voicy-signature, Host, Content-Length, Transfer-Encoding.
Security: Header values are stored server-side and never returned by the API (same treatment as signing secrets). When editing a webhook, leave all value fields blank to preserve the existing headers.
Events
call_ended
Fired after all post-call processing completes (summary generation, variable extraction, email notifications). The payload contains the full call data in the same format as the Get Call API.
Headers:
Payload:
recording_url is a signed link to the call recording, valid for 1 hour from when the webhook fires. If you need the recording after it expires, re-fetch it via the Get Call API, which issues a fresh signed URL.Handling Webhooks
When your server receives a webhook, respond with a200 status code to acknowledge receipt. Here’s a minimal handler:
Signature Verification
If a signing secret is configured, each webhook request includes anx-voicy-signature header containing an HMAC-SHA256 signature of the raw request body. Always verify signatures in production to ensure requests are genuinely from Voicy.
Behavior
If a webhook endpoint is unreachable or returns an error, the failure is logged but does not affect call processing or other webhooks.