Receive DC API verification response
POST/v2/config/digital-wallet/openid/sdjwt/verification/history/:presentationExchangeId/receive
Receives an OpenID4VP Authorization Response delivered over the W3C Digital Credentials API (DC API) transport for a previously created verification request.
The verifier frontend invokes the browser's navigator.credentials.get() with the request returned in dcApiRequest. The browser routes the request to the holder's wallet, which produces a credential response. The frontend forwards that response to this endpoint.
This endpoint is a transparent gateway: it authenticates the caller, looks up the verification record by presentationExchangeId, then proxies the request body byte-for-byte to the underlying digital wallet deployment, where JWE decryption (when responseMode is dc_api.jwt), VP Token parsing per OID4VP 1.0 §8.1, DCQL structure validation, and persistence are performed. The wallet's response body and HTTP status are returned to the caller unchanged.
Use this endpoint only when the verification request was created with responseMode set to dc_api or dc_api.jwt. For direct_post and direct_post.jwt flows the wallet posts the response directly to the verifier's redirect_uri and this endpoint is not used.
Request
Path Parameters
Unique identifier of the verification exchange record. This is the presentationExchangeId property of the record, not its id property.
Header Parameters
Optional. Unique identifier of the sandbox organisation to use for this request. When you send this header, the service runs the operation in the context of the named sandbox organisation, that is, against the wallet of that sandbox organisation and not against the main wallet of the organisation. Leave the header out to use the main wallet.
The service reads this header only when you authenticate with a bearer access token. When you authenticate with an API key, the service takes the sandbox organisation from the API key and ignores this header. To run an API-key call in a sandbox organisation, bind the key to the sandbox organisation with PUT /v2/config/admin/apikey/{apiKeyId}/sandbox-org instead.
X-SubwalletId is the deprecated name of this header. The service continues to accept it, but X-SandboxOrgId wins if you send both headers.
The sandbox organisation must exist, must belong to your organisation and must be deployed. An unknown identifier, an identifier of a sandbox organisation that is not deployed, and an identifier that belongs to a different organisation all make the call fail with HTTP 400.
- application/json
Body
required
The body must hold response, vp_token, or both. The field names are case-sensitive and lowercase. The digital wallet ignores all other fields. Do not send the presentation submission: the wallet derives it from the DCQL query and from the structure of vp_token.
For responseMode = dc_api.jwt, the wallet searches for the JWE in response and in vp_token, and it also unwraps a JSON string that holds one of these keys. For responseMode = dc_api, the wallet reads vp_token first and falls back to response.
- response (string)
- vp_token (object)
For responseMode = dc_api.jwt: JWE compact serialization (five base64url segments separated by .) returned by the wallet. The downstream wallet decrypts it with the encryption key minted for this verification record and extracts vp_token from the decrypted payload.
For responseMode = dc_api (alternative form): a JSON-encoded string whose decoded form is {"vp_token": { ... }}.
vp_token objectrequired
Map of input descriptor / DCQL credential ID to the wallet's Verifiable Presentation(s). Encoding of each VP depends on credential format (dc+sd-jwt, mso_mdoc, jwt_vc_json).
May be supplied as a parsed JSON object or as a JSON-encoded string; the wallet parses string values automatically.
Map of input descriptor / DCQL credential ID to the wallet's Verifiable Presentation(s). Encoding of each VP depends on credential format (dc+sd-jwt, mso_mdoc, jwt_vc_json).
May be supplied as a parsed JSON object or as a JSON-encoded string; the wallet parses string values automatically.
Responses
- 200
- 400
- 401
- 404
- 500
- 502
The digital wallet processed the DC API response. The body is the answer of the wallet, forwarded byte-for-byte.
This body is not the verification history shape that the other verifier endpoints return. It is the raw verification record of the digital wallet. The token properties use snake_case (vp_token_request, vp_token_response, …) and organisationId is the identifier of the wallet deployment, not of the gateway organisation. To read the record in the usual shape, call GET /v3/config/digital-wallet/openid/sdjwt/verification/history/{presentationExchangeId} after this call.
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
Identifier of the verification record in the digital wallet. This value equals the presentationExchangeId of the gateway.
Identifier of the organisation in the digital wallet deployment.
Identifier of the presentation definition that this verification uses.
State value of the Authorization Request.
Full Authorization Request. This is a signed JWT, or a URI with the request parameters.
Authorization Request URI for a QR code or a deep link. Empty for DC API response modes.
Verifiable Presentation tokens that the wallet sent.
presentationSubmission objectnullable
Presentation Submission that the server derived from the DCQL query and the structure of the VP Token.
Presentation Submission that the server derived from the DCQL query and the structure of the VP Token.
Possible values: [request_sent, request_received, presentation_acked]
Lifecycle status of the verification exchange. The value is presentation_acked after a good DC API response.
Result of the verification of the Verifiable Presentation.
holder objectnullable
Metadata about the holder, for example the name from the client metadata.
Metadata about the holder, for example the name from the client metadata.
Decoded credentials that the holder presented.
Validation result for each credential in the presentation.
Identifier of the credential issuance exchange that this verification started.
transactionData objectnullable
Transaction data that the holder approved.
Transaction data that the holder approved.
Base64url encoding of the transaction data that the Authorization Request holds.
Cryptographic nonce of the Authorization Request.
Possible values: [vp_token, id_token, device_response]
OAuth 2.0 response type of the Authorization Request.
OpenID Connect ID Token from the holder.
idTokenDecoded objectnullable
Decoded payload of the ID Token of the holder.
Decoded payload of the ID Token of the holder.
Possible values: [redirect_uri, did, verifier_attestation, x509_san_dns, x509_hash]
Client ID scheme of the Authorization Request.
Possible values: [direct_post, direct_post.jwt, dc_api, dc_api.jwt, iar-post, iar-post.jwt]
Response mode of the Authorization Request. This endpoint accepts only dc_api and dc_api.jwt.
Verifier Attestation JWT that the server sent to the holder.
URI that the wallet opens after it posts the Authorization Response. Not used for DC API response modes.
Internal field of the digital wallet. Do not use it. The wallet deletes the one-shot response encryption key after it decrypts a dc_api.jwt response.
true when the wallet must encrypt the Authorization Response as a JWE.
Session identifier for the Interactive Authorisation Request flow. Empty for DC API flows.
Possible values: [draft_14, draft_18, draft_23, version_01, iso18013_7_annex_c]
OpenID4VP profile version that the presentation definition uses.
Files that the verification made, for example signed and unsigned PDF documents.
dcApiRequest objectnullable
Request object for the W3C Digital Credentials API, with one shape for Chrome and one for Safari.
Request object for the W3C Digital Credentials API, with one shape for Chrome and one for Safari.
Possible values: [openid4vp-v1-unsigned, openid4vp-v1-signed]
Exchange protocol identifier for the W3C Digital Credentials API.
true when the signed PDF holds a visible signature stamp.
Possible values: >= 4, <= 4
Page coordinates of the signature in the signed PDF, as [x1, y1, x2, y2] in points.
dataAgreement objectnullable
Data agreement that gives the terms for this verification exchange.
Data agreement that gives the terms for this verification exchange.
true when the exp claim of vp_token_request is in the past.
Unix timestamp in seconds when the wallet made this record.
Unix timestamp in seconds when the wallet last changed this record.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"organisationId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"presentationDefinitionId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"vp_token_request_state": "string",
"vp_token_request": "string",
"vp_token_qr_code": "string",
"vp_token_response": [
"string"
],
"presentationSubmission": {},
"status": "request_sent",
"verified": true,
"holder": {},
"presentation": [
{}
],
"presentationValidity": [
{}
],
"credentialExchangeId": "string",
"transactionData": {},
"transactionDataBase64": "string",
"nonce": "string",
"responseType": "vp_token",
"idToken": "string",
"idTokenDecoded": {},
"clientIdScheme": "redirect_uri",
"responseMode": "direct_post",
"verifierAttestation": "string",
"directPostRedirectUri": "string",
"encryptionPrivateKey": "string",
"requiresEncryption": true,
"iarAuthSession": "string",
"version": "draft_14",
"files": [
{}
],
"dcApiRequest": {},
"dcApiProtocol": "openid4vp-v1-unsigned",
"signatureStamp": true,
"signatureCoordinate": [
0
],
"dataAgreement": {},
"requestExpired": true,
"createdAt": 0,
"updatedAt": 0
}
The gateway could not resolve the organisation or the wallet deployment, or it could not read the body. The gateway also forwards a rejection of the digital wallet with this status: the response mode of the record is not a DC API mode, response and vp_token are both missing or unreadable, no encryption key belongs to the record, the JWE decryption failed, or the VP Token structure or validation failed.
Errors of the gateway use the errorCode and errorDescription shape. Errors that the gateway forwards from the digital wallet keep the body of the wallet, which uses a single detail string.
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
- MOD1
- Digital wallet error
Reason the digital wallet refused the DC API response.
{}
Unauthorized.
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
{
"errorCode": 400,
"errorDescription": "Bad input parameter"
}
No verification exchange record has the supplied presentationExchangeId.
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
{
"errorCode": 400,
"errorDescription": "Bad input parameter"
}
Internal server error (failed to create the upstream request, or to read the wallet response body).
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
{
"errorCode": 400,
"errorDescription": "Bad input parameter"
}
Failed to forward the DC API response to the digital wallet deployment.
Response Headers
- application/json
- Schema
- Example (from schema)
Schema
{
"errorCode": 400,
"errorDescription": "Bad input parameter"
}