Open Badges 3.0
Reference
Open Badges 3.0
Every Nyvarra certificate is also an Open Badges 3.0 credential, following the W3C Verifiable Credentials 2.0 data model. Holders can carry it into wallets and learning records, and anyone can check it without Nyvarra's own tools.
This page says exactly what is implemented. Anything not listed isn't claimed.
Profile
Identifiers
@contextrequired, in orderhttps://www.w3.org/ns/credentials/v2, thenhttps://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json.typestring[]VerifiableCredentialandOpenBadgeCredential, with anAchievementSubjectholding oneAchievement.credentialSchemaobject[]https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_achievementcredential_schema.jsonissuer.iddid:webdid:web:nyvarra.app:issuers:{slug}, resolvable athttps://nyvarra.app/issuers/{slug}/did.json. It lists the issuer's public keys only; withdrawn keys are removed fromassertionMethod.
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
],
"id": "NV-7KQ2M9XHCP4WRTZB-1187",
"type": ["VerifiableCredential", "OpenBadgeCredential"],
"issuer": {
"id": "did:web:nyvarra.app:issuers:example-medical-college",
"type": ["Profile"],
"name": "Example Medical College"
},
"validFrom": "2026-09-14T09:30:00.000Z",
"credentialSubject": {
"type": ["AchievementSubject"],
"achievement": {
"type": ["Achievement"],
"name": "Basic Life Support Workshop",
"criteria": { "narrative": "…" }
}
},
"credentialSchema": [{
"id": "https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_achievementcredential_schema.json",
"type": "1EdTechJsonSchemaValidator2019"
}],
"proof": { "…": "…" }
}Export a certificate
GET/api/public/credentials/{code}/open-badge
Exports require a signed-in recipient or authorized member of the approved issuer, with two-step sign-in completed where enabled. Download from your profile or issuer workspace. The legacy URL remains, but does not allow public downloads. The format follows the Accept header.
Formats
application/ld+jsondefault- The exact signed JSON-LD document, as stored at issue. Not rebuilt, so its proof verifies as is.
application/jwtor ?format=jwt- A compact VC-JWT signed with EdDSA. iss, sub, jti and nbf mirror the credential's fields.
Responses
- 200
- The credential.
- 401
- Sign in or complete two-step authentication.
- 404
- Not found or not authorized for this certificate.
- 409
- This certificate can't be exported as a JWT.
- 410
- Withdrawn or replaced: no longer exported.
- 503
- Unavailable just now.
Rate limit: 60 requests a minute
// Run on nyvarra.app after signing in as the recipient or issuer.
const response = await fetch("/api/public/credentials/NV-000142/open-badge", {
credentials: "same-origin",
headers: { Accept: "application/ld+json" },
});
if (!response.ok) throw new Error(`Download failed: ${response.status}`);
const credential = await response.text();// Run on nyvarra.app after signing in as the recipient or issuer.
const response = await fetch("/api/public/credentials/NV-000142/open-badge", {
credentials: "same-origin",
headers: { Accept: "application/jwt" },
});
if (!response.ok) throw new Error(`Download failed: ${response.status}`);
const credential = await response.text();Validate a credential
POST/api/open-badges/validate
Checks any Open Badges 3.0 credential, from Nyvarra or anywhere else. Send the document as the request body: JSON-LD, or a compact JWT, up to 512 KiB.
It checks the contexts, types, issuer, subject, achievement, criteria, schema reference and dates, then the proof, then the status list if there is one. A credential is never reported valid without a verified proof.
Returns
validation.validboolean- True only when the structure is valid, the dates are current and the proof is verified.
validation.errors · warningsstring[]- What failed, and what passed but deserves a look.
validation.proof.statusstringverified,invalid,missing, orunsupportedfor proof suites Nyvarra doesn't check. Unsupported is never treated as verified.validation.status.statestring- From the Bitstring Status List:
not_present,valid,revoked,suspended,message,refresh,unsupportedorerror. validation.summaryobject- The credential's ID, name, issuer, achievement and dates, for display.
Responses
- 200
- Valid.
- 400
- No document was sent.
- 413
- Larger than 512 KiB.
- 422
- Not valid. Read validation.errors.
- 429
- Rate limited.
Rate limit: 20 requests a minute
curl https://nyvarra.app/api/open-badges/validate \
-H "Content-Type: application/ld+json" \
--data-binary @credential.json{
"success": true,
"validation": {
"valid": true,
"errors": [],
"warnings": [],
"proof": {
"status": "verified",
"method": "eddsa-jcs-2022",
"message": "The eddsa-jcs-2022 proof was verified."
},
"status": {
"state": "not_present",
"purpose": null,
"value": null,
"message": "The credential has no status entry.",
"statusListCredential": null
},
"summary": {
"credentialId": "urn:uuid:4b1e…",
"subjectId": "did:example:holder…",
"name": "Cloud Practitioner",
"issuerId": "did:web:training.example",
"issuerName": "Example Training Ltd",
"achievementName": "Cloud Practitioner",
"validFrom": "2026-03-01T00:00:00Z",
"validUntil": null
}
}
}Import
Holders can bring Open Badges from other platforms into their Nyvarra Passport, as JSON-LD or a compact JWT. Each one is validated as above and keeps its result: a badge with an unsupported proof shows as unsupported, never as verified.
- Imported badges are private until the holder chooses to show them.
- Status lists are checked again before a revocation or suspension is shown, and a list whose own proof fails is treated as a failure.
- Public Passports list them under
external_credentials, with their proof status.
Conformance
Verified means Nyvarra checks the cryptography itself. Supported means the format is read and written as the specification describes.
| Capability | State | Scope |
|---|---|---|
| Credential model | Supported | W3C VC 2.0 with OpenBadgeCredential and AchievementSubject. |
| JSON-LD export | Supported | The exact signed document, with the contexts in the required order. |
| VC-JWT export | Supported | Compact EdDSA JWS with iss, sub, jti and nbf claims. |
| Issuer DID documents | Supported | did:web documents at /issuers/{slug}/did.json, keeping trusted past keys for older credentials. |
| Schema reference | Supported | The Open Badges 3.0 achievement credential schema. |
| Import | Supported | JSON-LD and compact JWT, private until the holder shows them. |
| JWS proofs | Verified | EdDSA and ES256, with keys resolved from the issuer's own HTTPS or did:web document. Embedded keys are only hints. |
| Data Integrity proofs | Verified | eddsa-jcs-2022 and ecdsa-jcs-2019. RDF canonicalisation and selective-disclosure suites are not supported. |
| Bitstring Status List | Supported | Signed remote lists: purpose, index, revocation, suspension and messages, with the 131,072-entry privacy minimum. |
| Remote key retrieval | Supported | HTTPS only, DNS-pinned, private networks refused, size and time bounded. |
Nyvarra hasn't been through 1EdTech's certification programme. This table describes the implementation, not a certification.