Errors

The API returns three different error shapes depending on which surface you hit. Parse defensively.

Integration endpoints

Anything you call with an API key returns a plain message:

{
  "message": "API key is not authorized for this issuer"
}
StatusCause
400request rejected — missing metadata.redirectUri, offer too large for by_value
401missing key, malformed key, wrong secret, expired key
403key valid but scoped to a different issuer, verifier or organization
404issuer, verifier, profile or record not found; diagnostics disabled
422schema validation failed, returned as a Zod error envelope

Wallet protocol endpoints

The token, credential, nonce and PAR endpoints follow OAuth 2.0 error conventions:

{
  "error": "invalid_proof",
  "error_description": "Proof JWT signature did not verify"
}
errorTypical status
invalid_request, invalid_credential_request, invalid_encryption_parameters400
unknown_credential_configuration, unknown_credential_identifier400
unsupported_credential_format, unsupported_credential_type, unsupported_grant_type400
invalid_client, invalid_grant400401
invalid_token401 or 403
invalid_proof, invalid_nonce403

These are returned to the wallet, not to you — they surface in the diagnostics timeline.

Unexpected failures

An unhandled server error returns a wrapped body, and in production the message is always generic:

{
  "error": {
    "code": "INTERNAL_ERROR",
    "message": "Internal server error",
    "timestamp": "2026-08-11T09:00:00.000Z",
    "requestId": "01J…"
  }
}

INTERNAL_ERROR is the only code in this shape — quote requestId when you report it.

Was this page helpful?