Errors The stable error contract — shape, HTTP mapping, and every error code.
Every error from the Renduo API follows the same shape, so you can handle
them with one code path.
{
" error " : "QUOTA_EXCEEDED" ,
" message " : "You reached the limit of 100 PDFs for the plan Free for period 2026-08." ,
" details " : { " plan " : "free" , " period " : "2026-08" , " limit " : 100 , " used " : 100 },
" requestId " : "req_..."
}
Field Type Description errorstring Machine-readable code — stable, use it in your logic. messagestring Human-readable explanation. detailsobject, optional Extra structured context (plan limits, validation errors). requestIdstring Correlate with support requests.
Codes are grouped by HTTP status. A details field is included where the
extra context is useful.
Code Description VALIDATION_ERRORThe request body failed validation (Zod). details holds the issues. TEMPLATE_NOT_FOUNDThe template (or the pinned version) does not exist in your organization. BUNDLE_TOO_LARGEThe bundle exceeds the maximum size (5 MB default). DOCUMENT_TOO_LARGEThe generated document has more than 100 pages — a cost guardrail, not a technical limit. See Plans & limits for why. ASSET_NOT_FOUNDA declared asset does not exist in your organization (surfaces at push time). ASSET_TYPE_UNSUPPORTEDThe uploaded asset type is not in the allowed list.
Code Description UNAUTHORIZEDMissing or invalid API key. FORBIDDENThe key is valid but lacks the required scope for this action.
Code Description QUOTA_EXCEEDEDPDF quota of the period exhausted (Free: hard stop; paid plans accumulate overage instead). ASSET_QUOTA_EXCEEDEDAsset storage or count quota of the plan exhausted.
Code Description NOT_FOUNDThe resource or route does not exist. TEMPLATE_NOT_FOUNDThe template (or the pinned version) does not exist.
Code Description VERSION_NOT_ACTIVATABLEYou tried to roll back to a version that never finished publishing (pending or failed). Only active and disabled versions can be activated.
Code Description BUNDLE_TOO_LARGEThe baked shell (bundle + inlined assets) exceeds the maximum size. ASSET_TOO_LARGEThe uploaded asset exceeds 2 MB.
Code Description RATE_LIMIT_EXCEEDEDThe global rate limit (100 requests/minute) was exceeded. The editor ephemeral render uses QUOTA_EXCEEDED for its per-organization budget.
Code Description INTERNAL_ERRORAn unexpected error. Retry, or contact support with requestId. RENDER_ERRORThe component threw while rendering in the sandbox. GENERATION_TIMEOUTThe render exceeded the timeout (10 s sync, 15 s async). TEMPLATE_UPLOAD_FAILEDThe bundle/shell could not be uploaded to object storage — the version was marked failed. ASSET_UPLOAD_FAILEDThe asset could not be uploaded to object storage.
Code Description SERVICE_BUSYThe renderer is briefly out of capacity under a burst of concurrent requests. Already retried internally with backoff before this is returned — safe to retry, nothing to fix on your side.
These codes exist in the type contract for future use and are not currently
emitted by the API: BUNDLE_NOT_FOUND, API_KEY_NOT_FOUND,
ENVIRONMENT_NOT_FOUND, MEMBER_NOT_FOUND, ALREADY_EXISTS, LAST_ADMIN.
Check error (not the HTTP status alone) — two codes share the same
status (e.g. VALIDATION_ERROR and BUNDLE_TOO_LARGE are both 400).
Log requestId on every failure — it's the fastest path to support.
For QUOTA_EXCEEDED on Free, upgrade in the
dashboard .
For RENDER_ERROR, the message usually points at a component exception —
reproduce locally with the playground before re-pushing.
For SERVICE_BUSY, retry with a short backoff (e.g. 1-3 s) — it's not
caused by anything in your request or component.