Core Responsibilities
The Verifier's responsibilities fall into five areas:
Verification Request Management:
Creates OpenID4VP authorization requests, choosing a response mode (
direct_post,direct_post.jwt,dc_api, ordc_api.jwt; defaultdirect_post.jwt) and an OpenID4VP draft version (v1,v1.draft21, orv1.draft24; defaultv1).Specifies the required credentials and attributes through a configurable query language — either a DCQL query or a DIF Presentation Exchange v2 definition. Exactly one of the two must be supplied per request.
Signs each authorization request with the verifier's DID, so wallets can authenticate the relying party before disclosing any data. The signing DID is taken from the
verifierIdwhen it is itself a DID, or from the optionalsigningDidfield in the request body.Returns an authorization-request URI (
openid4vp://...) and a verification session id, and can render the same request as a scannable QR code.
Credential Validation:
Checks the cryptographic signatures of presented credentials, supporting SD-JWT VC and JWT-VC formats.
Resolves the issuer's DID document to confirm the signing key and the issuer's identity. Issuer DIDs are resolved over standard methods —
did:web(served over an HTTPS origin) anddid:key— rather than through any centralized registry.Honors SD-JWT selective disclosure, so only the claims the holder chooses to reveal are processed.
Validation today rests on DID resolution and signature verification; revocation-status and domain-linkage checks are planned additions (see Future Enhancements).
Real-Time Communication and Feedback:
Streams verification session updates over Server-Sent Events (SSE), so your application learns about progress and the final outcome as it happens.
Emits a
sessionevent carrying the current session state immediately on subscribe and on each subsequent change, plus apingkeepalive every 15 seconds to hold the connection open.
Session Management:
Tracks each verification session through its lifecycle —
RequestCreated→RequestUriRetrieved→ResponseVerified, orErrorif the response fails validation. Sessions also carry anexpiresAttimestamp after which the request is no longer accepted.Exposes the session state (by polling
GET /verification-sessions/:sessionIdor by subscribing to its SSE stream) so your integration can trigger its own login or access-control logic once a session reachesResponseVerified. The Verifier itself does not issue application tokens or sessions — your relying party decides what a successful verification grants.
Integration Support:
Provides a REST + SSE surface for the full presentation flow: create an authorization request (with optional QR-code rendering), then read or watch the resulting verification session.
Offers a standalone
POST /credentials/verifyendpoint for ad-hoc credential checks outside the presentation flow — useful when you already hold a compact SD-JWT or JWT-VC string and simply want to confirm its validity. The response reportsisValid, the detectedformat, and the decodedpayload(plusprettyClaimsfor SD-JWT), or anerrormessage when the credential is invalid.
For example, a standalone credential check:
A valid SD-JWT VC returns:
The format field reports the detected credential format: dc+sd-jwt for a verified SD-JWT VC, and jwt_vc for a verified JWT-VC.
In every flow, the relying party stays in control of what a verified presentation unlocks.
Last updated