Error Codes
This page documents all HTTP status codes and error messages returned by the Enconvert API.
HTTP Status Codes
| Code |
Status |
Description |
200 |
OK |
Conversion completed successfully (sync mode). |
202 |
Accepted |
Batch or async job has been accepted for background processing. |
400 |
Bad Request |
Invalid parameters, missing required fields, malformed request body, or invalid file content. |
401 |
Unauthorized |
Missing, invalid, or expired API key or JWT token. |
402 |
Payment Required |
Monthly conversion limit or storage limit exceeded. |
403 |
Forbidden |
Feature not available on plan, domain not authorized, endpoint not allowed, or access denied. |
404 |
Not Found |
Requested resource (job, batch, file, or widget) does not exist. |
413 |
Payload Too Large |
Uploaded file exceeds the size limit for your subscription plan. |
500 |
Internal Server Error |
Unexpected error during conversion. |
503 |
Service Unavailable |
A converter or backend service is unavailable. |
Most error responses follow a standard JSON structure with a detail field:
{
"detail": "Error message describing the issue"
}
Exception: The
413 Payload Too Large response uses a different format with structured fields instead of
detail. See the
413 section below.
400 Bad Request
Returned when the request contains invalid parameters, missing fields, or malformed data.
| Message |
Condition |
'url' must be provided |
Missing or empty url field on URL-based endpoints. |
Invalid file format '{ext}' for {endpoint}. Allowed: {list} |
Uploaded file extension doesn't match the endpoint's accepted formats. |
Invalid pdf_options: {error} |
Malformed JSON in the pdf_options form field. |
Batch and Mode Validation
| Message |
Condition |
Public keys only support a single URL input |
Public/dashboard key attempted to send multiple URLs. |
output_format=True requires multiple URLs |
ZIP bundling requested with only one URL. |
direct_download not supported for multiple URLs |
direct_download=true with an array of URLs. |
direct_download only works in sync mode |
direct_download=true combined with async_mode=true. |
| Message |
Condition |
'auth' must be an object with 'username' and 'password' |
auth parameter has wrong structure. |
'cookies' must be an array of cookie objects |
cookies is not an array. |
'cookies' array must not exceed 50 entries |
More than 50 cookies provided. |
Cookie at index {i} must be an object |
Cookie entry is not a dictionary. |
Cookie at index {i} must have 'name' and 'value' |
Cookie missing required fields. |
Cookie at index {i} must have 'domain' or 'url' |
Cookie missing both domain and url. |
'headers' must be an object of header name/value pairs |
headers is not a dictionary. |
'headers' must not exceed 20 entries |
More than 20 custom headers. |
Header '{name}' cannot be overridden |
Attempt to set a blocked header (host, content-length, etc.). |
Header '{name}' value must be a string |
Header value is not a string. |
Cannot use both 'auth' and an 'Authorization' header |
Both auth object and Authorization custom header provided. |
Sitemap and Crawl Errors
| Message |
Condition |
No URLs found in sitemap: {url} |
Sitemap parsed but contains no URLs. |
Timeout fetching sitemap: {url} |
Sitemap fetch exceeded 30-second timeout. |
Could not fetch sitemap: {url} returned {status} |
Sitemap URL returned a non-200 HTTP status. |
Invalid XML in sitemap: {url} |
Sitemap XML could not be parsed. |
Unrecognized sitemap format at {url}: root element is <{tag}> |
Sitemap root element is not <urlset> or <sitemapindex>. |
No pages discovered on {base_url} |
Full crawl completed but found zero pages. |
Conversion Content Errors
| Message |
Condition |
Invalid JSON: {error} |
JSON file contains invalid JSON syntax. |
Invalid YAML: {error} |
YAML file contains invalid YAML syntax. |
Invalid TOML: {error} |
TOML file contains invalid TOML syntax. |
Invalid HTML encoding (expected UTF-8) |
HTML file is not UTF-8 encoded. |
Invalid Markdown encoding (expected UTF-8) |
Markdown file is not UTF-8 encoded. |
JSON must be an array of objects for CSV conversion |
json-to-csv input is not an array. |
JSON array is empty |
json-to-csv input is an empty array. |
CSV file is empty or has no valid rows |
CSV file has no data rows. |
XML structure cannot be converted to CSV |
XML is not tabular (xml-to-csv). |
Turnstile verification failed |
Cloudflare Turnstile bot challenge failed. |
Turnstile token required |
Widget request without a Turnstile token. |
401 Unauthorized
Returned when authentication is missing or invalid.
| Message |
Condition |
Authentication required |
No API key and no JWT token provided in the request. |
Invalid API Key format |
API key is too short or does not start with sk_ or pk_. |
Invalid API Key |
API key hash not found in the database. |
API Key revoked |
API key has been deactivated from the dashboard. |
Token has expired |
JWT access token has expired (1-hour lifetime). |
Invalid token |
JWT is malformed, tampered with, or otherwise invalid. |
Refresh token has expired |
Refresh token has expired (7-day lifetime). |
Invalid refresh token |
Refresh token is malformed or invalid. |
Invalid token type |
Token decoded successfully but is not the expected type (refresh). |
No refresh token |
Widget refresh endpoint called without a refresh_token cookie. |
402 Payment Required
Returned when usage limits are exceeded.
| Message |
Condition |
Monthly conversion limit reached ({used}/{limit}). Upgrade your plan to continue. |
Monthly conversion count has reached the plan's limit. Free plan: 100 conversions. |
Batch of {N} URLs would exceed your monthly limit. You have {remaining} conversions remaining out of {limit}. |
Batch request would exceed the remaining monthly quota. The entire batch is rejected upfront. |
Storage limit reached. Delete files or upgrade your storage plan to continue. |
Project storage usage has reached the plan's storage allocation. |
403 Forbidden
Returned when access is denied due to key type, domain, plan, or endpoint restrictions.
API Key and Token Restrictions
| Message |
Condition |
Private API keys cannot be used from browsers |
A private key (sk_live_...) was used in a request with a browser Origin header. Use a public key with JWT instead. |
Domain {origin} not authorized |
Request origin does not match any domain in the API key's allowed domains list. |
Public API keys can only be used to generate JWT tokens. Please exchange your public key for a JWT token at /v1/auth/token, then use the token for API calls. |
A public key was used to call a conversion endpoint directly instead of exchanging for a JWT first. |
Endpoint '{path}' not allowed for this API key |
The API key's allowed_endpoints list does not include the requested path. |
Endpoint '{path}' not allowed for this token |
The JWT token's allowed_endpoints list does not include the requested path. |
Token issued for different origin |
Request origin does not match the origin recorded in the JWT (prevents token theft). |
Parent origin does not match token |
X-Parent-Origin header does not match what was validated at token issuance. |
Plan Feature Restrictions
| Message |
Condition |
Async processing is not available on your current plan. Please upgrade to access this feature. |
async_mode=true on a plan without async access. |
Webhook callbacks is not available on your current plan. Please upgrade to access this feature. |
callback_url provided on a plan without webhook access. |
ZIP output bundling is not available on your current plan. Please upgrade to access this feature. |
output_format=true on a plan without ZIP output access. |
HTTP Basic Auth, cookies, and custom headers is not available on your current plan. Please upgrade to access this feature. |
auth, cookies, or headers used on a plan without basic auth access. |
Batch processing is not available on your current plan. Please upgrade to access this feature. |
Multiple URLs submitted on a plan with batch_limit of 0. |
Batch size {N} exceeds your plan's limit of {M} URLs per batch. |
Number of URLs exceeds the plan's batch size limit. |
Website crawling is not available on your current plan. Please upgrade to access this feature. |
Website capture endpoint used on a plan with crawl_mode "none" (Free plan). |
Full website crawling requires a Pro plan or higher. Your plan supports sitemap-based crawling only. |
crawl_mode=full requested on a Starter plan that only supports sitemap crawling. |
| Message |
Condition |
Widget API key has been revoked |
The widget's linked internal API key has been deactivated. |
Domain {origin} is not authorized for this widget |
Widget embedding domain not in the widget's allowed domains list. |
Refresh token does not match widget |
Refresh token's project ID does not match the widget's project. |
Batch status requires a private API key |
Public or dashboard key attempted to access GET /v1/convert/batch/{batch_id}. |
Access denied |
Attempting to access a resource (job status, file) belonging to a different project. |
404 Not Found
| Message |
Condition |
Job not found |
Conversion job ID not found in the database (status polling). |
Batch not found |
Batch ID has no matching activity rows for this project. |
File not found |
Requested file does not exist in storage (download endpoint). |
Widget not found |
Widget ID not found or widget has been deactivated. |
413 Payload Too Large
Returned when the uploaded file exceeds the plan's maximum file size.
Different response format: This error uses a structured object instead of the standard detail field.
{
"error": "File too large",
"file_size": 10485760,
"max_size": 5242880,
"tier": "free",
"key_type": "private"
}
| Field |
Description |
error |
Always "File too large". |
file_size |
The size of the uploaded file in bytes. |
max_size |
The maximum allowed file size for your plan in bytes. |
tier |
Your subscription plan slug (e.g., "free", "starter", "pro"). |
key_type |
The type of API key used ("private", "public"). |
File size is checked via the Content-Length request header before the file body is read.
500 Internal Server Error
| Message |
Condition |
Conversion failed: {error} |
An unexpected error occurred during file or URL conversion. |
If you encounter persistent 500 errors, the issue is likely with the input file or URL. Try with a different input to isolate the problem.
503 Service Unavailable
| Message |
Condition |
Converter not available: {endpoint} |
The requested converter is not registered or not running. |
Converter not available |
The URL-based converter for the requested endpoint is not available. |
Turnstile verification unavailable |
The Cloudflare Turnstile verification service is unreachable. |
These errors are typically transient. Retry the request after a short delay.
Troubleshooting
Authentication Issues
- Getting 401? Check that your API key is valid and active in the dashboard. If using JWT, ensure the token hasn't expired (1-hour lifetime).
- Getting 403 about browser usage? You're using a private key (
sk_live_...) from client-side code. Switch to a public key with JWT for browser-based requests.
- Getting 403 about domain? Add your domain to the API key's allowed domains list in the dashboard.
Conversion Issues
- Getting 400 about file format? Ensure the uploaded file extension matches the endpoint (e.g.,
.json for json-to-xml, .docx for doc-to-pdf).
- Getting 413? Your file exceeds the plan's size limit. Check your plan's max file size or upgrade.
- Getting 402? You've hit your monthly conversion limit or storage limit. Check usage in the dashboard.
Feature Access Issues
- Getting 403 about plan features? The feature you're trying to use (async, batch, webhooks, etc.) requires a higher plan tier. Check the feature gating table.