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

# 8bitedge API plans: rate limits, quotas, and batch caps

> Compare Free, Starter, Pro, and Enterprise plan limits. Understand per-minute rate limits, daily caps, monthly quotas, and batch size ceilings.

The 8bitedge API enforces three independent limits on every request you make: a per-minute rate limit, a per-day cap, and a monthly quota. All three are determined by your plan. Exceeding a rate window returns a `429` response with a `Retry-After` header; exhausting your monthly quota on a non-overage plan returns `402`. Understanding these limits — and how to read them from response headers — lets you build integrations that degrade gracefully rather than failing hard.

## Plans comparison

| Plan       | Req/min | Req/day   | Monthly quota | Max batch | Max page |
| ---------- | ------- | --------- | ------------- | --------- | -------- |
| Free       | 30      | 1,000     | 10,000        | 10        | 25       |
| Starter    | 120     | 20,000    | 250,000       | 50        | 50       |
| Pro        | 600     | 200,000   | 2,500,000     | 100       | 100      |
| Enterprise | 3,000   | 2,000,000 | unmetered     | 250       | 200      |

## Rate limit headers

Every response from the API includes the following headers so you can track your rate limit consumption in real time:

<ResponseField name="X-RateLimit-Limit" type="integer">
  The per-minute request limit for your plan.
</ResponseField>

<ResponseField name="X-RateLimit-Remaining" type="integer">
  The number of requests remaining in the current one-minute window.
</ResponseField>

<ResponseField name="X-RateLimit-Reset" type="integer">
  Seconds until the current one-minute window resets and your allowance is restored.
</ResponseField>

<ResponseField name="Retry-After" type="integer">
  Present on `429` and `402` responses. The number of seconds you should wait before retrying.
</ResponseField>

You can inspect these headers directly by passing `-D -` (or `-i`) to curl:

```bash theme={null}
curl -s -D - "https://api.8bitedge.com/api/v1/games/titles" \
  -H "Authorization: Bearer $TOKEN" \
  -o /dev/null
```

```text theme={null}
HTTP/2 200
x-request-id: 5f3c1e2a-...-9b21
x-ratelimit-limit: 120
x-ratelimit-remaining: 117
x-ratelimit-reset: 42
```

## Rate limit exceeded (429)

When you exhaust your per-minute or per-day limit, the API returns `429` with the following error body and a `Retry-After` header indicating how many seconds to wait before retrying:

```json theme={null}
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Rate limit exceeded for the minute window.",
    "details": {
      "window": "minute",
      "limit": 120
    }
  }
}
```

The `details.window` field will be either `"minute"` or `"day"` depending on which limit was hit. The `details.limit` field shows the numeric threshold for that window.

## Monthly quota (402)

Plans without overage billing enforce a hard monthly quota. Once your quota is exhausted, every subsequent request returns `402 quota_exceeded` until the quota resets at the start of your next billing period:

```json theme={null}
{
  "error": {
    "code": "quota_exceeded",
    "message": "Monthly quota exhausted. Upgrade your plan or wait for your quota to reset."
  }
}
```

The `Retry-After` header on a `402` response tells you how many seconds remain until your quota resets. You can also check your current consumption at any time using the `/me` endpoint.

### Checking your usage

Send a `GET` request to `/api/v1/me` to retrieve your plan details and current monthly consumption:

```bash theme={null}
curl -s "https://api.8bitedge.com/api/v1/me" -H "Authorization: Bearer $TOKEN" | jq
```

The `usage.month` object in the response shows exactly how much of your quota you have used:

```json theme={null}
{
  "data": {
    "organization": { "id": 1, "name": "Acme Corp", "status": "active" },
    "plan": {
      "slug": "starter",
      "name": "Starter",
      "rate_limit_per_minute": 120,
      "rate_limit_per_day": 20000,
      "monthly_quota": 250000,
      "max_batch_size": 50,
      "max_page_size": 50
    },
    "api_key": { "name": "server", "last_four": "9f3a", "scopes": ["games.read"] },
    "usage": {
      "month": {
        "used": 1234,
        "quota": 250000,
        "resets_in": 1209600
      }
    }
  }
}
```

<ResponseField name="usage.month.used" type="integer">
  The number of API requests consumed so far this billing period.
</ResponseField>

<ResponseField name="usage.month.quota" type="integer">
  Your plan's total monthly quota. `null` for Enterprise (unmetered).
</ResponseField>

<ResponseField name="usage.month.resets_in" type="integer">
  Seconds until your monthly quota resets.
</ResponseField>

## Batch metering

Batch requests to endpoints like `POST /api/v1/signals/batch` are metered per item — not per HTTP request. If you submit a batch of 10 items, 10 units are deducted from your rate limits and monthly quota. Plan your batch sizes accordingly, and remember that each plan enforces a `max_batch_size` cap on how many items a single batch request may contain.

<Tip>
  Always read `meta.pagination.per_page` from the response rather than assuming your requested `limit` was honored. Your plan's `max_page_size` silently caps the value, so the actual page size may be smaller than what you requested.
</Tip>
