The error envelope#

Every error has the same shape:

{ "ok": false, "error": "Token missing required scope: verify:write", "code": "forbidden_scope" }

Use code in your integration logic; error is a human-readable message that may change.

Error codes#

HTTPcodeMeaning
401unauthorizedMissing, invalid, expired or revoked token
403forbidden_scopeThe token lacks the required scope
403forbiddenThe token's role permissions or workspace profile deny the request (for example listing employees from an institution workspace)
404not_foundThe verification or resource does not exist — or belongs to another organization
404student_not_foundPOST /student-documents: no such student in the token's institution
405method_not_allowedWrong HTTP method
422invalid_requestMissing or invalid parameters, unsupported request field, unsupported target
422invalid_typeUnsupported document_type
422student_not_validatedThe student must be validated before a document can be issued
422unprocessableA downstream service could not fulfil the request
429rate_limitedPer-token rate limit exceeded

Rate limits#

  • 120 requests per 600 seconds, per token. The counter is fail-closed: if it cannot be evaluated, the request is refused.
  • A 429 response carries Retry-After: 600. Back off for the indicated time before retrying.

Good practices#

  • Cache GET /settings and directory listings; do not poll them on every user action.
  • Handle 401 by asking the user to sign in again (add-ons) or by rotating the token (integrations).
  • Treat 404 not_found on a public ID you did not issue as expected: the API never confirms other tenants' credentials.