The Digital Credentials API gives a website a standard, browser-mediated way to request a verifiable credential from a user’s wallet instead of collecting a scan of an ID card or relying on a fragile custom flow. For product teams, the opportunity is not “put a driver’s licence on the web”: it is to design for the smallest proof needed, preserve user choice, and keep verification on the server. The API is still evolving, but the architecture decisions should start now.
Table of contents
- What is the Digital Credentials API?
- Why does this matter beyond passkeys?
- How does a credential request work?
- What should a production architecture look like?
- Which privacy and security rules are non-negotiable?
- How can a team prepare without overbuilding?
- FAQ
What is the Digital Credentials API?
The Digital Credentials API is a proposed web-platform interface for asking a user to present a digital credential through a browser-controlled picker. The credential might prove age eligibility, professional membership, an educational qualification, or another claim issued by an authority. Crucially, the website asks for a presentation, while the wallet and browser remain in charge of the user interaction.
This is a different model from uploading an image of a document. A document upload creates a copy that a business must secure, retain, and manually or automatically inspect. A verifiable credential flow can return a cryptographically protected presentation designed for a specific relying party and session. The server verifies the issuer, proof, audience, expiry, and requested claims before making a decision.
The standards landscape has several moving parts:
- The WICG Digital Credentials specification describes the browser-facing credential request model.
- The W3C’s Verifiable Credentials Data Model 2.0 defines a common model for expressing credentials and presentations.
- OpenID for Verifiable Presentations defines an interoperable protocol family used by wallets and verifiers.
Those components matter because an API alone does not create interoperability. A real deployment needs agreement on a credential format, a presentation protocol, trusted issuers, and what the verifier actually needs to know.
Why does this matter beyond passkeys?
The Digital Credentials API addresses an attribute problem, not an authentication problem. Passkeys prove that a user can authenticate to an account with a phishing-resistant credential. A digital credential can prove a constrained fact about that user or organisation. The two fit together well: use a passkey for account sign-in, then ask for a high-assurance claim only when a regulated or high-risk action requires it.
That distinction prevents a common design mistake: treating identity verification as a permanent, broad data collection exercise. A ticketing service may need to know that a customer is over a threshold age. It usually does not need their document number, residential address, or a stored image of their identity document.
This is also where the API complements the identity changes already reaching the platform. Passkeys improve account authentication, while FedCM gives federated sign-in a browser-mediated direction. Digital credentials add a third capability: a user-presented, verifiable claim with explicit consent.
For web teams, the value is practical:
- Less sensitive data at rest. A yes/no age result is easier to protect than a document image.
- Clearer consent. The browser and wallet can make the requested claim visible before it is released.
- Better UX than bespoke deep links. A platform-level chooser can reduce confusing wallet hand-offs.
- Reusable verification infrastructure. The same policy engine can support several credential types as requirements change.
None of that removes compliance obligations. It does give teams a better primitive for meeting them with data minimisation rather than data hoarding.
How does a credential request work?
A well-designed request begins on the server. The server creates a short-lived challenge and a policy describing the exact credential or claims it will accept. The web app then passes a protocol-specific request to navigator.credentials.get(). The browser invokes an eligible wallet or credential provider, the user approves or declines, and the site sends the returned presentation to its server for verification.
At a high level, the browser call resembles this:
async function requestAgeProof(requestData) {
if (!window.PublicKeyCredential || !navigator.credentials) {
throw new Error("This browser does not support a credential-mediated flow");
}
const presentation = await navigator.credentials.get({
mediation: "required",
digital: {
requests: [{
protocol: "openid4vp",
data: requestData
}]
}
});
return fetch("/api/eligibility/verify", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ presentation })
});
}The exact request shape and browser support are still developing, so do not copy an example into production without checking the current specification and the wallet protocol documentation. The architectural boundary is the durable part: the browser handles consent, the client transports an opaque response, and the server makes the trust decision.
On the server, verification is more than checking a signature. A verifier should validate at least:
- The credential or presentation is structurally valid for the negotiated protocol.
- The issuer is on a trusted allow-list or trust registry for the use case.
- The proof chain and status information are valid.
- The response is bound to the request’s nonce, audience, and expiry.
- The disclosed claims satisfy the business policy, and no more data is persisted than necessary.
A passing cryptographic check does not automatically make a claim acceptable. “Signed by someone” is not the same as “issued by an authority this service trusts for this decision.”
What should a production architecture look like?
The cleanest implementation separates the user-facing request from credential policy and verification. Treat wallet messages as hostile input until they have passed a dedicated verifier.
Browser UI
└─ asks server for a short-lived verification request
└─ Credential policy service selects protocol, issuer rules and claims
Browser wallet picker
└─ returns a presentation to the browser
└─ browser sends it to the verification endpoint
Verification service
├─ validates proof, nonce, audience, status and issuer trust
├─ evaluates the minimum-claim policy
└─ returns an application-level result, e.g. { eligible: true }
Application
└─ records the decision and an auditable, minimal eventThis shape makes future protocol changes manageable. Keep OpenID4VP, VC format parsing, trust-list integration, and revocation/status handling behind a verification adapter. Your application should consume a stable decision such as ageOver18: true, not parse a wallet response in a checkout controller.
It also makes observability safer. Record request IDs, policy versions, issuer identifiers, timestamps, and verification outcomes. Avoid logging raw presentations or claims by default. The OpenTelemetry approach to AI agent systems has the same useful lesson: trace decisions and boundaries, but deliberately control sensitive payloads.
For an API-driven product, issue a one-time server-generated request ID and bind it to the authenticated session, intended action, redirect origin, and expiry. Reject a response that is replayed, late, for a different audience, or associated with another session.
Which privacy and security rules are non-negotiable?
Ask for the smallest claim that solves the problem. If eligibility is all that matters, request an age-over result, not full date of birth. This is both a privacy principle and an engineering advantage.
Make credential presentation step-up verification. Do not use it as an excuse to rebuild account authentication. The normal account session should be established by a suitable sign-in method, increasingly a passkey. Request a credential only at the point where its claim is needed.
Verify server-side and bind every request. The browser is not the trust anchor for a business rule. A verifier must check challenge binding, audience, expiry, issuer trust, and credential status on the server.
Design a graceful fallback. Support will vary by browser, operating system, wallet, jurisdiction, and credential type. Offer an accessible alternative, explain why it is needed, and ensure the alternative has equivalent security review. Never silently downgrade a high-assurance requirement to a checkbox.
Do not turn verification into tracking. A credential flow can create a powerful correlation surface if identifiers are reused across sites. Prefer protocols and credential designs that minimise linkability, store only the resulting decision where possible, and define retention periods before launch.
The last point is particularly important for teams building AI-assisted workflows. A model does not need raw identity material to decide whether a user cleared a gate. Pass a narrow, verified fact downstream. This follows the same least-privilege mindset used in prompt injection defenses: do not give a component more authority or information than its task requires.
How can a team prepare without overbuilding?
Start with one narrowly scoped use case, such as age-gating a regulated action or verifying a professional credential during onboarding. Avoid a generic “identity platform” project until there is a real policy requirement and a credible issuer ecosystem for it.
Use this preparation checklist:
- Write the decision in plain language. For example: “Allow this action only if the user proves they are over 18 in this session.”
- Define the minimum claims. Identify what can be accepted as a boolean or category instead of a full identity record.
- Choose trusted issuers deliberately. Document who can issue an acceptable credential, for which geography, and how status is checked.
- Build the verification boundary. Keep protocol parsing and trust evaluation outside product controllers.
- Test failure paths. Include no wallet, a declined request, an expired credential, an untrusted issuer, a replayed response, and a status-service outage.
- Measure conversion without capturing extra identity data. Track anonymised funnel events and reason codes, not raw credential content.
There is no need to bet a product roadmap on universal availability today. The useful move is to make your identity and policy layers capable of expressing a future credential check. That is much cheaper than unpicking a document-upload system full of stored personal data later.
FAQ
Is the Digital Credentials API ready for every production website?
No. Browser and wallet availability, credential formats, and jurisdictional ecosystems are still uneven. Treat it as a progressive capability and use a reviewed fallback for users who cannot complete the flow.
Does a digital credential replace passkeys?
No. Passkeys authenticate an account. Digital credentials present a verifiable claim. Many products will use a passkey for sign-in and a digital credential only for a specific high-assurance decision.
Should my frontend validate the credential?
No. The frontend may initiate the browser-mediated request, but the server must verify the presentation, request binding, issuer trust, status, and claims before granting access.
Can this eliminate KYC or age-verification obligations?
Not by itself. It can improve how a service fulfils a requirement, but legal duties, accepted issuer rules, and retention obligations depend on the jurisdiction and use case.
The practical takeaway
The Digital Credentials API is worth watching because it moves verifiable claims toward a web-native consent model. Teams should not rush to collect more identity data or hard-code one wallet protocol. Instead, define the exact decision you need, request the minimum proof, verify it on the server, and keep the credential plumbing behind a policy boundary. That gives a product a credible path to adopt the ecosystem as support matures, without turning sensitive identity data into its next long-term liability.