Skip to main content
These limits apply when you call https://pdfgorilla.io/api/v1/... (or the host your account uses). Exact numbers for your plan may also appear in the dashboard.

Request size limits

These apply to every generation request (sync and async):
WhatLimitError code if exceeded
Total request body512 KB (524,288 bytes)REQUEST_BODY_TOO_LARGE
HTML template200 KBHTML_TEMPLATE_TOO_LARGE
Custom CSS100 KBCUSTOM_CSS_TOO_LARGE
Data JSON256 KBDATA_PAYLOAD_TOO_LARGE
Data nesting depth12 levelsDATA_DEPTH_EXCEEDED
Array length (any array in data)1 000 itemsARRAY_LENGTH_EXCEEDED
Liquid tokens in template2 000LIQUID_COMPLEXITY_EXCEEDED
Inline base64 image bytes5 MB (5,242,880 bytes)INLINE_ASSET_BYTES_EXCEEDED
External asset URLs in template100EXTERNAL_ASSET_COUNT_EXCEEDED
Header / footer field length512 charactersHEADER_FOOTER_FIELD_TOO_LARGE
Public API error bodies return human-readable error text. The code names above are the internal validation identifiers.

Render limits

WhatLimitError code
Render timeout90 seconds (default; deployment-configurable)RENDER_TIMEOUT
Max PDF size20 MBPDF_SIZE_EXCEEDED
Max PDF pages200 pagesPDF_PAGE_LIMIT_EXCEEDED

Rate limits

Rate limits depend on the request identity (session cookie vs API key):
Request typeLimit
Sync PDF generation (POST /templates/{id}/generate) with API key60 requests / minute
Sync PDF generation (POST /templates/{id}/generate) with session20 requests / minute
Async job creation (POST /templates/{id}/generate-async) per identity subject20 jobs / minute
For API-key async requests, there is an additional generate-rate check of 60 requests/minute on that API key. When a rate limit is exceeded, you receive HTTP 429 with these headers:
x-ratelimit-limit: 60
x-ratelimit-remaining: 0
x-ratelimit-reset: 1744000000000
x-ratelimit-reset is a millisecond Unix timestamp. Wait until after that time before retrying.

Plan quotas

Generated pages (PDFs produced via the API) and other resources count against your plan’s quota.
FeatureFreePro
Generated PDF pages100 (one-time)10,000 / month
Preview pages500 (one-time)50,000 / month
Copilot calls25 (one-time)500 / month
Templates (max)350
API keys110
Uploaded assets (images)10100
Template import / exportNoYes
Generation logsNoYes
Max asset file size2 MB2 MB
Pro usage quotas reset every month on the same day your subscription period started (anniversary months), not on the 1st of the calendar month. On the free plan, generated pages, previews, and copilot calls are one-time lifetime allowances (they do not reset). When a quota is exhausted, the response includes:
{
  "error": "Generated page limit reached (100/100). ...",
  "hint": "Your quota does not renew on the free plan. Upgrade for higher limits.",
  "used": 100,
  "limit": 100,
  "remaining": 0,
  "resetAt": null
}

Async job limits

WhatLimit
Active jobs per user account10
Active jobs per API key20
Job retention after completion7 days
Max retry attempts per job3 (default; deployment-configurable)
Download URL lifetime5 minutes
“Active” means queued or processing. Completed, failed, canceled, and expired jobs do not count toward this limit.

Tips for staying within limits

Keep templates lean. Split very large templates into multiple smaller ones if you hit the 200 KB HTML limit.
Host images in the Assets library. Base64-encoded images count toward the 5 MB inline limit. Hosted images (with stable URLs) do not.
Use idempotencyKey on async jobs. This prevents duplicate jobs if your server retries a failed request, keeping your active job count low.
Paginate large data sets. Render separate PDFs for large batches rather than one massive document. This also reduces render time and stays under the 200-page limit.