---
url: 'https://docs.apitube.io/platform/news-api/rate-limits.md'
description: Learn about the rate limits and quotas for the APITube News API.
---

# Rate Limits and Quotas

Your rate limit is the number of requests you can send per minute. If you exceed it, the API returns `429 Too Many Requests`.

:::tip
Your plan sets your request limit. Check the table below.
:::

## Rate limits

Limits apply **per account** to requests sent in the previous **minute**. All live keys share this limit; creating more keys does not increase it. Test keys (`api_test_`) have a separate limit.

| Plan                              | Rate limit                                                     |
|-----------------------------------|----------------------------------------------------------------|
| Free                              | 10 requests per minute, results limited to the first 5 pages   |
| Starter / Basic / Professional    | 50 requests per minute                                         |
| Corporate                         | 200 requests per minute                                        |

Starter, Basic and Professional allow **50 requests per minute**. Their quotas and features differ. Corporate allows **200 requests per minute**. On Free, requesting page 6 or later returns `400 ER0173`.

Exceeding the limit returns `429 ER0203`. Repeated violations can temporarily block your key. While blocked, requests return `429 ER0204`.

## Results per page

Your plan also limits `per_page`, the number of results per page. The default is `100` or your plan's maximum, whichever is lower. Without `per_page`, Free returns 10 articles and Starter returns 50.

| Plan         | Max `per_page` |
|--------------|----------------|
| Free         | 10             |
| Starter      | 50             |
| Basic        | 200            |
| Professional | 250            |
| Corporate    | 250            |

If `per_page` exceeds your plan's maximum, the API returns `400 ER0171`. The error message states the allowed value (`Limit is out of range. Your plan allows up to 10 results per page.`).

On **Free**, you can access 5 pages of 10 articles: at most **50 articles** per search.

## Title search window

Title searches can cover at most **31 days** of `published_at` per request. This limit applies to all plans and endpoints, including exports, SSE and WebSocket. It covers `title`, `title_starts_with`, `title_ends_with`, `title_pattern` and `query`.

| Request | Result |
|---------|--------|
| Title search without `published_at.start` / `published_at.end` | Last 31 days are searched. `200` with an `ER0366` warning in `meta.warnings` and an `x-query-window-clamped: 31` header |
| Title search with a range wider than 31 days | `400` with code `ER0110` |
| Title search with a range of 31 days or less | Runs as requested |
| Any request without a title search | No range limit |

To search a longer period, split it into ranges of 31 days or less and send a separate request for each range. See [Search window limit](/platform/news-api/everything#limits) for examples.

## Free plan delay

On Free, articles become available **12 hours after publication**. The delay applies to searches, counts, trends, [SSE](/platform/news-api/sse-stream), [WebSocket](/platform/news-api/websocket-stream) and [webhook](/platform/news-api/webhooks) delivery. Starter and higher plans have no added delay.

On Free, [exports](/platform/news-api/response-structure) other than JSON and the [Trends](/platform/news-api/trends) endpoint return `403 ER0706`. See [Plan gates](/platform/news-api/http-response-codes#plan-gates) for all features that require a paid plan.

## Fact Check

[Fact Check](/platform/news-api/fact-check) (`/v1/fact-check`) requires a paid plan and allows **10 requests per minute**. This limit applies in addition to your plan's overall rate limit. Exceeding it returns `429 ER0203`.

## Natural language prompt

The [`prompt`](/platform/news-api/ai/natural-language-search) parameter is available on **Basic and above**. On Free and Starter it returns `403 ER0706` before the translation runs, so no points are spent.

| Plan         | `prompt` |
|--------------|----------|
| Free         | No       |
| Starter      | No       |
| Basic        | Yes      |
| Professional | Yes      |
| Corporate    | Yes      |

The `prompt` parameter writes filters for you. You can also send those filters directly, including the boolean `query` parameter, without using `prompt`.

## SSE Stream Connections

Each plan has a limit on the number of concurrent SSE stream connections:

| Plan         | Max SSE Connections |
|--------------|---------------------|
| Free         | 0                   |
| Starter      | 2                   |
| Basic        | 2                   |
| Professional | 10                  |
| Corporate    | 50                  |

If you exceed the limit, the API will return a `429` error with code `ER0360`.

## Monitoring Rate Limits

Read these response headers to track your request limit:

| Header | Description |
|--------|-------------|
| `X-RateLimit-Limit` | The maximum number of requests you can make in the current time window |
| `X-RateLimit-Remaining` | The number of requests remaining in the current time window |
| `X-RateLimit-Reset` | The number of seconds remaining until the rate limit resets |

Example (a paid plan with a 50 requests-per-minute limit):

```
X-RateLimit-Limit: 50
X-RateLimit-Remaining: 49
X-RateLimit-Reset: 32
```

### Account and quota headers

These response headers show your plan, remaining points and balance. You can read them without a separate [`/v1/balance`](/platform/news-api/balance) request:

| Header | Description |
|--------|-------------|
| `X-Subscription-Plan` | The key's plan (`free`, `starter`, `basic`, `professional`, `corporate`) |
| `X-Points-Remaining` | Points left in the current quota period |
| `X-Balance-Remaining` | Prepaid pay-as-you-go balance left, in cents |
| `X-Budget-Remaining` | Cents left in this month's PAYG spending limit — **only present when a limit is set** |
| `X-Apitube-Mode` | `live` or `test`, so an SDK never has to parse the test marker out of the content |
| `X-Request-ID` | Unique id of the request — quote it when contacting support |

When `X-Points-Remaining` reaches `0`, the next request returns `402 ER0176`. When `X-Budget-Remaining` reaches `0`, requests billed to your balance return `402 ER0177`. Check these headers to stop requests before a limit is reached.

```
X-Subscription-Plan: basic
X-Points-Remaining: 48500
X-Balance-Remaining: 0
X-Apitube-Mode: live
X-Request-ID: e5efb02a-d9bd-45e7-8264-829167dd4842
```

## Spending your pay-as-you-go balance

To pay for requests beyond your plan quota, turn on balance spending in the dashboard. The switch is on
the **Pay as you go** page and under **Account → Plan & usage**. It is **off by default**.
Only the workspace owner can change it.

With balance spending off, requests beyond your quota return `402 ER0176`. This applies to REST, SSE,
WebSocket and webhooks. With it on, requests use your plan quota first, then your balance at $0.01 per request.

`X-Balance-Remaining` shows the money in your account even when balance spending is off. A positive balance
also removes Free plan restrictions. The switch only controls whether requests can spend that money.

## Pay-as-you-go spending limit

Set a **monthly spending limit** in the dashboard to cap spending from your prepaid balance. It resets at the start of each calendar month in UTC.

When a limit is configured, every response includes the remaining budget for the current month:

| Header | Description |
|--------|-------------|
| `X-Budget-Remaining` | Remaining monthly pay-as-you-go budget, in cents. Present only when a limit is set. |

Example (`50000` cents = $500 left this month):

```
X-Budget-Remaining: 50000
```

When you reach the monthly limit, requests charged to your balance return `402 ER0177`. You can wait until the next month or raise or remove the limit in the dashboard. Requests covered by your plan quota still work.
