Error Handling and Troubleshooting
The Issuer Service uses standard HTTP status codes and JSON error responses. A global error filter normalizes every failure into a consistent JSON body, so clients can rely on the same shape across all endpoints.
Common Status Codes:
400 Bad Request: Invalid request parameters or missing fields (for example, a credential schema whose
namecontains spaces, or a credential offer with an emptycredentialConfigurationIdsarray). The global validation pipe also rejects any JSON property that is not part of the endpoint's schema, with a message likeproperty X should not exist.401 Unauthorized: A missing, malformed, or expired OIDC JWT Bearer token, or a token whose signature cannot be verified against the configured JWKS endpoint.
403 Forbidden: The token is valid but lacks the required
adminrole (accepted fromrealm_access.rolesor aresource_accessclient-role entry) on a route that enforces it, or it does not grant ownership of the requested holder.404 Not Found: A non-existent schema ID (
GET /schemas/:schemaId) or a request for a hosted DID document that does not exist. Unknown issuer, session, or credential-offer identifiers currently surface as500rather than404.409 Conflict: A schema with the same
nameandversionalready exists (POST /schemas).410 Gone: The requested schema version has been superseded by a newer version. Retrieve it by passing
includeInactive=trueon the schema endpoint.429 Too Many Requests: The global rate limit (60 requests per 60 seconds) has been exceeded. DID document serving is exempt from this limit.
500 Internal Server Error: Unexpected server issues.
Example Error Response:
{
"statusCode": 410,
"message": "Schema version is superseded.",
"error": "Gone",
"path": "/schemas/[email protected]",
"timestamp": "2026-06-22T10:15:30.000Z"
}Error bodies always include statusCode, message, path, and timestamp; responses produced by standard HTTP exceptions additionally include an error label (for example, "Gone" for 410 or "Conflict" for 409).
Troubleshooting Tips:
Validate request payloads against your credential schema definitions before sending. For SD-JWT credentials, ensure the
vctclaim is present in the signing payload.Ensure the request carries a current, unexpired OIDC JWT Bearer token in the
Authorization: Bearer <token>header. Theadminrole is required only on the agent/DID/issuer/verifier/holder management routes (/agent/*) and the cloud-wallet routes (/holders/:holderId/*).For
401errors, confirm the JWKS endpoint (OIDC_JWKS_URL) is reachable, that the token'skidheader matches a key published by that endpoint, and that the token has not expired.For
403errors on a management or holder route, confirm the token includes theadminrole inrealm_access.rolesor in aresource_accessclient-role entry, and that the holder you are addressing belongs to the authenticated user.For
410errors, the schema version is superseded. UseincludeInactive=trueto read the old version, or reference the current active version returned byGET /schemas/:schemaName/versions.Verify database connectivity (
DATABASE_URL) — the service stores schemas, sessions, signing keys, and hosted DID documents in PostgreSQL.Check service logs for detailed error messages. Server-side failures (
5xx) are logged with a stack trace; client errors (4xx) are logged as warnings.
If issues persist, review your environment configuration (DATABASE_URL, ISSUER_BASE_URL, OIDC_JWKS_URL), your schema definitions, and network connectivity between the service and its OIDC provider.
Last updated