Skip to main content
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 order
https://www.w3.org/ns/credentials/v2, then https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json.
typestring[]
VerifiableCredential and OpenBadgeCredential, with an AchievementSubject holding one Achievement.
credentialSchemaobject[]
https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_achievementcredential_schema.json
issuer.iddid:web
did:web:nyvarra.app:issuers:{slug}, resolvable at https://nyvarra.app/issuers/{slug}/did.json. It lists the issuer's public keys only; withdrawn keys are removed from assertionMethod.
Shape of an exported credential
{
  "@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": { "…": "…" }
}
Abridged. Export a real certificate to see every field.

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

JSON-LD
// 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();
VC-JWT
// 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.statusstring
verified, invalid, missing, or unsupported for 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, unsupported or error.
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

Request
curl https://nyvarra.app/api/open-badges/validate \
  -H "Content-Type: application/ld+json" \
  --data-binary @credential.json
200 OK
{
  "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.

Import a credential

Conformance

Verified means Nyvarra checks the cryptography itself. Supported means the format is read and written as the specification describes.

CapabilityStateScope
Credential modelSupportedW3C VC 2.0 with OpenBadgeCredential and AchievementSubject.
JSON-LD exportSupportedThe exact signed document, with the contexts in the required order.
VC-JWT exportSupportedCompact EdDSA JWS with iss, sub, jti and nbf claims.
Issuer DID documentsSupporteddid:web documents at /issuers/{slug}/did.json, keeping trusted past keys for older credentials.
Schema referenceSupportedThe Open Badges 3.0 achievement credential schema.
ImportSupportedJSON-LD and compact JWT, private until the holder shows them.
JWS proofsVerifiedEdDSA and ES256, with keys resolved from the issuer's own HTTPS or did:web document. Embedded keys are only hints.
Data Integrity proofsVerifiededdsa-jcs-2022 and ecdsa-jcs-2019. RDF canonicalisation and selective-disclosure suites are not supported.
Bitstring Status ListSupportedSigned remote lists: purpose, index, revocation, suspension and messages, with the 131,072-entry privacy minimum.
Remote key retrievalSupportedHTTPS 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.