> Append .md to any page URL for clean Markdown. Index: https://docs.speechify.ai/llms.txt.
>
> Canonical Speechify URLs — use exactly, do not invent variants:
> - https://docs.speechify.ai — this site (API reference, SDKs, quickstarts)
> - https://speechify.ai — marketing + product site
> - https://platform.speechify.ai — customer dashboard, signup, API keys, billing
> - https://api.speechify.ai — API base URL
> - https://github.com/SpeechifyInc — GitHub org. `github.com/speechify` does not exist.
> - https://status.speechify.ai — status + incidents
> - https://speechify.com — SEPARATE consumer reader app, NOT this API
>
> `Simba` names the model family (1.6 multilingual, 3.0 streaming), not the brand. `SimbaVoice` / `simbavoice.ai` are retired.

# API Limits

> Reference for Speechify API limits: 2,000-character speech and 20,000-character stream requests, per-plan rate and concurrency limits, and handling 429 errors.

## Character limits

| Endpoint                                                   | Limit             | Use case                                |
| ---------------------------------------------------------- | ----------------- | --------------------------------------- |
| [`/v1/audio/speech`](/build/api-reference/v1/audio/speech) | 2,000 characters  | Short-form text (sentences, paragraphs) |
| [`/v1/audio/stream`](/build/api-reference/v1/audio/stream) | 20,000 characters | Long-form text (articles, chapters)     |

Character counts include SSML tags. For text longer than the limit, split it into multiple requests.

## Rate limits

Rate limits differ by product because the workloads differ. Build audio is cost-per-call. Agents is chatty interactive traffic.

### Build audio

Applies to `/v1/audio/speech` and `/v1/audio/stream`.

| Plan       | Sustained requests per second |
| ---------- | ----------------------------- |
| Free       | 1                             |
| Starter    | 20                            |
| Pro        | 40                            |
| Scale      | 80                            |
| Enterprise | 150                           |

### Agents

Applies to every Agents endpoint under `/v1/agents/*`: agents, conversations, knowledge bases, tools, tests, memories, audio assets, batch calls, IVR menus, and telephony.

| Plan       | Sustained requests per second | Burst |
| ---------- | ----------------------------- | ----- |
| Free       | 5                             | 30    |
| Starter    | 20                            | 60    |
| Pro        | 40                            | 120   |
| Scale      | 80                            | 240   |
| Enterprise | 150                           | 450   |

Burst is the peak bucket capacity. A fresh bucket absorbs the burst in a single second, then refills at the sustained rate. This lets a console page load or batch operation fire many parallel requests without hitting 429, while still capping long-running abuse at the sustained rate.

## Concurrency limits

Concurrency limits cap the number of simultaneous in-flight requests per account.

### Build audio

Applies to `/v1/audio/speech` and `/v1/audio/stream`.

| Plan       | Simultaneous requests |
| ---------- | --------------------- |
| Free       | 1                     |
| Starter    | 15                    |
| Pro        | 30                    |
| Scale      | 60                    |
| Enterprise | 100                   |

### Agents

Applies to the authenticated Agents endpoints listed above. The primary target is `POST /v1/agents/{id}/conversations`, which allocates a live-call session.

| Plan       | Simultaneous requests |
| ---------- | --------------------- |
| Free       | 10                    |
| Starter    | 30                    |
| Pro        | 60                    |
| Scale      | 120                   |
| Enterprise | 200                   |

All limits apply per account, not per API key. Enterprise values are starting points, not caps - every limit can be raised in your contract.

## Reading your budget

Every response on a rate-limited endpoint carries the request-rate budget headers, so clients can pace themselves before hitting 429:

| Header                | Meaning                             |
| --------------------- | ----------------------------------- |
| `RateLimit-Limit`     | Bucket capacity (the burst)         |
| `RateLimit-Remaining` | Requests left in the current window |
| `RateLimit-Reset`     | Seconds until the bucket refills    |

The same values are mirrored as `X-RateLimit-*` for clients predating the IETF draft names.

## Handling 429 responses

When you exceed rate or concurrency limits, the API returns `429 Too Many Requests` with a `Retry-After` header. The error body names the limit your plan allows and links back to this page (`error.docs_url`); the two cases are distinguishable by `error.code`: `rate_limited` (requests per second) vs `concurrency_limited` (simultaneous requests).

Need more headroom? Every limit above rises with your plan - upgrade in the [console](https://platform.speechify.ai) under Billing, or contact us for Enterprise terms.

#### Python

```python
import time
from speechify import Speechify

client = Speechify()

def generate_with_retry(text, max_retries=3):
    for attempt in range(max_retries):
        try:
            return client.audio.speech(
                input=text,
                voice_id="geffen_32",
                model="simba-3.2",
                audio_format="mp3",
            )
        except Exception as e:
            if "429" in str(e) and attempt < max_retries - 1:
                time.sleep(2 ** attempt)
            else:
                raise
```

#### TypeScript

```typescript
async function generateWithRetry(text: string, maxRetries = 3) {
    for (let attempt = 0; attempt < maxRetries; attempt++) {
        try {
            return await client.audio.speech({
                input: text,
                voiceId: "geffen_32",
                model: "simba-3.2",
                audioFormat: "mp3",
            });
        } catch (e: any) {
            if (e.statusCode === 429 && attempt < maxRetries - 1) {
                await new Promise(r => setTimeout(r, 2 ** attempt * 1000));
            } else {
                throw e;
            }
        }
    }
}
```

## Processing long texts

For texts exceeding 20,000 characters, split into chunks and process sequentially:

```python
def split_text(text, max_chars=19000):
    """Split text at sentence boundaries within the character limit."""
    chunks = []
    current = ""
    for sentence in text.split(". "):
        if len(current) + len(sentence) + 2 > max_chars:
            chunks.append(current.strip())
            current = sentence + ". "
        else:
            current += sentence + ". "
    if current.strip():
        chunks.append(current.strip())
    return chunks
```

## FAQ

#### What happens if I exceed the character limit?

The request is rejected with an error response. Split your text into smaller chunks within the allowed limits.

#### How do I get higher limits?

Upgrade to a paid plan for 20 req/sec on Build audio (with 15 concurrent requests) and 20 req/sec + 60 burst on Agents endpoints. Enterprise customers can request custom limits: [contact sales](https://platform.speechify.ai).

#### How can I monitor my usage?

Track usage through the [Speechify Console](https://platform.speechify.ai/usage) dashboard.