Limits & quotas
Every limit on this page is a hard stop. Hitting one returns an error and bills nothing — it never quietly runs the job and adds it to your bill. That is the whole design: a surprise invoice is structurally impossible when the only way past a limit is a deliberate purchase you make yourself.
The numbers below are the ones this deployment enforces right now. A deployment can be configured differently, so treat the shape of the contract — which limit exists, and what it returns — as the stable part.
Requests
| Limit | Value | Where it applies | What you get back |
|---|---|---|---|
| Absolute request body size | 30,000,000 bytes | Every request. Checked against the declared length up front, then against the streamed body, so a chunked or undeclared body is covered too. | 413 — the body is never parsed. |
| Declared body size | 10,000,000 bytes | POST /api/translations text submissions — JSON and raw
bodies, read from the Content-Length header before the body
is parsed into memory, and text files uploaded as a form. A PDF, Word or
Excel upload to that endpoint is held to the absolute ceiling above
instead. |
413 — nothing is translated. |
| Source text length | 50,000 characters | Each source_text, or each inputs[].Text in
the batch shape, on POST /api/translations. |
413 — split the text and submit it as a batch. |
| Batch size | 50 translations | POST /api/translations, counted as the total number of
translations — the sum of Targets across all
inputs, not the number of inputs. |
413 — nothing in the batch runs. |
| Page count (text flow) | 50 pages | A text document submitted to POST /api/translations is
split into pages of at most
5,000 characters, and the page count is
checked against the same ceiling as a batch. |
413 — nothing runs. |
A single POST /api/translations runs the whole pipeline inline and
returns the finished job, so size your HTTP client timeout for pipeline
latency rather than for a queue acknowledgement. If it times out client-side,
resend with the same Idempotency-Key instead of treating it as a
failure.
Documents
| Limit | Value | Where it applies | What you get back |
|---|---|---|---|
| Upload size | 30,000,000 bytes | POST /api/documents/translate, and a PDF, Word or Excel
file uploaded to POST /api/translations, under the same
absolute body ceiling as every other request. |
413 — the upload is not stored. |
| Per-stage budget | 1800 seconds per stage, retries included | Each stage of document processing, server-side. A transient failure inside a stage — a rate limit, a dropped connection — is retried automatically, up to 2 times, within that same budget; you do not resubmit. | The job fails with failure code stage_timeout, and the
stage is not retried: its work is fixed by the document, so resubmitting
the same file unchanged is likely to run out of time again — split it
instead. |
| Page count | No page ceiling on the layout path | A layout-preserving PDF, Word or Excel job is bounded by the upload size — and a Word or Excel file also by the limits below — not by a page count. The 50-page ceiling above applies only to the text flow. | — |
| Unpacked size (Word, Excel) | 200,000,000 bytes | What the file’s contents add up to once unzipped. Word and Excel files are compressed packages, so a small upload can unpack to far more than its own size. | 400 before a job exists — split the file. |
| XML read in one piece (Word, Excel) | 80,000,000 bytes | The parts of a Word document that are read whole, taken together; for a workbook, its shared-strings table. | 400 before a job exists. |
| XML elements (Word) | 1,000,000 elements | Across the parts of a Word document that are read whole. | 400 before a job exists. |
| Translatable text per document (Word, Excel) | 2,000,000 characters | The text one document may hold for translation. | Word: 400 before a job exists. Excel: counted as the
workbook is read, so the job fails at its extract stage
(400 with wait=true). |
| Translatable segments per document (Word, Excel) | 50,000 segments | The pieces a document is translated in — paragraphs in Word, distinct cell texts in Excel — counted as the file is read. | The job fails at its extract stage (400 with
wait=true). |
Document jobs are asynchronous by default: the submit returns
202 with a queued job to poll. Send wait=true to run
it inline instead — that request stays open until the last stage has finished,
which can take minutes on a large document, so poll rather than wait for
anything but small files.
Translation memory & terminology
| Limit | Value | Where it applies | What you get back |
|---|---|---|---|
| Translation-memory segments | 50,000 per workspace and language pair | TMX import on POST /api/tm, counted after duplicate
sources collapse and across every set you hold for that pair,
the approved golden set included; pt-BR and
pt-PT are separate pairs, as are fr and
fr-CA. A same-name re-import replaces its set
wholesale, so that set's own segments do not count against you. |
422 with a string detail
beginning tm_max_segments_exceeded:. The whole import is
refused and nothing is stored. |
| Terminology entries | 2,000 per workspace and language pair | POST /api/terminology, counted across every set you hold
for the pair. Pairs match on the language each code stands for, so
en-US and en share one budget while
pt-BR and pt-PT have one each, as do fr
and fr-CA, and a set with
no declared pair counts against every pair. |
422 with a string detail
beginning terminology_max_terms_exceeded:. The whole upload
is refused and nothing is stored. |
| Set name length | 128 characters | POST /api/terminology and POST /api/tm. |
400 with a detail naming the ceiling. |
| Asynchronous import threshold | 5,000 segments | POST /api/tm, counted after duplicate sources collapse.
At or under it the import runs inline. |
Above it, 202 with a job to poll at
GET /api/tm/imports/{job_id}. Not an error — every
rejection stays synchronous at both sizes, so a 202 already
means the file parsed and the capacity check passed. |
Both allowances are counted per language pair, so filling the English → French budget leaves every other pair untouched. When a pair is at its memory cap, approvals still succeed: pairs the memory cannot take are skipped and counted on the job rather than failing the approval, and a correction to a source the memory already holds is admitted even at the cap.
Usage & billing
| Limit | Value | Where it applies | What you get back |
|---|---|---|---|
| Monthly allowance — Personal | 500,000 source characters | Billable translations in the current UTC calendar month, counted from when your current plan took effect if that was later — see below. | 429 with tenant usage limit exceeded,
continuing with the remedies your workspace actually has. |
| Monthly allowance — Pro | 1,500,000 source characters | Billable translations in the current UTC calendar month, counted from when your current plan took effect if that was later — see below. | 429 with tenant usage limit exceeded,
continuing with the remedies your workspace actually has. |
| Monthly allowance — Studio | 5,000,000 source characters | Billable translations in the current UTC calendar month, counted from when your current plan took effect if that was later — see below. | 429 with tenant usage limit exceeded,
continuing with the remedies your workspace actually has. |
| Monthly allowance — default | 500,000 source characters | A workspace with no subscription-set allowance of its own. | 429 — the same hard stop. |
| Dense-script weight | 3.5× | Every pair with a Chinese, Japanese, Korean, Thai, Hindi, Marathi or Nepali side, on either end. Applied once, not squared, when both sides are dense. See Supported languages. | The weighted count is what the allowance check reads, so a request can
be refused with 429 that would have passed unweighted. |
| Deployment ceiling | 10,000,000 characters per month | Allowance and top-ups combined, per workspace per UTC calendar month — a plan change mid-month does not reset it. It bounds top-up headroom and the outstanding prepaid balance; a negotiated enterprise allowance above it is not clamped down by it. | 429 when a request would take the month past it, asking
you to contact us — nothing bought on /billing can add to
it. 409 on a top-up that would push the outstanding balance
past the ceiling — spend the balance you have first — and on any top-up
for an allowance that already reaches it. Beyond this volume the
conversation is an enterprise one — talk to us. |
| Free trial | 150,000 characters over 14 days | New workspaces, whichever runs out first. Text translation from the workspace only: layout-preserving document jobs and API keys are not trial-covered. | 402 saying why — the characters are used up, the days have
run out, the request needs more characters than remain, or it is a
document or API-key request the trial does not cover — with
/billing as the way on. |
| Trial grants per network address | 3 per 24 hours | Sign-up, as an anti-abuse gate on the grant, not on the account. | Sign-up past the gate still gets a working workspace — just without the trial characters. |
| Top-up packs per purchase | 5 packs | POST /api/billing/topup. Top-ups are always a deliberate
purchase; nothing is ever charged automatically as an overage. |
400 with a detail naming the per-purchase
ceiling. |
The allowance counts billable translations in the current UTC calendar month,
starting from the moment your current plan took effect if that came later:
subscribing or changing plan starts the count again, so free-trial usage never
eats into a first paid month and usage under an old plan never counts against
a new one. The deployment ceiling counts the whole calendar month regardless.
Text is checked from the payload before any work starts, together with
everything you still have in flight. A document is checked twice: at
submission, for any room left at all, and again once extraction has counted
its characters, before any of it is translated. A document larger than the room
left is admitted whole; one that finds none fails with failure code
quota_exceeded, untranslated and unbilled (429 with
that error_code when submitted with wait=true).
Running out of allowance stops new work; it does not bill you for it and it does not queue anything to bill you for later. Your options are a top-up, an upgrade — which applies at once and is charged the prorated difference — or waiting for the month to roll, all of them things you choose. Once the month reaches the deployment ceiling, only the next month, or a conversation with us, adds room. See the pricing FAQ.
Rate limits
| Limit | Value | Where it applies | What you get back |
|---|---|---|---|
| Authentication attempts | 30 per 60-second window | Per client address, per endpoint bucket — sign-up, the password and MFA grants, MFA code verification, enrolment, recovery, invite preview, password reset and the single sign-on legs each get their own budget; the MFA grant and MFA code verification are also counted per sign-in challenge. | 429 too many requests — slow down and retry later, with a
Retry-After header. Honor it; do not retry inside the
window. |
| MFA codes per sign-in challenge | 5 codes | Each MFA challenge a sign-in issues, counting authenticator and recovery
codes sent to POST /api/auth/mfa/verify and to the MFA grant
on POST /api/oauth2/token together. |
The next attempt burns the challenge:
401 invalid or expired MFA challenge. Start again from the
password step. |
| Failed MFA codes per user | 10 per 15 minutes | Each user, across all their sign-in challenges and whatever the client address. Correct codes do not count. | 429 too many MFA attempts — wait a few minutes, then sign in
again, with a Retry-After header. |
| Top-up purchase velocity | 5 attempts per 1-hour window | POST /api/billing/topup, per client address
and per workspace. Both budgets are consumed on every
attempt, and this limiter is independent of the authentication one. |
429 with
too many top-up attempts — slow down and retry later and a
Retry-After header. |
Storage
| Limit | Value | Where it applies | What you get back |
|---|---|---|---|
| Platform storage cap | Off on this deployment | Document uploads: POST /api/documents/translate, checked
against the declared body size before the upload is parsed, and a PDF,
Word or Excel upload to POST /api/translations, checked
against the same declared size before any job is created. Skipped entirely
for a workspace bound to its own storage — those bytes never rest on the
platform volume. |
507, with a detail reporting bytes used of
bytes allowed and naming both remedies: delete document jobs you no
longer need, or
bring your own storage. |
Pagination & ranges
| Limit | Value | Where it applies | What you get back |
|---|---|---|---|
| Segments page size | 1–500, default 100 | GET /api/documents/{document_id}/segments. |
422 with the framework's array
detail. |
| Usage date range | 366 days | GET /api/tenants/usage/daily. |
400 date range must not exceed 366 days. |
Most collection endpoints return complete collections and need no paging. The
exception is the TMX import listing, which is a recent-activity view capped at
the newest jobs with no way to page past them — keep the job id from the
202 if you need a specific import later.
What's next
- Conventions & errors — the request shape, versioning and the canonical error catalog.
- Error codes — every status and code, and which ones are worth retrying.
- Pricing & billing FAQ — what an allowance costs and how top-ups work.