All notable changes to the DeepCredentials B2B API.
- Credential Invitations API — Service users can create, list, get, rotate, and revoke invitations under
/b2b/v1/credential-invitations. Create and rotate return the one-time plaintext code; list, get, and revoke expose code-free metadata. credential_invitation.status_changedwebhook — An opt-in terminal event for invitationredeemed,expired, andrevokedtransitions. The slim payload containsinvitation_id,status, andoffer_idonly after redemption. Existing webhook configurations must enable the event in the portal.
- Partner-owned invitation delivery — DeepCredentials does not email codes created or rotated through the B2B invitation API. The partner owns how it delivers the code and presents the redemption experience; its backend can exchange the recipient's email and code through the public redemption endpoint.
- Progress callbacks clarified — Verification, invitation, and issuance webhooks are slim hints followed by authenticated B2B GET reconciliation. Webhook delivery currently makes one synchronous attempt and can be missed.
reference_idclarified — The field is optional correlation metadata only; it does not provide idempotency, uniqueness, or response caching.
template_id→credential_definition_id— B2B request bodies and query parameters that previously acceptedtemplate_idnow requirecredential_definition_id. Applies toPOST /b2b/v1/verification-sessions,POST /b2b/v1/credential-offers, and the list query filters on those resources.template→credential_definitionin responses — The top-level response object previously namedtemplateis now namedcredential_definition. Inner fields (id,vct,name,has_logo) are unchanged. Terminology throughout the API is now "Credential Definition" rather than "Template".
GET /b2b/v1/credential-definitions— Returns the credential definitions available to your organization. Any authenticated service user can call this endpoint (no additional scope required beyond a valid token withX-Org-IdandX-Environment).
- "Open in API reference" deep-links — Every code sample in the guides now has an immediate deep-link to the matching operation in the rendered API reference.
- Broadened intro — The home page and Quickstart now cover all three API pillars: verification, issuance, and self-service.
- Portal-issued credentials retired. API keys and OAuth clients minted in the DeepCredentials portal no longer work. Authentication now uses DeepAdmin service users authenticated against the DeepCloud SSO realm with the OAuth 2.0 Resource Owner Password Credentials grant. See the new Service Users guide.
POST /b2b/v1/oauth/tokenremoved. Exchange credentials directly withPOST <keycloak-realm>/protocol/openid-connect/tokenagainstdeepcloud.swiss(prod) orint.deepcloud.swiss(test).X-Org-IdandX-Environmentheaders are now required on every/b2b/v1/*request.X-Org-Idis the UUID of the organization the service user is a member of;X-Environmentisbetaorproduction.X-Api-Keyheader is no longer accepted. Authenticate exclusively withAuthorization: Bearer <access_token>from the DeepCloud SSO token endpoint.
- API Keys and OAuth Clients management surfaces in the DeepCredentials portal.
Authentication APIOpenAPI spec (the/b2b/v1/oauth/tokenoperation is gone).
Scope strings renamed — B2B scopes are now namespaced under
deepcredentials.*:issuance→deepcredentials.issueverification→deepcredentials.verifyself_service→deepcredentials.self-service
Provision new credentials with the namespaced names. Enforcement will roll out together with the matching DeepAdmin update; until then, in-flight tokens carrying the legacy names continue to work.
identification_filledclaim source — Self-service configs can now mark a template claim as automatically pre-filled from the identification provider's verified attributes. Tenants configure the per-claim mapping in the portal (no B2B API surface). The webhook decision flow benefits passively: by the timeself_service.request.submittedfires, the snapshot'sclaimsfield already reflects the merged result (user → identification → admin), so an emptyadmin_claimsapprove issues a credential carrying the identification-derived values.editable_field_sourcesenum extended —GET /b2b/v1/self-service/requests/{id}may now return"identification_filled"alongside"user_filled"and"admin_filled". See the Self-Service Flow guide.
- Credential validity — Credentials are now issued with a tenant-controlled
expclaim. Set a default on the credential template (portal → Templates) and override per-issuance via the new optionalvalidity_secondsfield onPOST /b2b/v1/credential-offers. Send no value to inherit the template default; the credential is issued without anexpclaim (never expires) only when both the template default and request override are absent. Self-service configs always carry their own explicit validity (or explicit "never expires") chosen at config creation. Allowed range: 60 seconds to 10 years. Issued-credential responses (GET /b2b/v1/issued-credentials/{id}, list, and webhook payload-fetch) now includevalid_fromandvalid_untilso you can show expiry in your UI and react before a credential lapses. - Self-service request snapshot — full claim schema —
GET /b2b/v1/self-service/requests/{requestId}now returnseditable_fields/editable_field_types/editable_field_sourcesdescribing every claim on the template (not just admin-filled ones). Enables rendering a "review & override" form without a second template fetch. See the Self-Service Flow guide.
- Issued credential status semantics — The
statusfield (active/suspended/revoked) is the revocation lifecycle (driven by the status list). Expiration is now expressed separately viavalid_until. A credential can beactiveand past itsvalid_untilsimultaneously — wallets and verifiers reject it on theexpclaim; we don't automatically flip itsstatus. admin_claimsmay override user-supplied claims —POST /b2b/v1/self-service/requests/{requestId}/decisionalready accepted any template claim key in theadmin_claimspayload; the contract is now explicit: when a key appears in both the user submission and youradmin_claims, your value wins and is the one stamped on the credential.admin_filled_*continues to describe the required contract only.
- Self-Service API —
GET /b2b/v1/self-service/requests/{requestId}returns the full request snapshot (status, captured claims, identification result, offer id, timestamps, plus the admin-claims schema —admin_filled_fields/admin_filled_types/admin_filled_required, mirroring how verification shipsrequested_fields+credential_subject_typesso the tenant can dynamically render or validateadmin_claimswithout hard-coded template knowledge).POST /b2b/v1/self-service/requests/{requestId}/decisionapproves or rejects an end-user-initiated request — required for tenants whose configs run inwebhookverification mode. - Self-service webhook events — Six events covering the full lifecycle:
self_service.request.submitted— fires forwebhook-mode configs when a request is ready for a decision.self_service.request.approved/self_service.request.rejected— fire for all verification modes so you have an audit trail of every decision.self_service.request.credential_issued— terminal success; the wallet accepted the credential.self_service.request.offer_expired/self_service.request.failed— terminal post-approval failure paths (offer TTL exceeded, wallet rejected).
self_servicescope — Required for the Self-Service API and selectable on API keys / OAuth clients in the portal.- Self-Service Flow guide — End-to-end walkthrough of the three verification modes (manual, webhook, automatic), lifecycle diagram, full user ↔ Portal ↔ tenant-backend sequence, and webhook payload contract.
- Webhook subscription management — The portal webhook page now has a per-event checkbox grid grouped by family (Verification / Credential Issuance / Self-Service). Unchecked events are silently dropped at our edge — no delivery, no retry. New webhook configs default to all events on; existing configs keep their current set and have to explicitly opt in to events added in future releases.
- Scopes documentation — The scopes table previously listed
credentials.read/credentials.write, which never existed. Replaced with the actual scopes:verification,issuance,self_service.
- Verification API — Create and poll OID4VP verification sessions (
POSTandGET /b2b/v1/verification-sessions). - Authentication API — OAuth 2.0 Client Credentials token exchange (
POST /b2b/v1/oauth/token). - Health API — Credential validation and connectivity check (
GET /b2b/v1/health). - Webhook Events API — OpenAPI 3.1 webhook spec for
verification.completedwith full event schema and signature headers. - Webhooks guide — Setup, HMAC-SHA256 signature verification, and secret rotation.
- Authentication methods — API keys and OAuth 2.0.