DocumentationAPI Reference

Error codes

Error codes

All 34 error codes of the markitdown.ai API v1 in one table: HTTP status, meaning, whether to retry, and what to do.

Error format

Errors are application/problem+json. Branch on error (the code below); detail explains this particular failure and retryable says whether repeating the same request can succeed. 429 and 503 also send Retry-After.

402 example
{
  "type": "https://markitdown.ai/docs/errors/insufficient_credits",
  "title": "Insufficient credits",
  "status": 402,
  "detail": "Insufficient credits",
  "instance": "/v1/convert/pdf",
  "error": "insufficient_credits",
  "message": "Insufficient credits",
  "request_id": "00000000-0000-4000-8000-000000000002",
  "retryable": false,
  "hint": "Upgrade the plan or reduce the requested work."
}

All error codes

CodeStatusMeaningRetryWhat to do
invalid_request400Invalid requestNoCheck the request fields and types.
invalid_input400Invalid inputNoProvide exactly one supported input.
url_not_allowed400URL not allowedNoUse a public HTTP or HTTPS URL.
invalid_webhook_url400Invalid webhook URLNoUse a public https URL that does not resolve to a private or reserved address.
schema_unsupported400Schema unsupportedNoUse the documented JSON Schema subset.
unauthorized401UnauthorizedNoSend a valid API key in x-api-key.
insufficient_credits402Insufficient creditsNoUpgrade the plan or reduce the requested work.
forbidden403ForbiddenNoCheck account access for this operation.
scope_missing403Scope missingNoCreate a key with the required scope.
subscription_required403Subscription requiredNoSubscribe to Lite, Pro, or Max to use conversions.
upload_limit_exceeded403Upload limit exceededNoReduce stored files or upgrade the plan.
not_found404Not foundNoCheck the resource identifier.
job_not_terminal409Job not terminalYesWait for the job to finish before reading its result.
idempotency_conflict409Idempotency conflictNoUse a new Idempotency-Key for a different request body.
upload_not_completed409Upload not completedNoFinish POST /v1/uploads/{id}/complete before referencing it, or start a new upload.
upload_already_used409Upload already usedNoStart a new upload; each completed upload can be submitted once.
file_expired410File expiredNoThe referenced file's conversion has expired or been deleted; upload it again.
upload_aborted410Upload abortedNoThis upload was aborted and can never complete; start a new upload.
upload_too_large413Upload too largeNoUpload a smaller file.
input_too_large413Input too largeNoReduce the input size.
upload_type_unsupported415Upload type unsupportedNoUse a supported document or media type.
input_format_mismatch415Input format mismatchNoSend a format accepted by this endpoint.
page_cap_exceeded422Page cap exceededNoReduce the page range or choose a plan with a higher cap.
document_unprocessable422Document unprocessableNoCheck whether the document is damaged or encrypted.
url_fetch_failed422URL fetch failedYesRetry later or upload the page as a file.
source_not_supported422Source not supportedNoUpload the source file, subtitles, or pasted text instead.
duration_cap_exceeded422Duration cap exceededNoUse a shorter media file.
rate_limited429Rate limitedYesRetry after the indicated delay.
concurrency_limited429Concurrency limitedYesRetry after an active job finishes.
internal_error500Internal errorYesRetry with the same Idempotency-Key.
parse_failed500Parse failedYesRetry or use another supported input.
webhooks_unavailable502Webhooks unavailableYesRetry after the indicated delay; webhook management is temporarily unavailable.
conversion_unavailable503Conversion unavailableYesRetry after the indicated delay.
parser_unavailable503Parser unavailableYesRetry after the indicated delay.

On this page