# POST /api/v1/inboxes/:id/calls

Auth: Bearer

HTML: https://cooperemail.com/docs/reference/place-call

## Summary

Place a call from the inbox phone number. say is spoken with text-to-speech and must be 1 to 1000 characters (HTTP 400 missing_say or say_too_long). mode is say or say_and_record. say_and_record speaks, then records the reply as a voicemail message. to is a US or Canada number (HTTP 400 international_not_allowed). Premium-rate numbers return HTTP 400 premium_rate_blocked. An inbox with no active number returns HTTP 409 phone_number_not_found. A paused inbox returns HTTP 403 inbox_paused. Free has no voice minutes. Starter includes 30 minutes per active number each month. Pro includes 300 minutes, plus 30 for each active number past the 3 included numbers. Outbound calls past that allowance return HTTP 402 plan_limit_exceeded with upgrade_url and resource voice_minutes. Each account can place at most 100 calls per UTC day (HTTP 409 daily_call_cap). The stored message has channel voice. Status callbacks set status to queued, ringing, completed, no-answer, or failed, and duration_seconds. An inbound caller hears the greeting, then a recording stored as a separate message with channel voicemail, type voicemail, the caller number, duration_seconds, transcript, and recording_url. client_id and Idempotency-Key follow the send rules. MCP tool cooper_place_call.

## Request

```json
{
  "to": "+14155550100",
  "say": "Tuesday works.",
  "mode": "say"
}
```

## Response

HTTP 201. Sample values illustrate the schema.

```json
{
  "id": "msg_example",
  "inbox_id": "inb_example",
  "thread_id": "thr_example",
  "direction": "outbound",
  "channel": "voice",
  "from": "+14155550123",
  "to": [
    "+14155550100"
  ],
  "subject": "Call",
  "text": "Tuesday works.",
  "status": "queued",
  "duration_seconds": null,
  "created_at": "2026-10-18T12:00:00.000Z"
}
```

## Errors

- HTTP 400 missing_say
- HTTP 400 international_not_allowed
- HTTP 400 premium_rate_blocked
- HTTP 409 phone_number_not_found
- HTTP 403 inbox_paused
- HTTP 402 plan_limit_exceeded
- HTTP 409 daily_call_cap
- HTTP 404 not_found
- HTTP 400 say_too_long
- HTTP 400 invalid_e164
- HTTP 402 voice_minutes
- HTTP 404 inbox_not_found

The live `message` is the sentence for that code. Branch on `code`.

```json
{
  "error": {
    "type": "invalid_request",
    "code": "missing_say",
    "docs_url": "https://cooperemail.com/docs#missing_say"
  }
}
```

## Idempotency

Idempotency-Key is 1 to 256 characters of letters, digits, and - . _ ~. The same key and the same request within 24 hours returns the original response with HTTP 200 and Idempotent-Replayed: true. A different request is HTTP 409 idempotency_key_conflict. A second call while the first is running is HTTP 409 idempotency_request_in_progress. An empty or invalid key is HTTP 400 invalid_idempotency_key. client_id is checked first when both are set.
