Errors
Every EDFlow error code: request-level HTTP status on the signed ingest profile, per-event result codes, and REST API problem details (RFC 9457) with retryable flags and the retry action to take first.
REST API: problem details
Every non-2xx response on /v1/* is application/problem+json (RFC 9457):
{
"type": "https://…/problems/insufficient_scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This operation needs the requests:write scope. Your token has: requests:read encounters:read.",
"code": "insufficient_scope",
"requestId": "rid_01J8ZQ4M2B7V6T1K9C3X5N0P8R",
"retryable": false,
"requiredScopes": ["requests:write"]
}- Switch on
code, never on the text. retryablesays whether a retry can succeed;retryActionsays what to do first:reauthenticate(new token),resign(new timestamp, delivery id and signature) orwait(honourRetry-After).- Validation failures add
errors[]with JSON Pointer paths. detailnever echoes secrets, tokens, visit numbers or payload values.- FHIR routes return an
OperationOutcomewhen you ask forapplication/fhir+json; raw HL7 returns an ACK (see HL7 v2); the OAuth endpoints use RFC 6749 error bodies. - Quote
requestIdin support tickets.
Request-level errors
| HTTP | Codes | Retryable | Do this |
|---|---|---|---|
| 400 | invalid_request, malformed_json, invalid_cursor, idempotency_key_required, site_required, batch_too_large | No | Fix the request |
| 401 | unauthenticated, invalid_token, token_revoked, wrong_environment, mtls_required | No | Fix the credential or host |
| 401 | token_expired | Yes, reauthenticate | New token, same request |
| 401 | missing_signature, invalid_signature, unknown_source (signed profile) | No | Check the key, version and body bytes |
| 401 | timestamp_out_of_window, delivery_replayed (signed profile) | Yes, resign | Re-sign with a new timestamp and delivery id |
| 403 | insufficient_scope, site_not_allowed, capability_disabled, ip_not_allowed, client_disabled, org_suspended, source_disabled | No | See detail |
| 404 | not_found | No | Unknown route or resource, or a resource at another site |
| 405, 406 | method_not_allowed, not_acceptable | No | |
| 409 | idempotency_in_progress | Yes, after a short wait | The same key is still running |
| 409 | idempotency_conflict, conflict | No | Event id reused with a different payload; or a state conflict |
| 410 | gone | No | Past its sunset date |
| 413, 415 | payload_too_large, unsupported_media_type | No | Split or fix the content type |
| 422 | validation_failed, idempotency_key_reused, event_rejected, processing_id_not_allowed, phi_suspected, transaction_not_supported, unsupported_encoding | No | Fix and resend |
| 429 | rate_limited | Yes, wait | Honour Retry-After |
| 500 | internal_error | Yes, with backoff | Quote the requestId |
| 503 | unavailable | Yes, wait | Keep it queued; honour Retry-After |
Per-event result codes
Inside a 200 batch response, each event has its own result. Rejected events carry one of these codes and a path:
| Code | Retryable | Cause |
|---|---|---|
invalid_envelope | No | Envelope field missing or malformed, or an id containing an identifier |
unsupported_spec_version | No | specVersion isn't supported |
unknown_event_type | No | Not in the catalogue |
event_type_not_allowed, site_not_allowed, source_kind_not_allowed | No | Your source isn't allowed to send it |
simulator_disabled | No | Simulator events outside a synthetic deployment |
encounter_required | No | The type needs encounter |
invalid_data | No | data failed validation; path points at the field |
prohibited_field | No | A prohibited key anywhere in the event |
idempotency_conflict | No | The id was used with a different payload |
occurred_at_in_future, occurred_at_too_old | No | More than 10 minutes ahead, or more than 90 days old |
processing_error | Yes | Transient; resend that event (same id) later |
The product's error catalogue
Errors raised by the product itself, with the text people see:
| Code | Groupe | Ce que les gens voient |
|---|---|---|
unauthenticated | Base | — |
forbidden | Base | Vous n'avez pas accès à cette page. Demandez-le à votre gestionnaire de l'urgence si vous en avez besoin. |
not_found | Base | Nous n'avons pas trouvé cette page. |
not_opened | Base | — |
invalid_argument | Base | — |
out_of_range | Base | — |
rate_limited | Base | — |
conflict | Base | Quelqu'un d'autre a modifié cet élément. Passez en revue ses changements et réessayez. |
access_ended | Base | — |
read_only | Base | — |
identity_unconfirmed | Base | — |
mfa_required | Base | — |
mfa_enrolment_required | Base | — |
session_locked | Base | — |
reauth_required | Base | — |
forbidden_in_production | Base | — |
sharing_unavailable | Base | — |
limit_reached | Base | — |
code_category_cannot_notify | Base | — |
invalid_transition | Base | — |
undo_expired | Base | — |
last_manager | Base | — |
approver_is_editor | Base | — |
content_not_ready | Base | — |
key_version_limit | Base | — |
key_already_revealed | Base | — |
provider_not_configured | Base | — |
password_policy | Base | — |
invalid_code | Base | — |
flow_disabled | Base | — |
forbidden_demo | Base | — |
approval_required | Base | — |
self_approval | Base | — |
verification_required | Base | — |
verification_failed | Base | — |
device_limit | Base | — |
owner_only | Base | — |
updates_paused | Base | — |
station_required | Base | — |
budget_exhausted | Base | — |
conflict_of_interest | Base | — |
policy_violation | Plateforme d'intégration | — |
sod_violation | Plateforme d'intégration | — |
affiliation_pending | Plateforme d'intégration | — |
attestation_required | Plateforme d'intégration | — |
app_not_approved | Plateforme d'intégration | — |
in_use | Plateforme d'intégration | — |
ai_disabled | Fonctions d'IA | — |
ai_unavailable | Fonctions d'IA | — |
ai_rate_limited | Fonctions d'IA | — |
ai_budget_exhausted | Fonctions d'IA | — |
ai_input_too_long | Fonctions d'IA | — |
ai_blocked | Fonctions d'IA | — |
ai_approval_invalid | Fonctions d'IA | — |
ai_approval_expired | Fonctions d'IA | — |
ai_region_violation | Fonctions d'IA | — |
ai_language_not_ready | Fonctions d'IA | — |
ai_governance_incomplete | Fonctions d'IA | — |
ai_sample_unscrubbable | Fonctions d'IA | — |
ai_sample_not_synthetic | Fonctions d'IA | — |
ai_audio_too_long | Fonctions d'IA | — |
ai_opted_out | Fonctions d'IA | — |
ai_query_refused_differencing | Fonctions d'IA | — |
ai_review_conflict | Fonctions d'IA | — |
ai_brand_mismatch | Fonctions d'IA | — |
Related
Dernière mise à jour le
Cette page vous a-t-elle été utile?
AI mapping assistant
Use the EDFlow mapping assistant to draft a site mapping profile from sample HL7 v2, FHIR or CSV: synthetic samples only in the sandbox, allow-list scrubbing, a proposed profile validated against the event schema, and nothing applied without review.
Rate limits and retries
EDFlow rate limits per bucket, the RateLimit headers, which errors to retry and how, exponential backoff with jitter, idempotency keys, and batching and size limits.