Skip to content
ForgeCastDocs

Errors & limits

What an error looks like, the rate limit, paging through lists, and what each plan allows.

Errors

Errors use standard HTTP status codes and always the same JSON body:

{
  "error": {
    "code": "plan_required",
    "message": "Creating your own overlays requires the Pro plan or higher.",
    "details": { "requiredPlan": "pro" }
  }
}

code is stable and meant for your code; message is for humans and may change. details is there when there's more to say.

StatuscodeWhen
400validation_errorThe body or query failed validation. details is a list of { path, message }.
400bad_requestMalformed JSON, nothing to update, or an invalid parameter.
401unauthorizedNo credentials were sent.
401invalid_tokenThe key is unknown, revoked or expired.
403insufficient_scopeThe key lacks a required scope (details.requiredScope).
403plan_requiredYour plan doesn't include this (details.requiredPlan).
403limit_reachedA plan limit was reached (details.limit).
403forbiddenNot allowed, for example an API key on a website-only endpoint.
403account_disabledThe account is suspended.
404not_foundDoesn't exist, or isn't yours. (Other people's resources are never revealed.)
409conflictThe overlay changed since your baseRev (details.currentRev).
413payload_too_largeThe body or overlay document is too big.
415unsupported_media_typeSend Content-Type: application/json.
429rate_limitedToo many requests, see below.
500internal_errorOur side. The response never contains internals; try again later.

Rate limits

API keys get 10 requests per minute per account, on every plan (Free, Pro and Ultimate). All of an account's keys share that one limit, so more keys don't mean more requests. The website and the desktop app have their own, higher limits.

We expect to raise the paid-plan limits later, so read yours from plan.entitlements.apiRequestsPerMinute in GET /me instead of hard-coding 10.

Every response to a key-authenticated request tells you where you stand:

HeaderMeaning
X-RateLimit-LimitRequests allowed per window
X-RateLimit-RemainingRequests left in the current window
X-RateLimit-ResetUnix time (seconds) when the window resets

Go over and you get 429 with a Retry-After header (seconds). Wait that long before retrying, and don't retry in a tight loop.

HTTP/1.1 429 Too Many Requests
Retry-After: 41
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1791525999

Pagination

  • Inventory uses a cursor: pass limit (1–100, default 25) and, for the next page, the nextCursor you got back as cursor. A nextCursor of null means you're done.
  • Catalog uses an offset: limit (1–100, default 50) and offset. The response gives nextOffset, or null at the end.

What your plan allows

The API applies your current plan on every request, never anything cached in a key.

FreeProUltimate
Add predefined overlays your plan allowsYesYesYes
Create, update, fork overlaysNo (plan_required)Yes (max 25)Yes (max 200)
Inventory size502001,000
Overlays that require a higher planlockedlocked unless Prounlocked
Marketplace widgets, overlays and themesFree onesFree and Pro onesAll

A theme needs the plan of its most demanding part.

If an account is downgraded, the overlays it created stay stored but come back as locked: true and can't be read or edited (403 plan_required). They can still be deleted.

On this page