Setup Bolna Webhooks
What Bolna sends
Bolna sends HTTP POST requests to the configured webhook URL as call status and execution data changes. Treat the webhook payload as the execution object; use get-executions for the same execution ID to reconcile missed or duplicate delivery.
Where to configure
- Dashboard: agent Analytics tab, "Push all execution data to webhook".
- API: set
agent_config.webhook_url when creating or patching an agent.
API patch
curl --request PATCH \
--url "https://api.bolna.ai/v2/agent/$AGENT_ID" \
--header "Authorization: Bearer $BOLNA_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"agent_config": {
"webhook_url": "https://example.com/bolna/webhook"
}
}'
Receiver requirements
- Public HTTPS URL in production.
- Accept POST JSON.
- Respond quickly with 2xx.
- Store by
execution_id or id idempotently.
- Verify the payload shape before triggering irreversible downstream actions.
- If firewalling, check current Bolna docs for webhook source IPs before allow-listing.
Local test receiver
python3 setup-webhook/scripts/webhook_receiver.py --port 8080
Expose with a tunnel such as ngrok or Cloudflare Tunnel, then configure the public HTTPS URL in Bolna.
Minimal payload handling pattern
- Parse JSON.
- Extract execution ID, status, agent ID, phone numbers, transcript, recording URL, and extracted data.
- Upsert into your database by execution ID.
- Trigger automation only after relevant terminal statuses, usually
completed, failed, no-answer, busy, or error.
- If payload is incomplete, call
GET /executions/{execution_id}.
Common automations
- Send summary and recording to CRM.
- Update lead status from extracted data.
- Create a support ticket after failed handoff.
- Send WhatsApp, SMS, or email through Make, Zapier, n8n, or custom code.
- Build live dashboard cards from
queued, ringing, in-progress, and completed.
Source IP to whitelist
Bolna delivers webhooks from a single source IP:
13.203.39.153
Add this to your server's firewall allow-list. Reject anything else if your endpoint is sensitive.
Payload shape
The webhook body is identical to GET /executions/{execution_id}. See ../references/execution-payload.md for the full field list, and ../references/call-statuses.md for the order in which statuses fire.
Idempotency
The same execution can produce multiple webhook deliveries as status transitions (scheduled → queued → in-progress → completed). Dedupe by (execution_id, status) — never by execution_id alone, or you'll discard later updates.
See also
../references/execution-payload.md — every field in the payload.
../references/call-statuses.md — status order, terminal-status filter.
get-executions — pull historical data for executions where the webhook failed.
debug-bolna-calls — diagnose missed deliveries.
1---2name: setup-webhook3description: Configure Bolna webhooks for real-time call status and execution updates, validate webhook URLs, receive payloads, reconcile execution IDs, and build a local receiver. Use for CRM sync, dashboards, post-call automation, Make, Zapier, n8n, or custom backend integrations.4license: MIT5---67# Setup Bolna Webhooks89## What Bolna sends1011Bolna sends HTTP POST requests to the configured webhook URL as call status and execution data changes. Treat the webhook payload as the execution object; use `get-executions` for the same execution ID to reconcile missed or duplicate delivery.1213## Where to configure1415- Dashboard: agent Analytics tab, "Push all execution data to webhook".16- API: set `agent_config.webhook_url` when creating or patching an agent.1718## API patch1920```bash21curl --request PATCH \22 --url "https://api.bolna.ai/v2/agent/$AGENT_ID" \23 --header "Authorization: Bearer $BOLNA_API_KEY" \24 --header "Content-Type: application/json" \25 --data '{26 "agent_config": {27 "webhook_url": "https://example.com/bolna/webhook"28 }29 }'30```3132## Receiver requirements3334- Public HTTPS URL in production.35- Accept POST JSON.36- Respond quickly with 2xx.37- Store by `execution_id` or `id` idempotently.38- Verify the payload shape before triggering irreversible downstream actions.39- If firewalling, check current Bolna docs for webhook source IPs before allow-listing.4041## Local test receiver4243```bash44python3 setup-webhook/scripts/webhook_receiver.py --port 808045```4647Expose with a tunnel such as ngrok or Cloudflare Tunnel, then configure the public HTTPS URL in Bolna.4849## Minimal payload handling pattern50511. Parse JSON.522. Extract execution ID, status, agent ID, phone numbers, transcript, recording URL, and extracted data.533. Upsert into your database by execution ID.544. Trigger automation only after relevant terminal statuses, usually `completed`, `failed`, `no-answer`, `busy`, or `error`.555. If payload is incomplete, call `GET /executions/{execution_id}`.5657## Common automations5859- Send summary and recording to CRM.60- Update lead status from extracted data.61- Create a support ticket after failed handoff.62- Send WhatsApp, SMS, or email through Make, Zapier, n8n, or custom code.63- Build live dashboard cards from `queued`, `ringing`, `in-progress`, and `completed`.6465## Source IP to whitelist6667Bolna delivers webhooks from a single source IP:6869```7013.203.39.15371```7273Add this to your server's firewall allow-list. Reject anything else if your endpoint is sensitive.7475## Payload shape7677The webhook body is identical to `GET /executions/{execution_id}`. See `../references/execution-payload.md` for the full field list, and `../references/call-statuses.md` for the order in which statuses fire.7879## Idempotency8081The same execution can produce multiple webhook deliveries as `status` transitions (`scheduled` → `queued` → `in-progress` → `completed`). Dedupe by `(execution_id, status)` — never by `execution_id` alone, or you'll discard later updates.8283## See also8485- `../references/execution-payload.md` — every field in the payload.86- `../references/call-statuses.md` — status order, terminal-status filter.87- `get-executions` — pull historical data for executions where the webhook failed.88- `debug-bolna-calls` — diagnose missed deliveries.