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

# Place Call

> Place an outbound call as an agent. This rings a real phone and costs money.

Place an outbound call. The agent calls `to` from `phone_line_id` and talks to whoever answers. The call is saved first, then sent to the call runtime. The response is **202 Accepted** with the call, usually `status: "dialing"`.

> [!WARNING]
>
> **This rings a real phone and costs money.** Only call numbers whose owners agreed to be called. Follow your local call-recording rules when `record` is on.

Costs: AI credits for speech, LLM and memory, plus the Dialer balance for line minutes on a 60db number (a BYO line bills your carrier). The workspace must have an active plan. Follow the call with [Get call](https://docs.60db.ai/api-reference/agents/get-call.md), or use the `call.completed` event.

## Request

### Headers

**Authorization** `string` *required*

Bearer token with your API key (scope `agents`)

**Content-Type** `string` *required*

application/json

### Path

**agentId** `string` *required*

The agent `id` (UUID)

### Body

**to** `string` *required*

Destination number in E.164 format, for example `+919999999999`

**phone\_line\_id** `string` *required*

The phone line `id` (UUID) to call from. See [List phone lines](https://docs.60db.ai/api-reference/agents/list-phone-lines.md)

**overrides** `object`

Per-call settings. Any key from the agent's `call_defaults`, plus `greeting` (up to 500 characters, `""` for none). A `greeting` replaces the agent's greeting for this call only. `transfer_targets` replaces the agent's call-transfer groups for this call (`[]` turns them off); same rules as [Create agent](https://docs.60db.ai/api-reference/agents/create-agent.md)

**metadata** `object`

Up to 4 KB of JSON. Returned on the call and sent in its events and tool calls. Use it for your own ids

## Response

**202 Accepted**

```json theme={null}
{
  "success": true,
  "data": {
    "id": "6b1f0c52-4d7e-4b8a-9d3e-2a1c8e7f0a11",
    "agent_id": "9c2e1d7a-0b3f-4e6a-8f1d-5a7b9c0e2d44",
    "agent_name": "Front desk",
    "phone_line_id": "2d8e4f10-6a3b-4c9d-8e7f-0b1a2c3d4e5f",
    "direction": "outbound",
    "to": "+919999999999",
    "from": "+919876543210",
    "status": "dialing",
    "reason": null,
    "duration_secs": null,
    "started_at": "2026-11-03T10:16:30.000Z",
    "connected_at": null,
    "ended_at": null,
    "record": true,
    "has_recording": false,
    "has_transcript": false,
    "summary": null,
    "cost": { "runtime_usd": null, "runtime_billing_status": "pending" },
    "source": "api",
    "metadata": { "crm_lead_id": "L-1042" },
    "created_at": "2026-11-03T10:16:30.000Z"
  }
}
```

`from` is the line's caller ID. `cost` is filled in when the call ends. See [Get call](https://docs.60db.ai/api-reference/agents/get-call.md) for every field.

## Errors

| Status | Code | Meaning |
| - | - | - |
| 400 | `VALIDATION_ERROR` | The body is invalid, or the agent has `tools` but no `tool_webhook_url`. `field` names it |
| 402 | `INSUFFICIENT_CREDITS` | Not enough AI credits to cover a minute of calls |
| 402 | `DIALER_BALANCE_EMPTY` | A 60db number needs a Dialer balance above zero |
| 403 | `POLICY_DENY` | No active plan, or the API key lacks the `agents` scope |
| 404 | `AGENT_NOT_FOUND` | No agent with this ID in your workspace |
| 404 | `PHONE_LINE_NOT_FOUND` | No phone line with this ID in your workspace |
| 404 | `KNOWLEDGE_COLLECTION_NOT_FOUND` | The agent's knowledge base was removed |
| 409 | `LINE_NOT_READY` | The phone line is still being set up. Try again shortly |
| 422 | `NUMBER_NOT_OWNED` | The 60db number is no longer in your Dialer. Pick another line |
| 422 | `KNOWLEDGE_COLLECTION_UNSUPPORTED` | The agent's knowledge base is a personal collection |
| 429 | `CONCURRENCY_LIMIT` | Two calls are already running in this workspace. Wait for one to end |
| 429 | `RATE_LIMITED` | The call runtime is busy. Retry shortly |
| 502 | `AGENTS_UPSTREAM_UNAVAILABLE` | The call runtime failed or did not answer. A call that was never confirmed is marked `failed` within about 2 minutes. Check [Get call](https://docs.60db.ai/api-reference/agents/get-call.md) before you retry |

## Example

```bash cURL theme={null}
curl -X POST https://api.60db.ai/agents/AGENT_ID/calls \
  -H "Authorization: Bearer your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+919999999999",
    "phone_line_id": "LINE_ID",
    "overrides": { "max_duration_secs": 120 },
    "metadata": { "crm_lead_id": "L-1042" }
  }'
```

```javascript JavaScript theme={null}
const call = await client.agents.call(agentId, {
  to: '+919999999999',
  phoneLineId: lineId,
  overrides: { max_duration_secs: 120 },
  metadata: { crm_lead_id: 'L-1042' },
});
const done = await client.agents.calls.waitForCompletion(call.id);
```

```python Python theme={null}
call = client.agents.call(agent_id, to="+919999999999", phone_line_id=line_id,
                          overrides={"max_duration_secs": 120},
                          metadata={"crm_lead_id": "L-1042"})
done = client.agents.calls.wait_for_completion(call["id"])
```


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