Skip to main content

Error codes

This page is the single source of truth for error handling. SDK-specific error codes are documented in each SDK's Error handling page; this page covers errors at the API contract level.

HTTP status codes

CodeMeaningWhere it applies
200 OKRequest succeeded.All contracts.
201 CreatedResource created (rare; most creations return 200).API contract.
400 Bad RequestPayload is malformed or required fields are missing. The body identifies the problematic fields.All contracts.
401 UnauthorizedAuthentication missing, expired, or invalid.All contracts.
403 ForbiddenAuthentication is valid but the tenant is not enabled for the requested resource (e.g., calling a capability not in your APIKEY).Web & SDK, API.
404 Not FoundResource does not exist or does not belong to the authenticated tenant.All contracts.
409 ConflictThe resource exists but is not in the right state for this operation (e.g., fetching documents from a process still in progress).Web & SDK, API.
410 GoneThe resource existed but was deleted per the retention policy (document fetch endpoints), or the process exists but ended in an error state — see Get Process.Document fetch endpoints; API Get Process.
429 Too Many RequestsYou hit the rate limit. Retry with exponential backoff.All contracts.
5xxPlatform error. Retry with backoff; if persistent, contact support with the response body and timestamp.All contracts.

Authentication errors (401)

CauseSymptom
Wrong private key (assertion signed with the wrong key)401, Authentication failed (1.2.21)
aud does not match the environment URL401
exp claim in the past401, Authentication failed
Unsupported algorithm (use RS256)401
Mixed sandbox / production credentials401, even though credentials look correct
Missing APIKEY header (API contract only)401
Invalid x-api-key (Magic Link only)401

See Authentication > Common errors for the full troubleshooting checklist.

Capability-level outcomes (200 with negative result)

A 200 OK does not mean the user passed the verification — it means the platform completed the work. The user-facing decision lives in the response body, not the HTTP status:

FieldNegative valueWhere it appears
process.resultPROCESS_RESULT_FAILEDWeb & SDK
process.authenticationInfo.livenessResultNOWeb & SDK
liveness2API
unicoId.resultnoAPI
data.result.statusnot_verifiedMagic Link

Retry policy

StatusShould retry?How
5xxYesExponential backoff (1s, 2s, 4s, 8s, …). Cap at 5 attempts.
429YesHonor the Retry-After header if present; otherwise exponential backoff.
4xx (other)NoThe request is wrong. Fix the input before retrying.
401ConditionallyRefresh the access token once. If the new request also returns 401, the issue is structural — don't retry.
Idempotency

The IDCloud platform does not currently expose an idempotency-key mechanism on creation endpoints. Be cautious when retrying POST /client/v1/process or POST /processes/v1 — a network error on a 5xx may have actually succeeded server-side, and a retry would create a duplicate process. When in doubt, retrieve recent processes by your internal correlation ID before retrying.

Where SDK errors live

The error catalogs of the Web SDK, Android SDK, iOS SDK, and Flutter SDK are documented in each SDK's dedicated Error handling page:

These cover device-side errors (camera permission denied, capture timeout, network unreachable on the device) — separate from the API-side errors documented here.