Skip to main content

Limits & Quotas

This page documents all rate limits, payload limits, and quotas in RenderDoc. We believe in transparency - knowing your limits before you hit them.

API Rate Limits

Rate limits protect the platform and ensure fair usage. Limits are applied per API key.

Document Endpoints

EndpointMethodLimitWindow
/api/v1/documents/generatePOST30 requestsper minute
/api/v1/documents/generate/batchPOST5 requestsper minute
/api/v1/documents/jobsGET300 requestsper minute
/api/v1/documents/jobs/:idGET300 requestsper minute

Template Endpoints

EndpointMethodLimitWindow
/api/v1/templatesGET300 requestsper minute
/api/v1/templatesPOST30 requestsper minute
/api/v1/templates/:idPATCH30 requestsper minute
/api/v1/templates/:idDELETE30 requestsper minute

Analytics Endpoints

EndpointMethodLimitWindow
/api/v1/analytics/*GET100 requestsper minute
/api/v1/dashboard/*GET100 requestsper minute

Webhook Subscription Endpoints

EndpointMethodLimitWindow
/api/v1/webhook-subscriptionsGET/POST/PATCH/DELETE30 requestsper minute
/api/v1/webhook-subscriptions/:id/testPOST10 requestsper minute

Rate Limit Headers

Every API response includes rate limit headers:

X-RateLimit-Limit: 30
X-RateLimit-Remaining: 25
X-RateLimit-Reset: 1732723200
HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the window
X-RateLimit-RemainingRemaining requests in current window
X-RateLimit-ResetUnix timestamp when the window resets

Rate Limit Exceeded Response

When you exceed the rate limit:

{
"statusCode": 429,
"code": "ERR_QUOTA_003",
"message": "Rate limit exceeded. Please retry after 45 seconds.",
"retryAfter": 45
}

Best Practice: Implement exponential backoff when you receive a 429 response.

Payload Limits

Request Limits

LimitValueNotes
Request body size10 MBJSON payload maximum
URL length8 KBIncluding query parameters
Header size16 KBTotal header size

Document Generation Limits

LimitValueNotes
Variables size1 MBJSON variables per request
Batch size100Documents per batch request
Variables per document100 KBIn batch requests

Document Generation Limits

RenderDoc enforces limits on document generation to protect system resources and ensure reliable performance.

PDF Limits

LimitValueWhy
Pages per PDF30Protects CPU/compute costs
Images per PDF50Protects memory usage
Output file size10 MBStorage and download limits
Page sizeA4 / LetterStandard sizes
Generation timeout60 secondsPer document

Excel Limits

LimitValueWhy
Rows per workbook10,000Protects memory/RAM
Columns per sheet50Protects file size
Sheets per workbook10Maximum sheets
Output file size10 MBStorage and download limits
Cell content32,767 charsExcel standard limit
Generation timeout120 secondsPer workbook

Template Processing Limits

LimitValueWhy
Loop iterations1,000Prevents hang-ups from large arrays
Nesting depth10 levelsPrevents infinite recursion
Components per template500Protects rendering performance

Limit Violation Errors

When you exceed document limits, RenderDoc immediately stops processing and returns a 400 Bad Request with a specific error code:

Error CodeLimitExample Message
ERR_LIMIT_001PDF pages"PDF generation exceeded 30 page limit. Your PDF has 45 pages."
ERR_LIMIT_002PDF images"PDF contains 75 images, exceeding the 50 image limit."
ERR_LIMIT_003Excel rows"Excel generation exceeded 10,000 row limit. Your data has 15,000 rows."
ERR_LIMIT_004Excel sheets"Excel workbook exceeded 10 sheet limit. Your workbook has 12 sheets."
ERR_LIMIT_005Excel columns"Excel sheet exceeded 50 column limit. Your sheet has 75 columns."
ERR_LIMIT_006File size"Generated document (12MB) exceeds maximum file size of 10MB."
ERR_LIMIT_007Loop iterations"Loop "items" has 2,500 items but maximum is 1,000. Consider pagination or splitting data."
ERR_LIMIT_008Nesting depth"Template exceeded 10 level nesting depth. Current depth: 12 levels."
ERR_LIMIT_009Component count"Template exceeded 500 component limit. Your template has 650 components."

Example Error Response

{
"statusCode": 400,
"code": "ERR_LIMIT_001",
"message": "PDF generation exceeded maximum page limit",
"timestamp": "2025-12-09T10:30:00.000Z",
"path": "/api/v1/documents/generate",
"relatedInfo": {
"actualPages": 45,
"maxPages": 30,
"message": "PDF generation exceeded 30 page limit. Your PDF has 45 pages."
}
}

How to Handle Limit Errors

  1. Split large datasets: Break data into multiple documents
  2. Paginate loops: Use pagination for arrays over 1,000 items
  3. Optimize images: Compress images before including in PDFs
  4. Simplify templates: Reduce nesting and component count
note

Pro tip: Validate your data size before calling the API. Check array lengths and estimate row counts client-side to avoid limit errors.

Template Limits

Content Limits

LimitValue
Variables per template500
Components per template200
Nested loop depth3 levels
Conditional nesting5 levels
Formula complexity1,000 operations
Template name255 characters
Template slug100 characters

Template Counts by Plan

PlanTemplates
Free2
Starter5
Growth20
Scale50

Account Quotas

Document Quotas by Plan

PlanDocuments/MonthAdditional Documents
Free50Purchase credit packs
Starter500Purchase credit packs
Growth2,500Purchase credit packs
Scale10,000Purchase credit packs

Credit Packs

Purchase additional documents beyond your monthly quota:

PackDocumentsPricePer Document
Micro100$10$0.10
Small500$40$0.08
Medium1,000$70$0.07
Large2,500$150$0.06
note

Credits never expire. They are consumed after your monthly quota is exhausted.

Team Limits

PlanTeam Members
Free1
Starter3
Growth10
ScaleUnlimited

API Key Limits

PlanAPI Keys
Free1
Starter3
Growth10
ScaleUnlimited

Webhook Limits

Availability by Plan

PlanWebhooks Available
Free
Starter
Growth
Scale

Delivery Limits

LimitValueNotes
Timeout30 secondsPer delivery attempt
Retries3 attemptsExponential backoff
Payload size256 KBMaximum webhook payload
Events per second100Per subscription

OAuth Limits

Token Limits

LimitValue
Access token lifetime1 hour
Refresh token lifetime30 days
Authorization code lifetime10 minutes
Active access tokens per user50
Active refresh tokens per user10

OAuth App Limits

PlanOAuth Apps
Free1
Starter5
Growth10
ScaleUnlimited

Storage Limits

Asset Storage

PlanStorage
Free100 MB
Starter500 MB
Growth2 GB
Scale10 GB

Generated File Retention

PlanRetention
Free1 day
Starter1 day
Growth3 days
Scale3 days

Requesting Limit Increases

If you need higher limits, you have options:

Upgrade Your Plan

Higher plans come with increased limits. See Pricing.

Enterprise Custom Limits

Scale customers can request custom limits:

  • Dedicated infrastructure
  • Custom rate limits
  • Higher storage quotas

Contact [email protected]

Temporary Increases

For one-time events (product launches, end-of-month reporting), request a temporary limit increase:

Email: [email protected]

Include:

  • Account/Team ID
  • Requested limit increase
  • Duration needed
  • Use case description
info

Temporary increases are reviewed within 1 business day. Plan ahead for time-sensitive events.

Monitoring Your Usage

Dashboard

View your current usage in the dashboard:

  • Overview: Current document/credit usage
  • Settings → Usage: Detailed usage breakdown
  • Settings → API Keys: Per-key usage statistics

API

Query usage programmatically:

GET /api/v1/analytics/usage

Response:

{
"period": "2025-01",
"documentsGenerated": 1542,
"creditsUsed": 1542,
"creditsRemaining": 8458,
"quota": 10000
}

Alerts

Set up usage alerts in Settings → Notifications:

  • 50% quota usage
  • 80% quota usage
  • 100% quota usage
  • Rate limit warnings

Best Practices

Avoid Rate Limits

  1. Batch operations: Use batch endpoints instead of multiple single requests
  2. Cache responses: Don't re-fetch unchanged data
  3. Implement backoff: Exponential backoff on 429 responses
  4. Use webhooks: Don't poll for status updates

Optimize Payload Size

  1. Compress images: Before including in templates
  2. Limit data: Only include necessary variables
  3. Paginate data: Split large datasets across multiple documents

Handle Limits Gracefully

async function generateWithRetry(payload, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch('/api/v1/documents/generate', {
method: 'POST',
headers: { 'Authorization': `Bearer ${API_KEY}` },
body: JSON.stringify(payload)
});

if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After') || 60;
await sleep(retryAfter * 1000);
continue;
}

return response.json();
}
throw new Error('Max retries exceeded');
}