Before you begin
- An outbound Voice agent in the dashboard with a script, a voice, and a phone number. If you don’t have one yet, follow the dashboard quickstart. The agent should be stopped while you set it up.
- A public HTTPS endpoint that can receive
POSTrequests. For local testing, a tunneling tool such as ngrok works. - Node.js 18+ or Python 3.9+ if you want to run the code samples (cURL works too).
1
Create an API key
In the dashboard, open Settings → API Keys and create a key. See API keys for details.Store it in an environment variable so the samples below can use it:Send the key in the
Authorization header with no Bearer prefix.2
Find your agent ID
GET /agents needs your account ID, so first fetch it from GET /organization. The first item is the account the key belongs to; any subaccounts follow.id of your outbound agent:3
Subscribe a webhook
Tell Callers where to send results. This example asks for two events: The URL must be HTTPS. Subscribing the same URL again merges the new events into the existing webhook instead of adding a duplicate. See Webhook events for every event you can subscribe to.
CALL_FINISHED (every call, once the call has fully ended) and POST_PROCESSING_FINISHED:INTERESTED (the contact reached the agent’s goal).4
Add contacts
Add the people to call with the bulk endpoint. Each contact needs a If
name, a phone number in international format, and a data object. Keys in data become variables in your script, so {{company}} in the script is filled from data.company.Response
added + modified is lower than requested, some contacts were skipped (for example, an invalid phone number). See Manage contacts.5
Start the agent
start on an agent that is already active, you get 400 with Campaign already activated., which is safe to ignore.6
Receive the webhook
When a call ends, Callers sends a Key fields in the payload:
POST with the full call payload to your URL. Respond with any 2xx status quickly, then process the data.This minimal receiver also verifies the X-Signature header so you only trust requests from Callers. Download the public key from Validating webhook signatures and save it as callers-public-key.pem.See Webhook payload for every field.
7
Fetch the call and recording
You can re-fetch the same payload at any time, for example to backfill a missed delivery. Use Recording links can expire (signed links are valid for about an hour), so request a fresh URL whenever you need to play or download a recording rather than storing the link.
campaign.id and id from the webhook:Troubleshooting
Every request returns 403 Forbidden resource
Every request returns 403 Forbidden resource
The key is missing, mistyped, revoked, or sent with a
Bearer prefix. Send the raw key: Authorization: <key>. If you send x-sub-organization-id, make sure it’s a subaccount of the key’s account.GET /agents returns 400
GET /agents returns 400
organizationId is a required query parameter. Get it from GET /organization.Adding contacts returns 'Not allowed to create contacts on incoming campaigns.'
Adding contacts returns 'Not allowed to create contacts on incoming campaigns.'
The agent is an inbound agent. Contacts can only be added to outbound agents.
The agent is active but no calls go out
The agent is active but no calls go out
Check the agent’s availability hours and time zone, that it has an outbound phone number, and that the contacts still have attempts left (not already completed or archived). Contacts on the Do Not Call list are skipped.
My webhook never fires
My webhook never fires
Confirm the URL is public HTTPS and returns
2xx. Check which events you subscribed to: CALL_FINISHED fires for every call, while POST_PROCESSING_FINISHED:* events fire only for the matching outcome. Delivery attempts are logged on each call in the dashboard. See Webhooks overview.Next steps
Launch outbound calls
Production patterns for running outbound agents from your system.
Webhook events
Choose the events your integration needs.
Validate signatures
Verify that webhooks come from Callers.
API introduction
Errors, pagination, and conventions.