---
title: "Limits"
description: "Calls, minutes, calls live at once, numbers and call length — per plan — and what happens at a limit."
canonical_url: "https://www.agent-identity.dev/docs/phone/limits"
markdown_url: "https://www.agent-identity.dev/docs/phone/limits.md"
last_updated: "2026-10-09"
x_farming_labs_generated_preamble: true
agent:
  tokenBudget: 700
  task: "Know the phone limits for a plan and handle hitting one."
  outcome: "You know each limit, read remaining use from rate_limit, and retry after Retry-After on a 429."
  appliesTo:
    package:
      - "@aid/api"
  prerequisites:
    - "None."
  files:
    - "packages/domain/src/index.ts"
    - "apps/api/src/services/phone.ts"
  sideEffects:
    - "None."
  verification:
    - description: "Read current use."
      expect: "GET /v1/usage returns phone.numbers, calls today and minutes today against their limits."
  rollback:
    - "Not applicable."
  failureModes:
    - symptom: "429 phone.limit_exceeded when placing a call."
      resolution: "Wait Retry-After seconds. X-RateLimit-Remaining shows what is left."
    - symptom: "An incoming call is refused while several calls are live."
      resolution: "Incoming calls count toward the same limit on calls live at once. Upgrade for more."
---

# Limits
URL: /docs/phone/limits
LLM index: /llms.txt
Description: Calls, minutes, calls live at once, numbers and call length — per plan — and what happens at a limit.
Related: /docs/phone/placing-calls, /docs/phone/numbers

<!-- farming-labs:agent-contract:start -->
## Agent Contract

Task: Know the phone limits for a plan and handle hitting one.
Outcome: You know each limit, read remaining use from rate_limit, and retry after Retry-After on a 429.

### Applies To

- Package: `@aid/api`

### Prerequisites

- None.

### Files

- `packages/domain/src/index.ts`
- `apps/api/src/services/phone.ts`

### Side Effects

- None.

### Verification

- Read current use.
  - Expected: GET /v1/usage returns phone.numbers, calls today and minutes today against their limits.

### Rollback

- Not applicable.

### Failure Modes

- 429 phone.limit_exceeded when placing a call. — Recovery: Wait Retry-After seconds. X-RateLimit-Remaining shows what is left.
- An incoming call is refused while several calls are live. — Recovery: Incoming calls count toward the same limit on calls live at once. Upgrade for more.
<!-- farming-labs:agent-contract:end -->

# Limits

Limits apply to the whole organization, are enforced on the server, and depend on the plan.

| Limit | Free | Builder | Team | Enterprise |
| --- | --- | --- | --- | --- |
| Outgoing calls per rolling 24 hours | 100 | 500 | 5,000 | No fixed limit |
| Minutes per rolling 24 hours | 300 | 1,000 | 10,000 | No fixed limit |
| Calls live at once (in and out) | 3 | 5 | 30 | No fixed limit |
| Numbers | 2 | 3 | 20 | No fixed limit |
| Longest call | 10 min | 20 min | 40 min | No fixed limit |

Free plan values are the defaults on our hosted service; a self-hosted server can change them.

## How they are counted

- **Calls and minutes** count calls you place over the last 24 hours, excluding calls that never connected. Minutes are
  the summed length of those calls.
- **Calls live at once:** placing a call gets 429 when the live outgoing calls reach the limit; an incoming call is
  declined when all live calls, incoming and outgoing, reach it.
- **Longest call:** a call is ended automatically when it reaches its plan's length.
- **Destinations:** calls can only be placed to the country codes the server allows. On our hosted service that is
  `+1`, the US and Canada.

## At a limit

Placing a call over a limit returns `429` with `phone.limit_exceeded`, `Retry-After` (seconds), `X-RateLimit-Limit` and
`X-RateLimit-Remaining`. Every placed call returns `rate_limit` with the day's use, and `GET /v1/usage` shows numbers,
calls and minutes against the plan.

Only an organization with a verified owner can buy a number or place a call. Incoming calls are open to anyone you have
not blocked.

## Sitemap

See the full [sitemap](/sitemap.md) for all pages.
Docs-scoped sitemap: [/docs/sitemap.md](/docs/sitemap.md).
Well-known sitemap: [/.well-known/sitemap.md](/.well-known/sitemap.md).
