Skip to content
Join our Slack

Rate limits and plans

Platform API calls are metered per organization, not per token. Every Personal Access Token in an organization spends from the same budget, so adding tokens adds no capacity. This is the canonical page for the numbers.

An API credit is the unit Fomr uses to measure Platform API usage. Each call spends a fixed number of credits from your organization’s budget, whichever token makes it:

  • Most calls cost 1 credit. Reading, creating, updating, publishing, and deleting all cost the same.
  • Generating a form with AI costs 10 credits, because it runs an AI model.
  • Checking your usage costs nothing, so you can always see where you stand. The public /v1/openapi.json and /v1/docs pages are free too.
  • Failed calls cost nothing. If a call ends in an error, its credits are returned, so fixing a mistake and trying again never costs twice.

Your plan sets how many credits you can spend and how quickly. Credits are not money: you never buy them, and Fomr never bills you for them. When credits run out, calls pause until the budget refills, or, on Free, until you upgrade.

What you doCallsCredits
Check which organization a token belongs toGET /v1/me1
List your forms, 25 per page, when you have 60 forms3 × GET /v1/forms3
Read 250 submissions at the maximum page size of 1003 × GET /v1/forms/{id}/submissions3
Export every submission of a form as CSV, however many rows1 × GET /v1/forms/{id}/submissions/export1
Create a form, write its draft, validate it, and publish itcreateForm, updateFormDraft, validateForm, publishForm4
Generate a form with AI, then publish itgenerateForm, publishForm11
Check your remaining budgetGET /v1/usage0

A credit is spent per call, not per item in the response. Asking for 100 submissions in one page costs the same as asking for one, so larger pages and exports save credits.

A Free organization has 100 credits per 24 hours. That covers, for example, a nightly job that exports submissions from 20 forms (20 credits) and publishes 15 forms built from your own blueprints (4 credits each, 60 credits), with 20 credits to spare. The same 100 credits cover ten AI generations and nothing else.

Every call must fit inside two budget policies at once.

FreePro
API Burst pool100 credits10,000 credits
API Cooldown and refill length24 hours24 hours
API Minute Cap60 credits per minute300 credits per minute
  • API Burst is a pool of credits. Spending the first credit opens a refill window of one cooldown length; if the pool is not used up, it refills when that window ends. Spending the last credit starts a full API Cooldown, measured from that moment, and the pool refills when the cooldown ends.
  • API Minute Cap limits credits per fixed 60-second window. It has no cooldown; the window simply turns over.

For example, a Free organization that spends its first credit at 09:00 on Monday and never empties the pool gets a full pool again at 09:00 on Tuesday. If it spends its last credit at 15:00 on Monday, the cooldown runs until 15:00 on Tuesday.

The minute cap is checked first, so a call it rejects spends no burst credits. A call the burst rejects still counts toward the current minute. Rejected calls never extend or shorten a cooldown.

Each call has a fixed API Request Cost, the same on every plan:

CallCost
Any Platform API call1 credit
Generating a form with AI (generateForm)10 credits
Reading usage (GET /v1/usage)0 credits

The API reference lists the cost of every operation.

Only successful calls spend credits. A call is held against your budget while it runs, and if it ends in an error, any 4xx or 5xx answer, its credits are returned at once. A publish blocked by Publish Issues, a 404 for a form that does not exist, and an AI provider failure all cost nothing.

A failed call still counts toward the API Minute Cap, because that cap limits how fast a client calls, not what it spends.

A 10-credit call needs 10 credits free in both policies. When fewer remain, it is rejected and spends no burst credits, while 1-credit calls keep going through until the pool is empty.

Every authenticated response, successful or not, carries the current reading for both policies.

RateLimit-Policy: "burst";q=100;w=86400, "minute";q=60;w=60
RateLimit: "burst";r=63;t=79512, "minute";r=57;t=41

These follow the IETF RateLimit header fields draft (draft-11).

ParameterMeaning
qThe limit — credits the policy allows in one window
wThe window length, in seconds
rCredits remaining in the current window
tSeconds until that window resets

RateLimit-Policy changes only when the plan changes. RateLimit is the live reading. The example is a Free organization with 63 of 100 burst credits left, about 22 hours before the pool refills, and 57 of 60 minute credits left for another 41 seconds.

A 429 also carries Retry-After, always in seconds, equal to the t of the policy that rejected the call. The Platform API sends no X-RateLimit-* headers.

A call over budget gets a 429 Platform Error. Both throttle codes carry the same fields.

FieldWhat it holds
codeAPI_COOLDOWN or TOO_MANY_REQUESTS
messageA human-readable explanation. It is not part of the contract
request_idThe ID of this request, also sent as X-Request-Id
policyburst or minute — which budget rejected the call
planThe organization’s plan at the moment of the call
limitThat policy’s limit, in credits
usedCredits spent in the current window
remainingCredits left in the current window
costWhat the rejected call would have cost
window_secondsThat policy’s window length
cooldown_untilWhen the API Cooldown ends, or null when there is no cooldown
resets_atWhen the current window resets
retry_after_secondsThe same number as the Retry-After header
upgrade_urlThe upgrade link on Free, or null on Pro

Branch on code, and on policy to tell the two TOO_MANY_REQUESTS cases apart.

The API Burst pool is empty and the organization is in an API Cooldown. Every call except GET /v1/usage is rejected until cooldown_until.

429 API_COOLDOWN
{
"code": "API_COOLDOWN",
"message": "This Free organization has spent its 100 Platform API credits and is in API Cooldown until 2026-10-02T09:00:00Z. Upgrade to Pro to lift the cooldown now.",
"request_id": "0f3c2a9e-6b1d-4e57-9a1c-2d8e4f6b7c90",
"policy": "burst",
"plan": "free",
"limit": 100,
"used": 100,
"remaining": 0,
"cost": 1,
"window_seconds": 86400,
"cooldown_until": "2026-10-02T09:00:00.000Z",
"resets_at": "2026-10-02T09:00:00.000Z",
"retry_after_seconds": 79512,
"upgrade_url": "https://fomr.io/app/upgrade?source=platform_api&feature=platform_api"
}

cooldown_until is null: nothing is locked, a window just has to turn over.

policy: "minute" means the API Minute Cap was hit.

429 TOO_MANY_REQUESTS — policy "minute"
{
"code": "TOO_MANY_REQUESTS",
"message": "Pro organizations can spend 300 Platform API credits per minute. Retry in 17 seconds.",
"request_id": "0f3c2a9e-6b1d-4e57-9a1c-2d8e4f6b7c90",
"policy": "minute",
"plan": "pro",
"limit": 300,
"used": 300,
"remaining": 0,
"cost": 1,
"window_seconds": 60,
"cooldown_until": null,
"resets_at": "2026-10-01T09:01:00.000Z",
"retry_after_seconds": 17,
"upgrade_url": null
}

policy: "burst" means too few burst credits remain for this call, typically a 10-credit generation when the pool is nearly empty. 1-credit calls still succeed.

429 TOO_MANY_REQUESTS — policy "burst"
{
"code": "TOO_MANY_REQUESTS",
"message": "This call costs 10 credits; 3 remain until 2026-10-02T09:00:00Z.",
"request_id": "0f3c2a9e-6b1d-4e57-9a1c-2d8e4f6b7c90",
"policy": "burst",
"plan": "free",
"limit": 100,
"used": 97,
"remaining": 3,
"cost": 10,
"window_seconds": 86400,
"cooldown_until": null,
"resets_at": "2026-10-02T09:00:00.000Z",
"retry_after_seconds": 79512,
"upgrade_url": "https://fomr.io/app/upgrade?source=platform_api&feature=platform_api"
}
  • TOO_MANY_REQUESTS, policy: "minute": wait Retry-After seconds (at most 60), then retry with bounded backoff.
  • TOO_MANY_REQUESTS, policy: "burst": the call costs more than is left. Cheaper calls still work; this one waits for resets_at.
  • API_COOLDOWN: stop until cooldown_until, or upgrade. Never retry in a loop.

Separately from the organization budget, each IP address can call one operation at most 600 times per minute, and generateForm at most 5 times per minute. Over that limit the API answers 429 TOO_MANY_REQUESTS with Retry-After and only the basic Platform Error fields, with no policy. These requests spend no credits. In practice you meet this limit only when generating more than five forms a minute, or when several organizations call from one IP address.

Each plan has its own counters.

  • Upgrading to Pro lifts a Free cooldown immediately, because the Pro budget starts unused.
  • Returning to Free before the Free window ends resumes the earlier Free counters, including any cooldown.

GET /v1/usage (operation getUsage) reports where the organization stands right now. It spends no credits and works during a cooldown.

Terminal window
curl https://platform.fomr.io/v1/usage \
-H "Authorization: Bearer $FOMR_TOKEN"
GET /v1/usage
{
"plan": "free",
"limits": {
"max_forms": 3,
"max_submissions_per_month": 100
},
"counts": {
"forms": 2,
"submissions_this_month": 17
},
"api": {
"plan": "free",
"burst": {
"limit": 100,
"used": 37,
"remaining": 63,
"window_seconds": 86400,
"resets_at": "2026-10-02T09:00:00.000Z",
"cooldown_until": null
},
"minute": {
"limit": 60,
"used": 3,
"remaining": 57,
"window_seconds": 60,
"resets_at": "2026-10-01T09:01:00.000Z"
},
"costs": {
"request": 1,
"ai_generation": 10
},
"degraded": false
}
}
  • plan and limits are the organization’s plan and its plan limits.
  • counts holds the organization’s forms and its submissions this month. counts.forms is the figure the plan’s form limit is checked against: every form that is not a Private Template, including forms in Trash, until they are permanently deleted.
  • api.burst and api.minute are the live reading of each policy: limit, used, remaining, window_seconds, resets_at (null while nothing has been spent), and, on the burst, cooldown_until.
  • api.costs holds the API Request Costs: request for an ordinary call and ai_generation for generateForm. Read them instead of hardcoding them.
  • api.degraded is true while the numbers are approximate.

The same numbers appear in the app under Settings > API.

  • Read RateLimit on every response, not just on failures, and slow down before you hit a limit.
  • Keep a steady pace. The minute cap is usually the first limit a client meets.
  • Back off with a ceiling. Honour Retry-After, add jitter, and stop after a fixed number of attempts.
  • Budget expensive calls. Ten form generations use a Free organization’s entire 100-credit pool. Check remaining before a batch.
  • Coordinate your tokens. They share one budget, so two jobs running at full speed throttle each other. They also share the organization’s two submission export slots.

Your next form could be the best-looking thing on your site.

Free forever. Unlimited responses. No signup to start.