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
| Endpoint | Method | Limit | Window |
|---|
/api/v1/documents/generate | POST | 30 requests | per minute |
/api/v1/documents/generate/batch | POST | 5 requests | per minute |
/api/v1/documents/jobs | GET | 300 requests | per minute |
/api/v1/documents/jobs/:id | GET | 300 requests | per minute |
Template Endpoints
| Endpoint | Method | Limit | Window |
|---|
/api/v1/templates | GET | 300 requests | per minute |
/api/v1/templates | POST | 30 requests | per minute |
/api/v1/templates/:id | PATCH | 30 requests | per minute |
/api/v1/templates/:id | DELETE | 30 requests | per minute |
Analytics Endpoints
| Endpoint | Method | Limit | Window |
|---|
/api/v1/analytics/* | GET | 100 requests | per minute |
/api/v1/dashboard/* | GET | 100 requests | per minute |
Webhook Subscription Endpoints
| Endpoint | Method | Limit | Window |
|---|
/api/v1/webhook-subscriptions | GET/POST/PATCH/DELETE | 30 requests | per minute |
/api/v1/webhook-subscriptions/:id/test | POST | 10 requests | per minute |
Every API response includes rate limit headers:
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 25
X-RateLimit-Reset: 1732723200
| Header | Description |
|---|
X-RateLimit-Limit | Maximum requests allowed in the window |
X-RateLimit-Remaining | Remaining requests in current window |
X-RateLimit-Reset | Unix 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
| Limit | Value | Notes |
|---|
| Request body size | 10 MB | JSON payload maximum |
| URL length | 8 KB | Including query parameters |
| Header size | 16 KB | Total header size |
Document Generation Limits
| Limit | Value | Notes |
|---|
| Variables size | 1 MB | JSON variables per request |
| Batch size | 100 | Documents per batch request |
| Variables per document | 100 KB | In batch requests |
Document Generation Limits
RenderDoc enforces limits on document generation to protect system resources and ensure reliable performance.
PDF Limits
| Limit | Value | Why |
|---|
| Pages per PDF | 30 | Protects CPU/compute costs |
| Images per PDF | 50 | Protects memory usage |
| Output file size | 10 MB | Storage and download limits |
| Page size | A4 / Letter | Standard sizes |
| Generation timeout | 60 seconds | Per document |
Excel Limits
| Limit | Value | Why |
|---|
| Rows per workbook | 10,000 | Protects memory/RAM |
| Columns per sheet | 50 | Protects file size |
| Sheets per workbook | 10 | Maximum sheets |
| Output file size | 10 MB | Storage and download limits |
| Cell content | 32,767 chars | Excel standard limit |
| Generation timeout | 120 seconds | Per workbook |
Template Processing Limits
| Limit | Value | Why |
|---|
| Loop iterations | 1,000 | Prevents hang-ups from large arrays |
| Nesting depth | 10 levels | Prevents infinite recursion |
| Components per template | 500 | Protects 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 Code | Limit | Example Message |
|---|
ERR_LIMIT_001 | PDF pages | "PDF generation exceeded 30 page limit. Your PDF has 45 pages." |
ERR_LIMIT_002 | PDF images | "PDF contains 75 images, exceeding the 50 image limit." |
ERR_LIMIT_003 | Excel rows | "Excel generation exceeded 10,000 row limit. Your data has 15,000 rows." |
ERR_LIMIT_004 | Excel sheets | "Excel workbook exceeded 10 sheet limit. Your workbook has 12 sheets." |
ERR_LIMIT_005 | Excel columns | "Excel sheet exceeded 50 column limit. Your sheet has 75 columns." |
ERR_LIMIT_006 | File size | "Generated document (12MB) exceeds maximum file size of 10MB." |
ERR_LIMIT_007 | Loop iterations | "Loop "items" has 2,500 items but maximum is 1,000. Consider pagination or splitting data." |
ERR_LIMIT_008 | Nesting depth | "Template exceeded 10 level nesting depth. Current depth: 12 levels." |
ERR_LIMIT_009 | Component 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
- Split large datasets: Break data into multiple documents
- Paginate loops: Use pagination for arrays over 1,000 items
- Optimize images: Compress images before including in PDFs
- Simplify templates: Reduce nesting and component count
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
| Limit | Value |
|---|
| Variables per template | 500 |
| Components per template | 200 |
| Nested loop depth | 3 levels |
| Conditional nesting | 5 levels |
| Formula complexity | 1,000 operations |
| Template name | 255 characters |
| Template slug | 100 characters |
Template Counts by Plan
| Plan | Templates |
|---|
| Free | 2 |
| Starter | 5 |
| Growth | 20 |
| Scale | 50 |
Account Quotas
Document Quotas by Plan
| Plan | Documents/Month | Additional Documents |
|---|
| Free | 50 | Purchase credit packs |
| Starter | 500 | Purchase credit packs |
| Growth | 2,500 | Purchase credit packs |
| Scale | 10,000 | Purchase credit packs |
Credit Packs
Purchase additional documents beyond your monthly quota:
| Pack | Documents | Price | Per Document |
|---|
| Micro | 100 | $10 | $0.10 |
| Small | 500 | $40 | $0.08 |
| Medium | 1,000 | $70 | $0.07 |
| Large | 2,500 | $150 | $0.06 |
Credits never expire. They are consumed after your monthly quota is exhausted.
Team Limits
| Plan | Team Members |
|---|
| Free | 1 |
| Starter | 3 |
| Growth | 10 |
| Scale | Unlimited |
API Key Limits
| Plan | API Keys |
|---|
| Free | 1 |
| Starter | 3 |
| Growth | 10 |
| Scale | Unlimited |
Webhook Limits
Availability by Plan
| Plan | Webhooks Available |
|---|
| Free | ❌ |
| Starter | ✅ |
| Growth | ✅ |
| Scale | ✅ |
Delivery Limits
| Limit | Value | Notes |
|---|
| Timeout | 30 seconds | Per delivery attempt |
| Retries | 3 attempts | Exponential backoff |
| Payload size | 256 KB | Maximum webhook payload |
| Events per second | 100 | Per subscription |
OAuth Limits
Token Limits
| Limit | Value |
|---|
| Access token lifetime | 1 hour |
| Refresh token lifetime | 30 days |
| Authorization code lifetime | 10 minutes |
| Active access tokens per user | 50 |
| Active refresh tokens per user | 10 |
OAuth App Limits
| Plan | OAuth Apps |
|---|
| Free | 1 |
| Starter | 5 |
| Growth | 10 |
| Scale | Unlimited |
Storage Limits
Asset Storage
| Plan | Storage |
|---|
| Free | 100 MB |
| Starter | 500 MB |
| Growth | 2 GB |
| Scale | 10 GB |
Generated File Retention
| Plan | Retention |
|---|
| Free | 1 day |
| Starter | 1 day |
| Growth | 3 days |
| Scale | 3 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
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
- Batch operations: Use batch endpoints instead of multiple single requests
- Cache responses: Don't re-fetch unchanged data
- Implement backoff: Exponential backoff on 429 responses
- Use webhooks: Don't poll for status updates
Optimize Payload Size
- Compress images: Before including in templates
- Limit data: Only include necessary variables
- 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');
}