> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sendora.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Voice Calls

> Trigger outbound AI calls directly, browse call history, and retrieve transcripts, without needing a campaign.

## Overview

To speak with an agent directly in a browser without dialing a phone number, see [WebRTC browser calls](/guides/webrtc-browser-calls).

The Voice Calls API lets you place an AI voice call to any lead immediately, without creating or launching a campaign. This is ideal for:

* **GHL workflow actions**, a workflow step that fires a call when a contact hits a stage
* **One-off outreach**, dialing a single lead from an external system
* **Post-event triggers**, calling someone who just filled in a form

Calls use Sendora's managed voice service. Transcripts and recordings appear in the lead's Unibox thread once the call ends.

## Place a call

```bash theme={"dark"}
curl -X POST https://api.sendora.ai/api/v1/public/voice/calls \
  -H "X-API-Key: sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "lead_id": "LEAD_ID",
    "agent_id": "AGENT_ID",
    "voicemail": {
      "enabled": true,
      "script": "Hi {{lead.first_name}}, this is Alex from Sendora. I just tried calling, I would love to connect. Give me a ring back when you get a chance. Thanks!"
    }
  }'
```

The response returns immediately with `status: "dialing"`. The actual call result (transcript, recording, outcome) is available via `GET /voice/calls/{id}` once the call ends, typically within 30 to 90 seconds.

```json theme={"dark"}
{
  "call_id": "a3f2b1c0-...",
  "status": "dialing",
  "message": "Call initiated. Transcript and recording will be available via GET /voice/calls/{id} once the call ends."
}
```

## Prompt personalization

Override the agent's system prompt for a single call with `{{lead.*}}` tokens resolved at dial time:

```json theme={"dark"}
{
  "lead_id": "LEAD_ID",
  "agent_id": "AGENT_ID",
  "prompt_override": "You are Alex calling {{lead.first_name}} at {{lead.company}}. They submitted a demo request 10 minutes ago, reference this immediately and confirm their interest.",
  "additional_variables": {
    "product": "Sendora Pro",
    "meeting_link": "https://cal.com/sendora/demo"
  }
}
```

## Voice override

Use a different managed voice for a specific call. Retrieve available voice IDs from `GET /public/voices`.

```json theme={"dark"}
{
  "lead_id": "LEAD_ID",
  "agent_id": "AGENT_ID",
  "voice_id": "voice-id-from-get-voices"
}
```

## List call history

```bash theme={"dark"}
curl "https://api.sendora.ai/api/v1/public/voice/calls?per_page=20" \
  -H "X-API-Key: sk_live_..."
```

Filter by lead, campaign, or outcome:

```bash theme={"dark"}
# Calls for a specific lead
curl "https://api.sendora.ai/api/v1/public/voice/calls?lead_id=LEAD_ID" \
  -H "X-API-Key: sk_live_..."

# Calls that went to voicemail
curl "https://api.sendora.ai/api/v1/public/voice/calls?disposition=voicemail" \
  -H "X-API-Key: sk_live_..."
```

Available `disposition` values: `answered`, `voicemail`, `no-answer`, `busy`, `failed`.

## Get transcript and recording

```bash theme={"dark"}
curl "https://api.sendora.ai/api/v1/public/voice/calls/CALL_ID" \
  -H "X-API-Key: sk_live_..."
```

```json theme={"dark"}
{
  "id": "Rt7YbN4cHs8AXk3p9LmQ2v",
  "lead_id": "b7Tq2WnE5uJx8KdR1mYs4Q",
  "agent_id": "2DFhs9pmIx0t9g4f4XfLTA",
  "disposition": "answered",
  "duration_seconds": 142,
  "recording_ref": "rec_...",
  "ai_summary": "Lead showed strong interest. Agreed to a demo on Friday.",
  "transcript": [
    { "role": "agent", "text": "Hi Sarah, this is Alex from Sendora. Is now a good time?" },
    { "role": "user", "text": "Sure, I have a few minutes." },
    { "role": "agent", "text": "Great! I wanted to follow up on the demo request you submitted..." }
  ],
  "started_at": "2026-06-25T10:00:00Z",
  "ended_at": "2026-06-25T10:02:22Z"
}
```

## Webhooks

Subscribe to `call.completed` to be notified when any call ends:

```json theme={"dark"}
{
  "event": "call.completed",
  "data": {
    "call_id": "...",
    "lead_id": "...",
    "disposition": "answered",
    "duration_seconds": 142,
    "recording_url": "https://..."
  }
}
```

See [Webhooks](/guides/webhooks) for setup instructions.

## Idempotency

Pass `idempotency_key` to safely retry on network failure without placing a duplicate call. Repeating a request with the same key returns the original call; no new call is placed and nothing is charged again:

```json theme={"dark"}
{
  "lead_id": "LEAD_ID",
  "agent_id": "AGENT_ID",
  "idempotency_key": "ghl-action-run-abc123"
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.