A quick reference guide to help you understand and resolve errors when using the Orshot API.
| Code | 403 |
|---|---|
| Message | Access Forbidden: Authorization header is missing in the request |
Why it happens: Your API request doesn't include the required Authorization header.
Fix: Add the header to your request:
headers: {
"Authorization": "Bearer YOUR_API_KEY"
}Get your API key from Workspace Settings → API Keys. See Get API Key for setup instructions.
| Code | 403 |
|---|---|
| Message | Access Forbidden: API Key is missing in the request |
Why it happens: The Authorization header exists but doesn't contain a valid API key after "Bearer ".
Fix: Ensure the format is Bearer YOUR_API_KEY (with a space after "Bearer").
| Code | 400 |
|---|---|
| Message | Access Forbidden: Invalid API Key |
Why it happens: The API key doesn't exist or has been revoked.
Fix: Generate a new API key from Workspace Settings → API Keys.
| Code | 400 |
|---|---|
| Message | Access Forbidden: The API Key or User ID do not exist |
Why it happens: Your API key isn't linked to a valid user account.
Fix: Double-check your API key or generate a new one from your dashboard.
| Code | 401 |
|---|---|
| Message | Access Forbidden: OAuth token expired |
Why it happens: Your OAuth access token has expired (tokens are valid for 15 minutes).
Fix: Use the refresh token to obtain a new access token, or re-authenticate via the OAuth device flow.
| Code | 401 |
|---|---|
| Message | Access Forbidden: Invalid OAuth token |
Why it happens: The OAuth token doesn't exist, has been revoked, or is malformed.
Fix: Re-authenticate via the OAuth device flow to obtain a new token.
| Code | 403 |
|---|---|
| Message | Subscription inactive or you've consumed all requests |
Why it happens: Your subscription has expired, or you've used all your renders for the billing period.
Fix:
| Code | 403 |
|---|---|
| Message | Video generation is available only on paid plans |
Why it happens: You're trying to generate video output (MP4, WebM, GIF) on a Free plan.
Fix: Upgrade to a paid plan to unlock video generation.
| Code | 429 |
|---|---|
| Message | Partner monthly render limit reached (X/Y). Limit resets next month. |
Why it happens: Your partner sandbox workspace has exceeded its monthly allocation.
Fix: Wait for the monthly reset or contact your partner account manager.
| Code | 403 |
|---|---|
| Message | This sandbox workspace is not associated with a valid partner account |
Why it happens: The sandbox workspace isn't properly linked to a partner.
Fix: Contact Orshot support to verify your partner account setup.
| Code | 400 |
|---|---|
| Message | 'templateId' is missing in the request body |
Why it happens: Your request doesn't include a templateId.
Fix: Add the template ID to your request body:
body: JSON.stringify({
templateId: "your-template-id",
modifications: { ... }
})Find your template ID in the Template Playground or when viewing a template. Learn more about Template IDs.
| Code | 403 |
|---|---|
| Message | Studio template with ID 'X' not found |
Why it happens: The template ID doesn't exist in your workspace.
Fix:
| Code | 400 |
|---|---|
| Message | templateId not found. Please double check the 'templateId' value |
Why it happens: The library template ID doesn't match any available template.
Fix: Check the Templates Library for valid template IDs.
| Code | 400 |
|---|---|
| Message | Modifications for 'X' is missing in the request |
Why it happens: The modifications object is missing from your request.
Fix: Include modifications in your request body:
body: JSON.stringify({
templateId: "your-template-id",
modifications: {
title: "My Title",
// ... other modifications
},
});Learn more about Modifications.
| Code | 400 |
|---|---|
| Message | Response format not supported. Supported formats: png, jpeg, jpg, webp, pdf, mp4, webm, gif |
Why it happens: You specified an invalid response.format value.
Fix: Use one of the supported formats:
png, jpeg, jpg, webppdfmp4, webm, gifSee Response Format for details.
| Code | 400 |
|---|---|
| Message | Response type not supported. Supported types: binary, url, base64 |
Why it happens: You specified an invalid response.type value.
Fix: Use one of:
binary - Raw file data (best for direct downloads)url - Hosted URL to the rendered filebase64 - Base64-encoded stringSee Response Type for details.
| Code | 400 |
|---|---|
| Message | Binary response type is not supported for multi-page templates unless format is PDF |
Why it happens: You can't get binary output for multi-page templates (except PDFs).
Fix: Either:
response.type: "url" or "base64" for multi-page templatesresponse.format: "pdf" to get a single binary PDFresponse.includePages: [1] to render only one page as binary| Code | 400 |
|---|---|
| Message | Invalid page numbers in includePages: X. Valid range is 1-Y. |
Why it happens: You specified page numbers that don't exist in the template.
Fix: Check your template's page count and use valid page numbers (1-based).
response: {
includePages: [1, 2, 3]; // Only existing page numbers
}| Code | 400 |
|---|---|
| Message | Invalid page number 'X'. Page number must be a positive integer. |
Why it happens: The page query parameter isn't a valid positive integer.
Fix: Use a positive integer for the page parameter: ?page=1
| Code | 400 |
|---|---|
| Message | "templateId" is missing in the URL |
Why it happens: The dynamic URL is missing the required templateId query parameter.
Fix: Include templateId in your URL: ?templateId=your-template-id&sign=...
| Code | 400 |
|---|---|
| Message | "sign" parameter is missing in the URL |
Why it happens: Dynamic URLs require a sign parameter for security.
Fix: Copy the complete dynamic URL from the Template Playground, which includes the sign parameter.
| Code | 404 |
|---|---|
| Message | Sign does not match for this dynamic URL |
Why it happens: The signature doesn't match the template, possibly because URL parameters were modified.
Fix: Regenerate the dynamic URL from the Template Playground.
| Code | 404 |
|---|---|
| Message | Dynamic URL with ID 'X' not found |
Why it happens: The template ID doesn't have a dynamic URL configured.
Fix: Enable dynamic URL for your template in the Template Playground settings.
| Code | 404 |
|---|---|
| Message | Dynamic URL for templateID 'X' is inactive. Enable it from Template playground page to start rendering |
Why it happens: The dynamic URL has been disabled.
Fix: Go to your template's Playground page and toggle the dynamic URL to active.
| Code | 403 |
|---|---|
| Message | This dynamic URL has reached its maximum render limit. Increase Max Renders in the Template Playground for more renders |
Why it happens: You've hit the maximum render count set for this dynamic URL.
Fix: Increase the "Max Renders" limit in your template's Playground settings.
| Code | 403 |
|---|---|
| Message | Dynamic URL has expired. Please update the expiration time in the Template playground to continue rendering |
Why it happens: The dynamic URL's validity period has passed.
Fix: Update the expiration date in your template's Playground settings.
| Code | 400 |
|---|---|
| Message | Video generation is not supported for dynamic URLs |
Why it happens: Dynamic URLs don't support video output formats.
Fix: Use the POST API endpoint (/v1/studio/render) for video generation instead.
| Code | 400 |
|---|---|
| Message | Invalid quality value 'X'. Quality must be between 1 and 100. |
Why it happens: The quality parameter must be an integer from 1-100.
Fix: Use a valid quality value: ?quality=85
| Code | 400 |
|---|---|
| Message | Quality parameter is only supported for JPEG/JPG formats. Current format: X |
Why it happens: The quality parameter only works with JPEG output.
Fix: Either:
responseFormat=jpg or responseFormat=jpeg| Code | 401 |
|---|---|
| Message | This signed URL is inactive. Please activate it from the dashboard |
Why it happens: The signed URL has been deactivated.
Fix: Reactivate the signed URL from your dashboard.
| Code | 401 |
|---|---|
| Message | Signed URL has expired. Please create a new signed URL. |
Why it happens: The signed URL's expiration time has passed.
Fix: Generate a new signed URL with a longer expiration time.
| Code | 401 |
|---|---|
| Message | Invalid signature. Please create a new signed URL. |
Why it happens: The URL signature doesn't match, possibly due to parameter tampering.
Fix: Generate a fresh signed URL from the API or dashboard.
| Code | 400 |
|---|---|
| Message | "templateId", "signature", "modifications" or "id" is missing in the URL |
Why it happens: Required query parameters are missing from the signed URL.
Fix: Make sure all required parameters are included when generating the signed URL.
| Code | 400 |
|---|---|
| Message | Missing or invalid 'websiteUrl' value. Please provide a valid url for 'websiteUrl' modification |
Why it happens: The websiteUrl modification is missing or not a valid URL.
Fix: Provide a valid URL:
modifications: {
websiteUrl: "https://example.com";
}| Code | 400 |
|---|---|
| Message | Missing 'inputImage' value. Please provide a valid url for 'inputImage' modification |
Why it happens: The inputImage modification is required for background removal.
Fix: Provide a valid image URL:
modifications: {
inputImage: "https://example.com/image.png";
}| Code | 402 |
|---|---|
| Message | Insufficient AI credits or errors containing AI generation |
Why it happens: Your workspace has run out of AI credits for AI-powered features.
Fix: Purchase more AI credits from your Billing Settings.
| Code | 500 |
|---|---|
| Message | Orshot Server Error(details). Reach out at orshot.com/contact for support |
Why it happens: An unexpected error occurred on our servers.
Fix:
| Code | 500 |
|---|---|
| Message | Orshot Server Error: Failed to generate screenshots for multi-page template |
Why it happens: The server couldn't generate the requested images.
Fix:
| Code | 500 |
|---|---|
| Message | Failed to store page X: error details |
Why it happens: The rendered image couldn't be saved to storage.
Fix: This is usually temporary. Retry the request or contact support.
If you're still stuck:
