Errors

The HTTP status tells you what kind of failure it is; the code tells you which one. Branch on the code, never on the message text, which can change.

Error format

Endpoint errors carry an error object with a stable code and a human-readable message:

404 Not Found

{
  "error": {
    "code": "RUN_NOT_FOUND",
    "message": "Workflow run wr_abc123xyz789 not found"
  }
}

A few errors carry a plain string instead, with no code: authentication failures, the per-key rate limit, an oversized body, malformed JSON on POST /workflow-runs/, and unexpected 500s.

403 Forbidden

{
  "error": "Invalid or inactive API key."
}

Read both forms the same way:

Python

error = response.json().get("error")
if isinstance(error, dict):
    code, message = error["code"], error["message"]
else:
    code, message = None, error  # branch on response.status_code

Every response carries an X-Request-ID header (req_...). Quote it when you contact support; the same ID appears in your API logs.

HTTP status codes

StatusMeaning
400The request is invalid: a missing or malformed parameter, or a document that cannot be read. Fix it before sending again.
401No X-API-Key header.
402The organization cannot be billed for this document: no credits left, or no active plan.
403The key is invalid, inactive or expired, the caller's IP is not on the key's allow-list, or the organization may not use this endpoint.
404The resource does not exist in your organization.
405The method is not supported on this path. The Allow header lists the ones that are.
409The resource is not in a state that allows the call, or a limit on the number of resources is reached.
413The request body is over 100 MB.
415A run or part PDF was requested for a source document that is not a PDF.
429Over the per-key request rate (wait for Retry-After), or over the sandbox credit allowance. See limits.
500Something failed on our side. Retry with backoff if the call is safe to repeat.

Error codes

Every code, the status it comes with, and the endpoints that return it.

HTTPCodeMeaningReturned by
400APPLICATIONS_DISABLEDDossiers are not enabled for your organization.Create a workflow run, List dossiers, Create or update a dossier, List the organization's dossier configurations, One configuration's full contract
400CONFLICTING_INPUTBoth document_b64 and document_pages_b64 were sent.Create a workflow run
400FIELDS_WITHOUT_PARTYA role carries several participants and one of them has no party_ref.Create or update a dossier
400INVALID_CASE_IDcase_id is empty or longer than 255 characters.Create a workflow run, Create or update a dossier
400INVALID_CLONE_WORKFLOWSclone_workflows is not a boolean.Create a child organization
400INVALID_DOCUMENTThe content is not valid base64, or not a PDF, office document or image Holofin reads.Create a workflow run
400INVALID_EVENTSevents is not a list, or names an event that cannot be subscribed to.Register a webhook endpoint, Update a webhook endpoint
400INVALID_EXTERNAL_REFexternal_ref is not a string, or too long.Create a child organization
400INVALID_FILTERA filter has a value outside the allowed set; the message lists them.List workflow runs, List dossiers, Read a dossier's change trail
400INVALID_INPUT_FIELDA value in case_fields has the wrong shape for its field.Create or update a dossier
400INVALID_JSONThe body is not a JSON object.Create or update a dossier, Register a webhook endpoint, Update a webhook endpoint, Create a child organization, Update a child organization
400INVALID_NAMEname is missing, not a string, or too long.Register a webhook endpoint, Update a webhook endpoint, Create a child organization, Update a child organization
400INVALID_PARTY_REFA participant reference is not a distinct, non-empty string of at most 255 characters.Create a workflow run, Create or update a dossier
400INVALID_PARTY_TYPEparty_type is not one of PM, PP, PPNS or BE.Create or update a dossier
400INVALID_STATUSstatus is not one of the allowed values.Update a webhook endpoint, Update a child organization
400INVALID_URLurl is malformed or resolves to a private address.Register a webhook endpoint, Update a webhook endpoint
400INVALID_WEBHOOK_URLwebhook_url is malformed, not http(s), or resolves to a private address.Create a workflow run
400MISSING_CONFIG_IDA new dossier needs a config_id.Create or update a dossier
400MISSING_DOCUMENTNeither document_b64 nor document_pages_b64 was sent.Create a workflow run
400MISSING_URLurl is missing.Register a webhook endpoint, Update a webhook endpoint
400MISSING_WORKFLOW_IDworkflow_id is missing.Create a workflow run
400PAGE_LIMIT_EXCEEDEDThe document has more than 200 pages.Create a workflow run
400PARTY_WITHOUT_CASEparty_refs was sent without case_id.Create a workflow run
400UNKNOWN_CASE_IDcase_id names no dossier. Create it with POST /cases/ first.Create a workflow run
400UNKNOWN_CONFIGconfig_id names no case configuration.Create or update a dossier
400UNKNOWN_INPUT_FIELDA key in case_fields that the configuration does not declare; the message lists them.Create or update a dossier
400UNKNOWN_PARAMETERAn unsupported query parameter; the message lists the supported ones.List dossiers, Read a dossier's change trail, List the organization's dossier configurations, One configuration's full contract
400UNKNOWN_PARTY_REFA reference names no participant of the dossier; the message lists them.Create a workflow run
400UNKNOWN_ROLEA participant role the configuration does not define; the message lists the allowed ones.Create or update a dossier
400UNSUPPORTED_FIELDThe body carries a key that belongs to another endpoint, such as case_fields on a run.Create a workflow run, Create or update a dossier
402INSUFFICIENT_CREDITSNo credits remaining.Create a workflow run
402NO_ACTIVE_SUBSCRIPTIONThe organization has no active plan.Create a workflow run
402PLAN_NOT_PAIDThe plan is not active yet.Create a workflow run
403NOT_ALLOWEDThe key's organization may not use this endpoint.List child organizations, Create a child organization, Get a child organization, Update a child organization
404DOCUMENT_FILE_UNAVAILABLEThe document file is no longer stored, for example after its retention period.Download the run's document, Download a document part
404NOT_FOUNDNo resource with this ID in your organization.Read a dossier's status, requirements and gaps, Read a dossier's change trail, One configuration's full contract, Get a webhook endpoint, Update a webhook endpoint, Delete a webhook endpoint, Get a child organization, Update a child organization
404PART_NOT_FOUNDNo part with this key on the run.Download a document part
404RUN_NOT_FOUNDNo run with this ID in your organization.Get a workflow run, Download the run's document, Download a document part, List a run's node executions, Cancel a workflow run
404WORKFLOW_NOT_FOUNDNo workflow with this ID in your organization.Create a workflow run
405METHOD_NOT_ALLOWEDThe method is not supported on this path; see the Allow header.Create or update a dossier
409CANNOT_CANCELThe run is already completed, failed or cancelled. Treat it as success.Cancel a workflow run
409CONFIG_CONFLICTThe dossier exists under another configuration, which cannot change. Open a new dossier.Create or update a dossier
409LIMIT_REACHEDThe maximum number of child organizations is reached.Create a child organization
409RUN_NOT_TERMINALA part PDF was requested before extraction finished.Download a document part
409WEBHOOK_LIMIT_REACHEDThe organization already has 5 endpoints.Register a webhook endpoint
415UNSUPPORTED_DOCUMENT_TYPEA PDF was requested for a source document that is not a PDF, such as a spreadsheet.Download the run's document, Download a document part
429SANDBOX_LIMIT_EXCEEDEDThe document needs more sandbox credits than remain. Backing off does not help.Create a workflow run
500INTERNAL_ERRORAn unexpected error.Any endpoint
500PDF_RESOLUTION_FAILEDThe run or part PDF could not be produced.Download the run's document, Download a document part