Skip to main content
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

PlanReq/minReq/dayMonthly quotaMax batchMax page
Free301,00010,0001025
Starter12020,000250,0005050
Pro600200,0002,500,000100100
Enterprise3,0002,000,000unmetered250200

Rate limit headers

Every response from the API includes the following headers so you can track your rate limit consumption in real time:
X-RateLimit-Limit
integer
The per-minute request limit for your plan.
X-RateLimit-Remaining
integer
The number of requests remaining in the current one-minute window.
X-RateLimit-Reset
integer
Seconds until the current one-minute window resets and your allowance is restored.
Retry-After
integer
Present on 429 and 402 responses. The number of seconds you should wait before retrying.
You can inspect these headers directly by passing -D - (or -i) to curl:
curl -s -D - "https://api.8bitedge.com/api/v1/games/titles" \
  -H "Authorization: Bearer $TOKEN" \
  -o /dev/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:
{
  "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:
{
  "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:
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:
{
  "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
      }
    }
  }
}
usage.month.used
integer
The number of API requests consumed so far this billing period.
usage.month.quota
integer
Your plan’s total monthly quota. null for Enterprise (unmetered).
usage.month.resets_in
integer
Seconds until your monthly quota resets.

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.
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.