Outbound Calls

Trigger outbound calls to customers via API, schedule calls, and run batch calling campaigns with your voice agents.

Outbound Calls

Outbound calls let your voice agent proactively reach out to customers. Use them for appointment reminders, follow-ups, lead qualification, surveys, collections, and any scenario where you need to initiate contact.

Triggering an Outbound Call via API

Make a single outbound call by sending a POST request:

curl -X POST "https://api.thinnest.ai/voice/outbound/dial" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "agent_id": "agent_xyz",
    "to_number": "+14155551234",
    "from_number": "+18005551234",
    "context": {
      "customer_name": "Jane Doe",
      "appointment_date": "March 10, 2026",
      "appointment_time": "2:00 PM"
    }
  }'

Response:

{
  "call_id": "call_abc123",
  "status": "initiating",
  "agent_id": "agent_xyz",
  "to_number": "+14155551234",
  "from_number": "+18005551234",
  "created_at": "2026-03-05T14:00:00Z"
}

Request Parameters

ParameterTypeRequiredDescription
agent_idstringYesThe voice agent to use for the call
to_numberstringYesDestination phone number (E.164 format)
from_numberstringYesYour caller ID number (must be verified)
contextobjectNoKey-value data passed to the agent's prompt
scheduled_atstringNoISO 8601 timestamp to schedule the call
max_durationintegerNoMaximum call duration in seconds (default: 600)
recordingbooleanNoEnable call recording (default: agent setting)
webhook_urlstringNoURL to receive call status updates

Call Status Updates

If you provide a webhook_url, thinnestAI sends status updates as the call progresses:

{
  "call_id": "call_abc123",
  "status": "ringing",
  "timestamp": "2026-03-05T14:00:01Z"
}

Possible statuses:

StatusDescription
initiatingCall is being set up
ringingPhone is ringing
in_progressCall is connected, conversation active
completedCall ended normally
no_answerRecipient did not answer
busyLine was busy
failedCall could not be completed
voicemailVoicemail detected

Setting Up Caller ID

Your outbound calls need a verified caller ID — the number that appears on the recipient's phone.

Using a Twilio Number

Any Twilio number in your account can be used as a caller ID:

  1. Go to Settings → Phone Numbers.
  2. Select or purchase a number.
  3. Use that number as from_number in your API calls.

Caller ID Best Practices

  • Use a local number — Calls from local area codes have higher answer rates than toll-free numbers.
  • Register for STIR/SHAKEN — Verify your numbers to avoid "Spam Likely" labels.
  • Use consistent numbers — Customers who see the same number calling are more likely to answer.
  • Set up a voicemail — If customers call back, they should reach your agent or a greeting.

Scheduling Calls

Single Scheduled Call

Schedule a call for a specific time:

curl -X POST "https://api.thinnest.ai/voice/outbound/dial" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "agent_id": "agent_xyz",
    "to_number": "+14155551234",
    "from_number": "+18005551234",
    "scheduled_at": "2026-03-10T14:00:00-05:00",
    "context": {
      "purpose": "appointment_reminder",
      "appointment_date": "March 11, 2026"
    }
  }'

Canceling a Scheduled Call

curl -X POST "https://api.thinnest.ai/voice/outbound/hangup" \
  -H "Authorization: Bearer YOUR_API_KEY"

Checking Scheduled Calls

curl -X GET "https://api.thinnest.ai/voice/sessions?status=scheduled&limit=50" \
  -H "Authorization: Bearer YOUR_API_KEY"

Batch Calling via Campaigns

For high-volume outbound calling, use campaigns. A campaign takes a list of contacts and calls them systematically using your voice agent.

Creating a Campaign

  1. Go to Campaigns in the dashboard.
  2. Click Create Campaign.
  3. Configure the campaign:
SettingDescription
NameA descriptive name for the campaign
AgentThe voice agent to use
From NumberYour caller ID
Contact ListUpload a CSV or connect to your CRM
ScheduleWhen to start calling
Calling WindowHours during which calls are allowed (e.g., 9 AM - 6 PM)
TimezoneRespect recipient timezone
ConcurrencyHow many simultaneous calls (e.g., 5)
Retry PolicyHow many times to retry unanswered calls

Contact List Format

Upload a CSV with the following columns:

phone_number,name,email,custom_field_1,custom_field_2
+14155551234,Jane Doe,jane@example.com,Enterprise,March 10
+14155555678,John Smith,john@example.com,Starter,March 12

The columns beyond phone_number are passed as context to your agent.

Campaign via API

curl -X POST "https://api.thinnest.ai/campaigns" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Appointment Reminders - March",
    "agent_id": "agent_xyz",
    "from_number": "+18005551234",
    "contacts": [
      {
        "phone_number": "+14155551234",
        "context": {
          "name": "Jane Doe",
          "appointment": "March 10 at 2 PM"
        }
      },
      {
        "phone_number": "+14155555678",
        "context": {
          "name": "John Smith",
          "appointment": "March 12 at 10 AM"
        }
      }
    ],
    "settings": {
      "calling_window_start": "09:00",
      "calling_window_end": "18:00",
      "timezone": "America/New_York",
      "max_concurrent_calls": 5,
      "retry_attempts": 2,
      "retry_delay_minutes": 60
    }
  }'

Monitoring Campaign Progress

curl -X GET "https://api.thinnest.ai/campaigns/campaign_abc123" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response:

{
  "id": "campaign_abc123",
  "name": "Appointment Reminders - March",
  "status": "in_progress",
  "progress": {
    "total": 150,
    "completed": 87,
    "in_progress": 5,
    "pending": 42,
    "failed": 16
  },
  "started_at": "2026-03-05T09:00:00Z"
}

Pausing and Resuming

# Pause
curl -X POST "https://api.thinnest.ai/campaigns/campaign_abc123/pause" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Resume
curl -X POST "https://api.thinnest.ai/campaigns/campaign_abc123/resume" \
  -H "Authorization: Bearer YOUR_API_KEY"

Handling Voicemail Detection

When an outbound call reaches voicemail, your agent can detect it and respond appropriately.

Configuration

Enable voicemail detection in your agent settings:

{
  "voicemail_detection": {
    "enabled": true,
    "action": "leave_message",
    "message": "Hi, this is Sarah from Acme Corp calling about your upcoming appointment on {appointment_date}. Please call us back at 1-800-555-1234 to confirm. Thank you!"
  }
}

Voicemail Actions

ActionDescription
leave_messageLeave a pre-configured voicemail message
hang_upDisconnect immediately
retry_laterHang up and schedule a retry

Detection Accuracy

Voicemail detection works by analyzing audio patterns:

  • Answering machine greetings (beep detection)
  • Carrier voicemail messages
  • Ring-to-voicemail timing

Detection accuracy is typically above 90%. For critical calls, enable retry_later to catch cases where detection fails.

Outbound Call Best Practices

Compliance

  • Respect calling hours — Only call during appropriate hours in the recipient's timezone. A safe window is 9 AM to 8 PM local time.
  • Honor Do Not Call lists — Maintain and check DNC lists before calling.
  • Identify yourself — Your agent should clearly state who is calling and why within the first few seconds.
  • Provide opt-out — Give recipients a way to opt out of future calls.
  • Check local regulations — Outbound calling rules vary by country and state. Consult legal counsel for your specific use case.

Performance

  • Start with small batches — Test with 10-20 calls before running a full campaign.
  • Monitor answer rates — If answer rates drop below 30%, consider changing your caller ID or calling times.
  • Keep calls focused — Outbound calls should have a clear purpose. Long, meandering calls reduce effectiveness.
  • Use context — Pre-populate your agent with customer data so the conversation is relevant and personalized.
  • Review recordings — Listen to a sample of calls from each campaign to identify issues.

Retry Strategy

A good retry strategy improves contact rates without being aggressive:

AttemptDelayNotes
1st tryInitial call
2nd try1 hourDifferent time of day
3rd try24 hoursNext business day
Final try48 hoursLast attempt

After all retries are exhausted, mark the contact as "unreachable" and consider alternative channels (SMS, email).

Next Steps

On this page