For the complete documentation index, see llms.txt. This page is also available as Markdown.

Bring Your Credentials into LearnCard

Already issue credentials? Make LearnCard a place your users can claim them — with the protocol you use today, no new APIs required.

If you already issue credentials, you don't need to change how. LearnCard accepts credentials over OID4VCI and VC-API, imports credential files, and answers verifiers over OID4VP and VC-API. Find how you issue today and follow that path.

~15 min · You already issue credentials somewhere else.

Pick your path

How you issue today
What to do
Effort

OID4VCI

Show your credential offer as a QR code or link. Path 1

None

VC-API exchanges

Link to learncard.app/request?vc_request_url=…, or publish an Interaction URL. Path 2

Minutes

Signed VC / Open Badge JSON, no protocol yet

One POST /api/send with the signed credential — LearnCard emails a claim link. Or let users import the file. Path 3

15 minutes

A wallet selector / "Add to wallet" page

Add a LearnCard option that opens your OID4VCI offer or the VC-API deep link. Path 4

Minutes

CHAPI

Not supported in the LearnCard app. Use Path 1 or 2.

An hour

Not on an open standard yet

Start with Path 3. You can adopt OID4VCI or VC-API later.

15 minutes

Need to verify a credential a LearnCard user holds? See Requesting credentials from a LearnCard user.


Path 1: OID4VCI — you already have a credential offer

LearnCard is an OpenID for Verifiable Credential Issuance wallet. If your issuer produces a credential offer, LearnCard can claim it.

What LearnCard accepts

  • Offers by value (credential_offer=) or by reference (credential_offer_uri=), as an openid-credential-offer:// link or QR code

  • Grants: urn:ietf:params:oauth:grant-type:pre-authorized_code (with or without a transaction code) and authorization_code

  • Formats: jwt_vc_json, ldp_vc, and SD-JWT VC — with Ed25519Signature2020, DataIntegrityProof (EdDSA), and SD-JWT proofs

What your user sees: they scan or tap the offer, LearnCard opens and shows the issuer and credential, they tap Accept. With authorization_code, LearnCard sends them to your authorization page and back first.

There is nothing to register with LearnCard. Add a LearnCard logo next to your QR code and you're done.


LearnCard is a VC-API wallet. Two ways to point it at your exchange:

Link to LearnCard with your exchange URL. LearnCard opens, POSTs to it, and runs the exchange:

2b. Interaction URL (works with any wallet)

Publish a URL ending in ?iuv=1 as a link or QR code. Wallets GET it with Accept: application/json to learn which protocols you offer. LearnCard reads the vcapi, openid4vci, and openid4vp keys.

What the exchange looks like

The wallet POSTs {} to your exchange URL. You reply with one of:

  • The credential, if you don't need to know who is claiming: { "verifiablePresentation": { …, "verifiableCredential": [ yourSignedCredential ] } }

  • A request for identity, to bind the credential to the holder's DID: { "verifiablePresentationRequest": { "query": [{ "type": "DIDAuthentication" }], "challenge": "…", "domain": "…" } }. LearnCard answers with a signed DID-auth presentation; you reply with the credential.

  • A redirect: { "redirectUrl": "https://my-app.com/done" }

What your user sees: LearnCard opens, shows the issuer and credential, they tap Accept.


Path 3: You have signed credential JSON

You have signed W3C Verifiable Credentials or Open Badges 3.0 files but no wallet protocol. Two options. In both, you remain the issuer; LearnCard only delivers.

3a. Send it — one API call

POST /api/send with your signed credential and the recipient's email or phone. LearnCard emails a claim link, or delivers directly if they already use LearnCard. You need an API token with scope boosts:write (setup).

The response is PENDING (claim link emailed) or ISSUED (delivered). The claim link is an Interaction URL, so it also works in other wallets. Full details: Send & Issue Credentials.

3b. Let users import the file

In the LearnCard app, users can paste credential JSON or upload a .json file from the claim screen. LearnCard verifies the signature and shows the credential before saving it. If you already offer a "Download credential" button, this works with no changes.


Path 4: Add LearnCard to your wallet selector

If you show users a list of wallets, add LearnCard with whichever link you have:

You have…
LearnCard entry opens…

An OID4VCI offer

openid-credential-offer://?credential_offer_uri=<encoded URL>

A VC-API exchange URL

https://learncard.app/request?vc_request_url=<encoded URL>

An Interaction URL

The URL itself (ending ?iuv=1)

Logo and brand assets: learncard.com. Users without the app are prompted to install it, then continue.


Requesting credentials from a LearnCard user

To verify a credential a user holds, request it over either standard:

  • OID4VP — send an authorization request as an openid4vp:// link or QR code. LearnCard supports DCQL and DIF Presentation Exchange queries and returns jwt_vc_json, ldp_vc, or SD-JWT VC presentations.

  • VC-API — publish an Interaction URL (?iuv=1) whose exchange replies with a QueryByExample request. The user picks a matching credential and LearnCard returns a signed presentation.

Verify what comes back with your own verifier, or with LearnCard's — see Verify Credentials.


Every claim link LearnCard emails is an Interaction URL, so other wallets can claim it too:

When responding to a LearnCard claim-link or inbox-claim exchange, sign the DID-auth presentation with proofPurpose: 'authentication' and the exact challenge and domain from its request. The holder's DID document must authorize the signing verification method for authentication.

Compatibility change: presentations signed with assertionMethod are rejected. If your wallet uses issuePresentation, set proofPurpose: 'authentication' explicitly rather than relying on its default. LearnCard and ScoutPass already do this.

Inbox claims also require a supported X25519 keyAgreement method so LearnCard can retain a recovery copy encrypted only for the holder. A did:web document can authorize P-256 for authentication and a separate X25519 key for delivery. Signing-only P-256 did:key holders work with generic claim links, but not inbox claims. If delivery encryption fails, the pending credential and exchange challenge remain available for retry with a compatible holder.


Test it in five minutes

  1. Install LearnCard on a phone (iOS · Android) and sign in.

  2. Scan your QR code with the phone camera, or tap the link on the phone.

  3. LearnCard opens and shows your issuer name and the credential. Tap Accept.

  4. Open the credential in the wallet. It should show your name, image, and description, and be marked verified.

If…
Then

The camera opens a web page instead of LearnCard

Only https://learncard.app/… links open the app. Use openid-credential-offer://, learncard.app/request?vc_request_url=, or a ?iuv=1 URL

"Couldn't reach the issuer"

Your ?iuv=1 endpoint must return JSON when Accept: application/json is sent, and your exchange URL must accept a POST with {}

Credential shows as unverified

Check that the issuer DID resolves publicly and every @context URL is reachable

OID4VCI offer opens but fails after Accept

Check that your token endpoint accepts the grant in the offer and your credential endpoint returns jwt_vc_json, ldp_vc, or SD-JWT VC


Next steps

Last updated

Was this helpful?