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

# Rate Limits: Per-Minute and Monthly Quotas

> Understand CS2Cap's per-minute and monthly request limits, how to read rate-limit headers, and best practices for staying within your quota.

CS2Cap enforces two independent rate limits on every API key: a per-minute burst limit and a monthly quota. Exceeding either returns a `429` response with machine-readable headers that tell you exactly when you can retry. Understanding how these limits work — and which endpoints count against them — lets you design efficient integrations that never get blocked unexpectedly.

## Limits by tier

| Tier    | Requests / minute | Requests / month |
| ------- | :---------------: | :--------------: |
| Free    |         20        |       1,000      |
| Starter |         40        |      50,000      |
| Pro     |        100        |      500,000     |
| Quant   |        300        |     1,000,000    |

### Special limits for bulk snapshot endpoints

[`POST /prices`](/api-reference/prices#post-/prices-—-stream-full-prices-snapshot) and [`POST /bids`](/api-reference/bids#post-/bids-—-stream-full-bids-snapshot) stream a full NDJSON snapshot of current listings/bids across specified providers. Each call counts as one request against your monthly quota (like any core endpoint) and is **additionally** subject to a **rolling 24-hour cap on successful stream starts** per API key — **50/day on Pro, 300/day on Quant**, tracked per endpoint. Only one stream may be active per API key per endpoint; a second concurrent request returns `409`. Only successful starts count toward the 24-hour cap; pace loops with `X-RateLimit-Remaining` and `X-RateLimit-Reset`.

## Which endpoints consume monthly quota

Monthly quota applies to **public core market-data endpoints** — prices, bids, candles, history, sales, items, providers, FX, and market analytics. These are the endpoints that drive the most data volume.

The following route categories are **exempt from monthly quota** (they still have burst protection, but they do not count against your 1,000 / 50,000 / 500,000 / 1,000,000 monthly total):

* Account and billing management routes
* Email verification and account recovery routes
* Alert creation, listing, and management routes
* Webhook configuration routes

## Rate limit response headers

When you are approaching or have exceeded a limit, the API includes the following headers on the response:

| Header                  | Description                                                                                                                     |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `Retry-After`           | Seconds to wait before the next request will succeed. Present on `429` responses and bulk-stream `409` active-stream conflicts. |
| `X-RateLimit-Limit`     | Your tier's monthly quota.                                                                                                      |
| `X-RateLimit-Remaining` | Monthly quota requests remaining in the current billing period.                                                                 |
| `X-RateLimit-Reset`     | Unix timestamp (seconds) when the monthly quota resets.                                                                         |
| `X-RateLimit-Tier`      | Your current tier identifier (`free`, `starter`, `pro`, or `quant`).                                                            |

### Example 429 response headers

```http theme={"theme":"github-dark-default"}
HTTP/1.1 429 Too Many Requests
Retry-After: 12345
X-RateLimit-Limit: 500000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 12345
X-RateLimit-Tier: pro
```

<Note>
  On the bulk streaming endpoints the `X-RateLimit-*` headers describe that endpoint's 24-hour stream-start quota (not the monthly quota) and appear on successful `200` responses too.
</Note>

## Error codes

Both rate limit conditions return HTTP `429` with a machine-readable `code` field in the response body.

| Code                                | HTTP status | Meaning                                                                                                                                              |
| ----------------------------------- | :---------: | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `RATE_LIMIT_EXCEEDED`               |     429     | Per-minute burst limit hit. Wait for the number of seconds in `Retry-After`.                                                                         |
| `RATE_LIMIT_MONTHLY_QUOTA_EXCEEDED` |     429     | Monthly quota exhausted. Requests will resume at the start of the next billing period.                                                               |
| `RATE_LIMIT_STREAM_QUOTA_EXCEEDED`  |     429     | Rolling 24-hour bulk-stream-start quota exhausted on `POST /prices` or `POST /bids`. Retry after `Retry-After` seconds, when the next slot frees.    |
| `STREAM_ALREADY_ACTIVE`             |     409     | A bulk stream is already active for this API key on this endpoint. Wait for it to finish, or wait for the `Retry-After` seconds before trying again. |

```json theme={"theme":"github-dark-default"}
{
  "code": "RATE_LIMIT_EXCEEDED",
  "detail": "Rate limit exceeded. Retry after 12 seconds."
}
```

## Best practices

<Tip>
  Always read the `Retry-After` header on a `429` response and wait the indicated number of seconds before retrying. Retrying immediately wastes quota and continues to return `429`.
</Tip>

* **Check `X-RateLimit-Remaining` proactively.** If your remaining monthly quota is low, throttle your request rate rather than waiting for a hard block.
* **Batch requests wherever possible.** Use [`POST /prices/batch`](/api-reference/prices#post-/prices/batch-—-batch-prices-lookup) and [`POST /bids/batch`](/api-reference/bids#post-/bids/batch-—-batch-bids-lookup) (Starter, Pro, and Quant) to fetch up to 100 items in a single request instead of making one request per item.
* **Use [`POST /prices`](/api-reference/prices#post-/prices-—-stream-full-prices-snapshot) for bulk data.** One call returns the entire catalog. Pace your scheduler against the rolling 24-hour stream-start quota (50/day Pro, 300/day Quant, per endpoint) and don't run two streams of the same endpoint at once.
* **Treat monthly quota as a budget.** Allocate quota across your use cases. On Free (1,000 requests/month), keep calls exploratory; on Starter (50,000 requests/month), use batch lookups for known item sets instead of per-item polling loops.
* **Handle `429` with exponential backoff** when `Retry-After` is not present, adding jitter to avoid synchronized retry storms across multiple keys.
