Docs
Verification

API Reference

Complete endpoint reference for the Verification API

POST /verifier/request

Create an OID4VP authorization request.

Authentication: API key (publishable or secret)

Request body

{
  "version": "v1",
  "dcql_query": {
    "credentials": [{
      "id": "pid",
      "format": "mso_mdoc",
      "meta": { "doctype_value": "eu.europa.ec.eudi.pid.1" },
      "claims": [
        { "path": ["eu.europa.ec.eudi.pid.1", "given_name"] }
      ]
    }]
  }
}
FieldTypeRequiredDescription
version"v1" | "draft18"NoProtocol version. Default: "v1"
namespacestringNomDoc namespace for simple queries (auto-generates DCQL)
attributesstring[]NoAttribute names within the namespace
claimsarrayNoPer-attribute namespace claims: { namespace, id, intent_to_retain }. Alternative to attributes for credentials whose attributes span multiple namespaces
scheme"openid4vp" | "mdoc-openid4vp" | "haip-vp" | "av"NoURL scheme for the request URI. "av" is the only way to trigger the AV profile
haipbooleanNoUse the HAIP profile (x509_hash client_id, haip-vp:// scheme). Default: true for v1. Set false for plain OID4VP v1 with x509_san_dns and openid4vp://
callbackbooleanNoInclude a redirect_uri in the authorization response (same-device flows)
dcql_queryDcqlQueryNoFull DCQL query (v1 only)
presentation_definitionPresentationDefinitionNoPEX query (draft18 only)

Provide either namespace + attributes for a simple query, or dcql_query / presentation_definition for full control.

Response 200

{
  "url": "haip-vp://?client_id=x509_hash%3A...&request_uri=https%3A%2F%2Fapi.verifiables.com%2Fverifier%2Fauthorization%2Frequest.jwt%2F550e8400-e29b-41d4-a716-446655440000&request_uri_method=post",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "version": "v1"
}

The default v1 request uses the haip-vp:// scheme (haip defaults to true). Pass haip: false to get an openid4vp:// request, or set scheme explicitly.

FieldTypeDescription
urlstringAuthorization request URI, display as QR code or deep link
idstring (UUID)Request ID for polling status
versionstringProtocol version used

POST /verifier/validate

Parse and resolve an existing OID4VP authorization request. This is a wallet-side helper: given an authorization request URI (or JWT), it parses the request and resolves it so a wallet can understand which credentials are being requested.

Authentication: API key (publishable or secret)

Request body

{
  "authorizationRequest": "haip-vp://?client_id=x509_hash%3A...&request_uri=..."
}
FieldTypeRequiredDescription
authorizationRequeststringYesThe authorization request to resolve (request URI or raw request string)

Response 200

Returns the resolved authorization request: the parsed payload (client_id, nonce, response_uri, DCQL query or presentation definition) as produced by resolving the request for a direct_post response.


GET /verifier/status/:request_id

Poll for the verification result after creating a request.

Authentication: API key (publishable or secret)

Path parameters

ParameterTypeDescription
request_idstring (UUID)The id returned by POST /verifier/request

Response 200: Verified

{
  "status": "valid",
  "verification": {
    "ISSUER_AUTH": [
      { "status": "✅", "check": "Issuer certificate must be valid" },
      { "status": "✅", "check": "The MSO must be valid at the time of verification" }
    ],
    "DEVICE_AUTH": [
      { "status": "✅", "check": "Device signature must be valid" }
    ]
  },
  "presentation": {
    "eu.europa.ec.eudi.pid.1": {
      "given_name": "Marie",
      "family_name": "Dupont",
      "birth_date": "1990-01-15"
    }
  }
}
FieldTypeDescription
status"created" | "claimed" | "valid" | "failed"Current request state
verificationobjectVerification checks grouped by category. Check status is "✅" (passed) or "🛑" (failed)
presentationobjectExtracted claims keyed by namespace/doctype (mDoc) or vct (SD-JWT)

Status lifecycle

StatusMeaning
createdRequest created, waiting for wallet to fetch it
claimedWallet fetched the request JWT
validCredential verified successfully
failedCryptographic verification failed

Requests expire after 600 seconds. Once the wallet response has been processed (valid or failed), the result is kept for 60 seconds. After expiry the endpoint returns the "Not found" response below. If the status is created or claimed, poll again after 2 seconds.

Response 200: Not found

{
  "error": "Authorization status not found"
}

POST /verifier/response

Submit a verification response server-side. Used for server-to-server verification flows where you handle the wallet interaction yourself.

Authentication: API key (publishable or secret)

Request body

{
  "request": {},
  "response": {},
  "jwe": "eyJ..."
}
FieldTypeRequiredDescription
requestobjectYesOriginal authorization request payload
responseobjectYesAuthorization response payload
jwestringYesEncrypted JARM response (JWE)

Schema objects

DcqlQuery object

{
  "credentials": [
    {
      "id": "pid",
      "format": "mso_mdoc",
      "meta": { "doctype_value": "eu.europa.ec.eudi.pid.1" },
      "claims": [
        {
          "path": ["eu.europa.ec.eudi.pid.1", "given_name"],
          "intent_to_retain": false
        }
      ],
      "trusted_authorities": [
        { "type": "aki", "values": ["MIGf..."] }
      ]
    }
  ],
  "credential_sets": [
    { "options": [["pid"]], "required": true }
  ]
}

credentials[]

FieldTypeRequiredDescription
idstringYesUnique credential identifier within the query
format"mso_mdoc" | "dc+sd-jwt" | "vc+sd-jwt"YesCredential format
meta.doctype_valuestringNomDoc doctype (required for mso_mdoc)
meta.vct_valuesstring[]NoSD-JWT verifiable credential types
claimsarrayNoRequested claims (see below)
require_cryptographic_holder_bindingbooleanNoRequire device binding
multiplebooleanNoAccept multiple credentials
trusted_authoritiesarrayNoTrusted issuers (see Trusted Authorities)

claims[]

FieldTypeRequiredDescription
pathstring[]YesClaim path: [namespace, attribute] for mDoc, [attribute] for SD-JWT
idstringNoClaim identifier
intent_to_retainbooleanNoDeclare intent to store the value
valuesarrayNoAcceptable values constraint

credential_sets[]

FieldTypeRequiredDescription
optionsstring[][]YesGroups of credential ids (one group must be satisfied)
requiredbooleanNoWhether this set is mandatory

PresentationDefinition object

Used with version: "draft18" only.

{
  "id": "example",
  "input_descriptors": [{
    "id": "pid",
    "format": {
      "mso_mdoc": { "alg": ["ES256"] }
    },
    "constraints": {
      "fields": [
        { "path": ["$['eu.europa.ec.eudi.pid.1']['given_name']"] }
      ],
      "limit_disclosure": "required"
    }
  }]
}

input_descriptors[]

FieldTypeRequiredDescription
idstringYesDescriptor identifier
formatobjectYesAccepted formats with algorithms
constraints.fieldsarrayYesRequired fields with JSON path
constraints.limit_disclosurestringNo"required" to minimize disclosure

Protocol endpoints

These endpoints are called by wallets directly. You do not need to call them.

MethodPathDescription
GET/verifier/authorization/request.jwt/:request_idWallet fetches the signed request JWT
POST/verifier/authorization/request.jwt/:request_idPOST variant: wallet supplies wallet_nonce / wallet_metadata, the JAR is re-signed with the nonce included
POST/verifier/authorization/response.jwt/:request_idWallet submits the encrypted (JARM) response
POST/verifier/authorization/response/:request_idWallet submits a plain (non-JWE) response. Used by the AV profile
GET/POST/verifier/callbackSame-device redirect callback