Phone Calls
Give your voice agent a phone number so customers can call it — or have it call them. thinnestAI handles the entire call lifecycle: answering, speaking, listening, and hanging up.Prerequisites
- A thinnestAI account with voice enabled
- A voice agent configured with TTS and STT settings
- A phone number from Twilio, Vobiz, or Exotel (BYOK supported for all three)
Quick Start
1. Get a Phone Number
Option A: Twilio (recommended for most users)- Sign up at twilio.com
- Purchase a phone number in the Twilio Console
- In thinnestAI dashboard, go to Settings > Phone Numbers > Add > Twilio
- Enter your Account SID and Auth Token
- Get SIP credentials from your Vobiz account
- In thinnestAI, go to Settings > Phone Numbers > Add > Vobiz
- Enter your SIP trunk credentials
- In thinnestAI, go to Settings > Phone Numbers > Add > Exotel BYOK
- Enter your Exotel API key, API token, and account SID
- Pick the ExoPhone you want to import → click Import
- create an Exotel vSIP trunk so outbound calls route through LiveKit, and
- attempt to set the ExoPhone’s VoiceUrl to our inbound webhook so inbound calls reach your agent.
- In thinnestAI, go to Settings > Phone Numbers > Add > Plivo BYOK
- Enter your Plivo main-account auth_id (starts with
MA…) and auth_token - Pick the number you want to import → click Import
- a SIP credential for outbound auth
- an Origination URI pointing at our LiveKit SIP endpoint
- a Zentrunk outbound trunk so your agent can place calls from the number
- a Zentrunk inbound trunk so incoming calls route directly to your agent
- attaching the number to the inbound trunk
Main-account credentials only. Use your Plivo main-account
auth_id
(starts with MA…), not a subaccount (SA…). Subaccount credentials can
read your Zentrunk resources but typically can’t create new ones, which
makes Plivo BYOK import fail at the first step.- Go to Settings > Phone Numbers > Add > Existing
- Enter the number in E.164 format (e.g.,
+14155551234) - Point your provider’s webhook to:
2. Assign to Your Agent
- Open your voice agent
- Go to Deploy > Phone
- Select your phone number
- Configure the greeting message
- Click Enable
3. Test It
Call your number — your agent picks up immediately.Test from the studio (browser or phone)
Every voice agent’s builder page has a Try Voice Call dropdown with two options:- Web Call — opens a browser-based playground; you speak through your mic, the agent replies through your speakers. Best for quick iteration while editing the prompt.
- Phone Call — opens a modal, you enter your phone number, and the platform places a real outbound call to you. Best for verifying voice quality on the actual phone network and confirming the agent feels right end-to-end.
How it works
- Click Try Voice Call → Phone Call on the agent builder page.
- Type your number with country code (+91 or +1) and press Call my phone. Recently-used numbers are remembered for one-click retest.
- Your phone rings. Pick up and talk to the agent — same TTS, STT, prompt, and turn detection it would use in production.
- The modal walks through
Setting up → Ringing → Connected (with aMM:SS / 02:00counter)→Ended. You can hang up your phone or click End Call in the modal at any time.
Limits
Phone test calls are free — the platform absorbs the per-minute telephony cost. Bounded by:
Counters reset at midnight UTC.
Country support
What you can rely on
- Same code path as production. Pool dial reuses
dispatch_outbound_call— the same flow campaigns and/voice/outbound/dialuse. Whatever you hear is what your customers will hear. - Recorded and logged. Every test call is a normal voice session in your activity log, tagged
call_type=studio_testso analytics dashboards filter it out of paying-call totals. - No race on pool members. When two studio test calls fire at the same instant, only one wins the trial number (Postgres
FOR UPDATE SKIP LOCKED) — the other gets503 pool_exhaustedand the modal shows “All trial numbers are in use right now. Try again in a minute.” - No silent hang on failed dispatch. If the SIP dial never reaches your phone, the modal surfaces a
dispatch_timeouterror after 90 seconds instead of spinning forever.
Endpoints (for reference)
Inbound Calls
When someone calls your number:Configuring Inbound Behavior
Example Agent Configuration
Outbound Calls
Have your agent call customers proactively.Single Call via API
Scheduled Calls
Schedule a call for a future time:Batch Calls (Campaigns)
For bulk outreach, use Campaigns:- Create a campaign with your voice agent
- Upload a contact list (CSV or manual)
- Set schedule, concurrency, and retry rules
- Launch — the platform calls each contact automatically
Call Status Webhook
Track call progress by providing a webhook URL:initiating, ringing, in_progress, completed, failed, no_answer.
Exotel inbound setup (BYOK)
After importing an Exotel BYOK number, inbound calls only reach your agent once an App on the Exotel side points at our webhook. We try to set this automatically during import via Exotel’sIncomingPhoneNumbers API — if that works, you’re done. If it doesn’t (your Exotel account uses the newer Flow Builder, or the SID couldn’t be resolved), do the manual setup below.
Find the webhook URL
Every imported number has a unique webhook URL of the form:/exotel/incoming/...), not under /voice/. The dashboard always shows the exact URL for the row so you don’t have to remember.
Open Settings > Phone Numbers, find the row for your Exotel number, and click the gear icon next to the BYOK pill. The modal shows the exact webhook URL for that number (with a copy button) plus a Retry auto-configure button that calls the Exotel API again.
Retry auto-configure
The fastest path. The modal’s Retry auto-configure button hits:VoiceUrl to our webhook. Safe to retry. Returns either { "configured": true } (you’re done) or { "configured": false, "manual_steps": "…" } (use the manual setup below).
Manual setup in the Exotel dashboard
If auto-configure didn’t take:- Open the Exotel dashboard.
- Go to Apps → Create new App.
- Drag a Passthru applet onto the flow. Do not use the Voicebot applet — it expects a different audio protocol that LiveKit doesn’t speak.
- Paste the webhook URL (from the gear-icon modal) into the Passthru applet’s URL field. Save the App.
- Go to ExoPhones, find your number, and assign the App you just created.
- Place a test call to confirm.
Why the Voicebot applet doesn’t work
The Voicebot applet streams raw audio to a custom WebSocket endpoint using Exotel’s proprietary protocol. thinnestAI routes calls through LiveKit SIP, so the inbound flow needs a Passthru applet that hits our HTTP webhook — we respond with ExoML<Dial><Sip> and Exotel forwards the call to LiveKit.
SIP Trunking
For enterprise setups, connect your existing PBX or contact center via SIP:Benefits
- Use existing phone numbers — no porting needed
- Keep your current PBX infrastructure
- Route some calls to AI, others to humans
- Failover between providers
Call Analytics
Every call generates:- Duration and timestamps
- Full transcript (caller and agent)
- Recording (if enabled)
- Token usage and cost
- Caller phone number (auto-captured as a lead)
Pricing
Exact rates depend on your Twilio/Vobiz plan and the TTS/STT providers you choose.

