Mobile Wallet & Wallet API
Customer backends integrate with Credential Factory and Verification Gateway using authenticated REST APIs (OAuth 2.0 Bearer tokens). Holder wallets — including the iden2 mobile app — call separate Wallet API endpoints that use a different access model: OpenID4VP wallet endpoints use JAR (signed Request Objects verified via JWKS) and OID4VCI wallet endpoints use capability-based access scoped to the offer UUID. Neither requires your OAuth client_secret.
If you are building a custom wallet or debugging holder-side behaviour, this page documents those endpoints. If you only integrate as an issuer or verifier, you can skip this — your QR code drives the wallet flow automatically.
Two surfaces per service
| Service | Your backend (auth required) | Wallet (public) |
|---|---|---|
| Verification Gateway | POST/GET /api/v1/verifier/sessions/* | /openid4vc/*, /.well-known/jwks.json |
| Credential Factory | POST/GET /api/v1/iaas/credential-offers/*, POST /api/v1/issuer/credentials/{credentialId}/revoke | POST /api/v1/wallet/offers/{offerId}/response |
See Authentication for the distinction between the OAuth Bearer model used by backend APIs and the JAR / capability-based model used by Wallet API endpoints.
Verification flow (OpenID4VP)
After the holder scans your Verification Gateway QR code:
Your backend learns the outcome by polling GET /api/v1/verifier/sessions/{sessionId} — see Verification Integration Guide.
Verification Gateway Wallet API endpoints
| Method | Path | Purpose |
|---|---|---|
GET | /openid4vc/request/{sessionId} | Request Object JWT (RFC 9101 JAR) — signed by Verification Gateway |
POST | /openid4vc/verify/{sessionId} | Submit VP token |
GET | /.well-known/jwks.json | Ed25519 public key for Request Object signature verification |
Path parameter: {sessionId} is the UUID returned by POST /api/v1/verifier/sessions — the OpenID4VP state value after URL rewriting.
VP submission accepts application/x-www-form-urlencoded (OpenID4VP standard) or application/json:
{
"vp_token": "<SD-JWT VP>",
"presentation_submission": "<optional JSON string>"
}
Wallet endpoints are reached via openid4vp:// deep links, not browser XHR.
iden2 wallet behaviour
- Scan QR or open deep link with
authorizationUrl - Fetch the JAR Request Object from
GET /openid4vc/request/{sessionId}; verify its signature via JWKS - Optionally check verifier trust via Trust Network API using
verifier_member_idfromclient_metadata - Match stored SD-JWT credentials against presentation requirements
- Show selective disclosure preview — holder picks fields to reveal
- Build VP with KB-JWT holder binding; POST to Verification Gateway
- Display success/failure to holder
Trust verification can be disabled in wallet settings (user override).
Issuance flow (OID4VCI)
After the holder scans your Credential Factory offer QR:
| Method | Path | Body |
|---|---|---|
POST | /api/v1/wallet/offers/{offerId}/response?token=… | {"action":"accepted"} or {"action":"rejected"} |
Don't build this URL yourself: use the walletResponseUrl returned by Create Credential Offer, unchanged, and get it to the holder's wallet along with the offer. Its token query parameter is the capability — the offer ID alone returns 404. Treat the URL as a secret. The wallet can respond while the offer is pending or after the credential is claimed. Accepting sets status accepted; if the credential hasn't been issued yet, the issuance is recorded on the accepted offer when it happens. Rejecting sets status rejected with failureReason wallet_rejected. Repeating the same answer returns 200 again; a different answer after the offer was settled (for example rejecting after accepting) returns 409.
OID4VCI cryptographic issuance runs through the platform issuer backend. Your issuer integration only creates offers and polls status.
Mobile Wallet SDK (partners)
An embeddable Mobile Wallet SDK (Flutter) is available to partners in early access. It provides credential storage, passkey authentication, OID4VCI issuance, OpenID4VP presentation, deep-link dispatch, and trust-network integration for apps that embed iden2 wallet capabilities without shipping the full consumer app. See the Wallet SDK documentation.
If you are not using the SDK:
- Use the iden2 wallet app for end-to-end testing against staging
- Build against the Wallet API endpoints above for custom wallet implementations
- Contact support for SDK access
Building a custom wallet checklist
- Handle
openid-credential-offer://andopenid4vp://deep links - Support SD-JWT credentials and selective disclosure
- Implement KB-JWT holder binding on presentation
- For JAR sessions: fetch Request Object, verify signature via JWKS
- Call Credential Factory wallet response after successful OID4VCI claim
- Do not embed issuer/verifier OAuth client credentials (
client_id/client_secret) in the app