Build Custom AI Voice Telephony with Simple APIs
Trigger calls, fetch results and transcripts, and create or manage voice agents programmatically with a clean REST API and post-call webhooks.
Updated
REST & Webhook Architecture
Trigger outbound calls with simple POST requests and receive each call's result via an HTTP webhook when it ends.
Agents Through the API
Create, list and fetch voice agents with the same API key, including their prompt, voice, language and the fields to extract after each call.
Mid-Call Tool Calls
The agent can hit your endpoints during the conversation and speak the result, so it gives real answers instead of promising a callback.
Structured Completion Payloads
Transcript, recording URL, disposition and your defined extraction fields arrive as JSON ready to write into your database.
Fetch Any Call by ID
Look up a call's status and results at any time, so a reconciliation job can recover any webhook your server missed.
The API exists so that a phone call can become an ordinary step in your software, triggered the same way you would send an email or write a database row. You post a number and some context; the platform handles carrier routing, streaming speech recognition, reasoning, synthesis and retries; you receive a webhook with structured results when it ends.
What that removes is substantial. Building the same capability directly on carrier infrastructure means solving SIP signalling, media handling, jitter and echo, concurrency management, number provisioning and regulatory screening before you write any product code — and then operating all of it.
The Four-Step Integration
Most integrations use a handful of endpoints and one webhook handler, and are working end to end within a day.
- Configure the agent once — Prompt, voice, available tools and the structured fields you want extracted. This is setup, not per-call work.
- Trigger the call — Post the destination number, agent ID and a JSON context object. You get a call ID back immediately; dialling happens asynchronously.
- Handle the result webhook — One event per call, call.completed or call.failed, keeps your system in sync without polling.
- Process the completion payload — Transcript, recording, disposition and extracted fields, delivered when the call ends.
Make your webhook handler idempotent and fast — acknowledge first, process asynchronously — and run a reconciliation job that fetches any call whose webhook you missed.
Failure Modes Worth Handling Explicitly
Voice introduces failure modes a purely HTTP integration does not have, because there is a physical network and a human on the other end. Treating any non-success as a generic error loses information you need.
- Never answered — The most common outbound outcome by volume. Your data model needs attempt-level records, not one result per contact.
- Answered by voicemail — Dispositioned separately. Counting these as connects quietly corrupts every ratio you calculate.
- Answered then immediately hung up — Diagnostically important — it points at your opening line rather than anything technical.
- Partial extraction — Call completed but not every question answered. Make fields nullable and define what counts as a usable result.
- Transfer failed — Nobody picked up the hot transfer. Define a fallback — usually a booked callback — rather than stranding the customer.
- Duplicate triggers — Call creation has no idempotency key, so never blindly resend a request that timed out; check the call first so the customer is not dialled twice.