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.
Pick your path
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 anopenid-credential-offer://link or QR codeGrants:
urn:ietf:params:oauth:grant-type:pre-authorized_code(with or without a transaction code) andauthorization_codeFormats:
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.
Path 2: VC-API — deep link or Interaction URL
LearnCard is a VC-API wallet. Two ways to point it at your exchange:
2a. Deep link (simplest)
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:
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 returnsjwt_vc_json,ldp_vc, or SD-JWT VC presentations.VC-API — publish an Interaction URL (
?iuv=1) whose exchange replies with aQueryByExamplerequest. 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.
Universal Inbox claim links work in any wallet
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
Scan your QR code with the phone camera, or tap the link on the phone.
LearnCard opens and shows your issuer name and the credential. Tap Accept.
Open the credential in the wallet. It should show your name, image, and description, and be marked verified.
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
The fields that make a credential yours — achievement types, images, and display hints so it looks right in the wallet.
Connect a User's LearnCard to Your Platform — ongoing, automatic issuance instead of one-off claims.
Network API and Wallet SDK — if you're building a wallet or verifier.
Questions: open an issue or email sdk@learningeconomy.io.
Last updated
Was this helpful?