Changelog
All notable changes to the iDen2 APIs are documented here.
The format follows Keep a Changelog, and the APIs adhere to Semantic Versioning. Entries are grouped per release under Breaking Changes, New Features, Bug Fixes, and Deprecations.
[Unreleased]
Breaking Changes
- Credential Factory behaviour changed on 2026-10-20 (now live); the docs are updated to match:
- Wallet Offer Response: the wallet can respond while the offer is
pendingor after the credential isclaimed.acceptedsetsstatusaccepted(an offer accepted before issuance staysacceptedand gains the issuance record);rejectedsetsstatusrejectedwithfailureReasonwallet_rejected(previouslyrevoked). Repeating the same answer returns200; a different answer after the offer was settled returns409. - Revoke Credential:
actionsuspendreturns501— credentials are registered on a revocation status list only.409now means the credential is already revoked. - Get Offer Status:
credentialIdis the credential's registry ID (urn:uuid:form), the same value ascredentialStatus.credentialIdand the ID Revoke Credential takes.failureReasonis also set onrejectedandexpiredoffers. - Create Credential Offer: a negative
offerTtlSecondsreturns400, andcredentialDatamust be a non-empty object. - An offer that expires unclaimed has its registry entry revoked.
- An offer can be
acceptedbefore its credential is issued, so treat it as successful only onceclaimedAt/credentialIdare present; the polling guidance is updated. - After a revoke, a revocation webhook (
"event": "revocation") is sent. It carriescredentialId, notexternalIdorofferId, and isn't counted incallbackAttempts/callbackDeliveryStatus. An expired offer now also hasfailedAt.
- Wallet Offer Response: the wallet can respond while the offer is
Documentation
- Using externalId for Correlation: Credential Factory's
issuance_completedwebhook carries yourexternalIdvalue asuserId;issuance_failed,wallet_acceptedandwallet_rejectedcarryexternalId;revocationcarries neither (match oncredentialId). - Updated the docs site to the new iDen2 brand: new logo (with a dark-mode variant), favicon and link-preview (social card) image, and the purple palette with purple-800 as the primary colour.
- Renamed the services in the docs: IaaS (Issuer as a Service) is now Credential Factory, and VaaS (Verification as a Service) is now Verification Gateway. Only the names changed — hostnames, API paths and request/response shapes are the same. The API intro pages moved to /docs/api-reference/iaas/credential-factory-api and /docs/api-reference/vaas/verification-gateway-api; the old addresses redirect.
- Enabled Dart syntax highlighting for Wallet SDK code snippets.
- Added the Wallet SDK developer guide (early access) covering the embeddable Flutter wallet SDK: Overview, Getting Started, Configuration, Authentication, Credential Storage, Credential Issuance, Credential Presentation, Deep Links, Prompts, Trust Network, Error Handling, and a full API Reference. Updated the Mobile Wallet & Wallet API guide to link the SDK docs (previously "coming soon").
- Added Network Credential Registry, Trust Network API, and Mobile Wallet & Wallet API guides.
- Added Credential Registry concept and Credential Registry Architecture pages, and wove the Trust Network and Credential Registry checks into the issuance and verification flow diagrams.
- Aligned Credential Factory examples with shipped credential configuration IDs (
VerifiedPerson_vc+sd-jwt). - Documented Verification Gateway JAR flow:
GET /openid4vc/request/{sessionId}andGET /.well-known/jwks.json. - Switched all server-to-server authentication documentation to OAuth 2.0
client_credentialsBearer tokens; removed HTTP Basic Authentication, which is not available to external integrators. - Corrected the credential revocation request body to
{ "action": "revoke", "reason": "..." }(wasreasonCode). - Clarified that
vc+sd-jwtcredentials are selectively disclosable by default;selectiveDisclosureis opt-in to restrict. - Clarified
callbackDeliveryStatusvsfailureReasonfor webhook delivery failures. - Added Credential Factory offer statuses:
accepted,rejected,suspended. - Added Verification Gateway
failureReason:audience_mismatch; removed incorrectcallback_exhaustedfrom verification failure enum.
Bug Fixes (spec corrections)
- OpenAPI:
failureReasonenum now matches go-monorepo implementation. - OpenAPI: added
callbackDeliveryStatusfield on verification sessions. - Credential Factory: documented the current offer paths
POST /api/v1/iaas/credential-offersandGET /api/v1/iaas/credential-offers/{offerId}, and updated every guide to use them. The old/api/v1/issuer/offerspaths still work but are marked deprecated. - Credential Factory: Wallet Offer Response now documents the required
tokenquery parameter. POST to thewalletResponseUrlreturned at offer creation, unchanged; a call without the token returns404. - Credential Factory: Revoke Credential now matches the API: required
action, optionalreason,credentialIdinurn:uuid:form,204 No Contenton success, and400/401/403/404/409/500/503errors. - Credential Factory:
authenticationMethodis optional on offer creation (defaults toPRE_AUTHORIZED). Documented theaudiencefield (an array with one Network Member URN — the guide example was a plain string), theexternalId255-character limit,selectiveDisclosure.fieldslimits, TTL defaulting and capping, and that unknown request fields are rejected. - Credential Factory: added
walletResponseUrlandcredentialIdto the created offer, andcredentialId,credentialStatus,respondedAt,acceptedAt,rejectedAt,revokedAt,failedAt,failureReason,failureDescription,updatedAt,callbackAttemptsandcallbackDeliveryStatusto offer status. - Credential Factory: Get Offer Status returns
200withstatusexpiredfor an expired offer, not410, and documents403(missing scope). Create Credential Offer documents501(unsupported credential format). Added the ProblemobjectPathfield. - Credential Factory: corrected the offer state descriptions —
acceptedmeans the holder accepted the credential (not "claim in progress"), andrevokedresults from your own revoke call or from a failed offer; the polling guide now stops when the credential is issued or the offer ends, so anacceptedoffer is no longer treated as expired.
[1.0.0] — 2026-06-12
Initial public release of the iDen2 API services.
Breaking Changes
- None — initial release.
New Features
- Credential Factory (then IaaS — Issuer as a Service) (
iaas.stg.iden2.app, APIv1)POST /api/v1/issuer/offers— create OID4VCI credential offers with pre-authorized code flow, SD-JWT selective disclosure configuration,externalIdcorrelation, and configurable TTL. ReturnsofferUrland a pre-renderedqrCodeDataUrl.GET /api/v1/issuer/offers/{offerId}— poll offer status (pending/claimed/expired/revoked), includingholderBindingandclaimedAton claim.POST /api/v1/issuer/credentials/{credentialId}/revoke— revoke an issued credential (configuration-dependent).- Wallet API:
POST /api/v1/wallet/offers/{offerId}/response— holder wallet acceptance/rejection signal.
- Verification Gateway (then VaaS — Verification as a Service) (
vaas.stg.iden2.app, APIv1)POST /api/v1/verifier/sessions— create OpenID4VP verification sessions. ReturnsauthorizationUrl(with trust networkclient_metadata) and a pre-renderedqrCodeDataUrl.GET /api/v1/verifier/sessions/{sessionId}— poll session status and results, including extractedcredentialData, detailedverificationResultchecks, lifecycle timestamps,callbackDeliveryStatus, andfailureReasondiagnostics.- Wallet API:
GET /openid4vc/pd/{state}(legacy presentation definition),GET /openid4vc/request/{sessionId}(JAR Request Object),POST /openid4vc/verify/{state}(VP token submission),GET /.well-known/jwks.json(JAR signature verification).
- RFC 9457 Problem Details error model across all endpoints, including
subproblemsfor compound validation errors. - Webhook callbacks on session completion (account-configured), with
callbackDeliveredAt/callbackAttempts/callbackDeliveryStatusdelivery telemetry.
Bug Fixes
- None — initial release.
Deprecations
- None.