Skip to content

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.
  • retryable says whether a retry can succeed; retryAction says what to do first: reauthenticate (new token), resign (new timestamp, delivery id and signature) or wait (honour Retry-After).
  • Validation failures add errors[] with JSON Pointer paths.
  • detail never echoes secrets, tokens, visit numbers or payload values.
  • FHIR routes return an OperationOutcome when you ask for application/fhir+json; raw HL7 returns an ACK (see HL7 v2); the OAuth endpoints use RFC 6749 error bodies.
  • Quote requestId in support tickets.

Request-level errors

HTTPCodesRetryableDo this
400invalid_request, malformed_json, invalid_cursor, idempotency_key_required, site_required, batch_too_largeNoFix the request
401unauthenticated, invalid_token, token_revoked, wrong_environment, mtls_requiredNoFix the credential or host
401token_expiredYes, reauthenticateNew token, same request
401missing_signature, invalid_signature, unknown_source (signed profile)NoCheck the key, version and body bytes
401timestamp_out_of_window, delivery_replayed (signed profile)Yes, resignRe-sign with a new timestamp and delivery id
403insufficient_scope, site_not_allowed, capability_disabled, ip_not_allowed, client_disabled, org_suspended, source_disabledNoSee detail
404not_foundNoUnknown route or resource, or a resource at another site
405, 406method_not_allowed, not_acceptableNo
409idempotency_in_progressYes, after a short waitThe same key is still running
409idempotency_conflict, conflictNoEvent id reused with a different payload; or a state conflict
410goneNoPast its sunset date
413, 415payload_too_large, unsupported_media_typeNoSplit or fix the content type
422validation_failed, idempotency_key_reused, event_rejected, processing_id_not_allowed, phi_suspected, transaction_not_supported, unsupported_encodingNoFix and resend
429rate_limitedYes, waitHonour Retry-After
500internal_errorYes, with backoffQuote the requestId
503unavailableYes, waitKeep 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:

CodeRetryableCause
invalid_envelopeNoEnvelope field missing or malformed, or an id containing an identifier
unsupported_spec_versionNospecVersion isn't supported
unknown_event_typeNoNot in the catalogue
event_type_not_allowed, site_not_allowed, source_kind_not_allowedNoYour source isn't allowed to send it
simulator_disabledNoSimulator events outside a synthetic deployment
encounter_requiredNoThe type needs encounter
invalid_dataNodata failed validation; path points at the field
prohibited_fieldNoA prohibited key anywhere in the event
idempotency_conflictNoThe id was used with a different payload
occurred_at_in_future, occurred_at_too_oldNoMore than 10 minutes ahead, or more than 90 days old
processing_errorYesTransient; resend that event (same id) later

The product's error catalogue

Errors raised by the product itself, with the text people see:

CodeGroupWhat people see
unauthenticatedCore—
forbiddenCoreYou don't have access to this page. Ask your ED manager if you need it.
not_foundCoreWe couldn't find this page.
not_openedCore—
invalid_argumentCore—
out_of_rangeCore—
rate_limitedCore—
conflictCoreSomeone else changed this. Review their changes and try again.
access_endedCore—
read_onlyCore—
identity_unconfirmedCore—
mfa_requiredCore—
mfa_enrolment_requiredCore—
session_lockedCore—
reauth_requiredCore—
forbidden_in_productionCore—
sharing_unavailableCore—
limit_reachedCore—
code_category_cannot_notifyCore—
invalid_transitionCore—
undo_expiredCore—
last_managerCore—
approver_is_editorCore—
content_not_readyCore—
key_version_limitCore—
key_already_revealedCore—
provider_not_configuredCore—
password_policyCore—
invalid_codeCore—
flow_disabledCore—
forbidden_demoCore—
approval_requiredCore—
self_approvalCore—
verification_requiredCore—
verification_failedCore—
device_limitCore—
owner_onlyCore—
updates_pausedCore—
station_requiredCore—
budget_exhaustedCore—
conflict_of_interestCore—
policy_violationIntegration platform—
sod_violationIntegration platform—
affiliation_pendingIntegration platform—
attestation_requiredIntegration platform—
app_not_approvedIntegration platform—
in_useIntegration platform—
ai_disabledAI features—
ai_unavailableAI features—
ai_rate_limitedAI features—
ai_budget_exhaustedAI features—
ai_input_too_longAI features—
ai_blockedAI features—
ai_approval_invalidAI features—
ai_approval_expiredAI features—
ai_region_violationAI features—
ai_language_not_readyAI features—
ai_governance_incompleteAI features—
ai_sample_unscrubbableAI features—
ai_sample_not_syntheticAI features—
ai_audio_too_longAI features—
ai_opted_outAI features—
ai_query_refused_differencingAI features—
ai_review_conflictAI features—
ai_brand_mismatchAI features—

Last updated on

Was this page helpful?

On this page