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

# Outbound calls — place AI voice calls programmatically

> Place a single outbound voice call from your registered number to any destination using the Kataven Python or Node SDK. Caller-ID validation, retries, and per-tenant cost-cap planning.

```python theme={null}
result = client.calls.originate(
    from_number="+12025550123",
    to_number="+14155550100",
    agent_id="<agent uuid>",
)
```

The pipeline is documented in [Telephony](/concepts/telephony) — caller-ID
ownership check, cost-cap check, decrypt creds, dispatch to Call Processor.

## Cost-cap behavior

If your account is at its cap, the call returns `429`:

| `429` reason                    | Cause                                 |
| ------------------------------- | ------------------------------------- |
| `Concurrent call limit reached` | Too many calls in flight right now.   |
| `Call rate limit`               | Too many calls in the current minute. |
| `Daily call limit reached`      | Today's call budget exhausted.        |
| `Daily minute budget exhausted` | Today's talk-time budget exhausted.   |

Pause and retry, or raise the cap with
`client.call_limits.update(...)`.

## Watch the call live

The response includes `session_id`. Open
`https://hub.kataven.ai/conversations/<session_id>` to see the
transcript stream as the call happens.

For programmatic monitoring, the Context Service has a separate HTTP
admin surface — see the Context Service docs for `/api/conversations/*`.

## Outbound at scale

For more than a handful of calls, use [Campaigns](/concepts/campaigns)
instead — they handle concurrency budgeting, retries, and CSV-driven
dispatch for you.
