BADGE IMAGE (PNG / SVG) baked in Assertion JSON-LD "@context": "https://w3id.org/openbadges/v2", "type": "Assertion", "recipient": "type": "email", "hashed": true "badge": "https://issuebadge.com/badges/123" "issuedOn": "2026-03-16" "verification": "type": "HostedBadge" "evidence": "https://issuebadge.com/ev/123" // + BadgeClass + IssuerProfile refs ✓ Verified · Issuer: IssueBadge.com VERIFIED JSON-LD Badge Metadata: How Verification Works IssueBadge.com · Digital Credentials Guide · 2026
Standards & Technology · Cluster Article 4

JSON-LD Badge Metadata: How Digital Badge Verification Works

By IssueBadge.com Editorial Team  ·  Published March 16, 2026  ·  1,900 words  ·  9 min read

When someone says a digital badge is "verifiable," there's actual machinery behind that claim. It's not a website showing a badge image with a name on it. It's structured data embedded in or linked to the badge, following a defined standard, with a verification chain that any independent tool can follow. That machinery is JSON-LD metadata.

This article explains how JSON-LD metadata works in digital badges, what it is, what fields it contains, how it ends up in (or linked to) a badge image, and how verification tools use it to confirm a badge is real. No programming experience required, though we do show real JSON examples, they're readable, we promise.

For the context on why this matters, start with What Are Open Badges? or the Digital Credentials Complete Guide.

What Is JSON-LD?

JSON stands for JavaScript Object Notation, a lightweight text format for representing structured data. It's used everywhere in web development because it's human-readable and machine-parseable. Here's what a simple JSON object looks like:

Basic JSON example
{
  "name": "Alex Smith",
  "award": "Data Science Foundations",
  "date": "2026-03-16"
}

The "LD" in JSON-LD stands for Linked Data. Linked Data is a method of connecting information on the web by referencing shared vocabularies, so that machines can understand the meaning of data, not just its structure. A plain JSON field called "date" is ambiguous, a date of what? JSON-LD resolves this by including a @context declaration that links the fields to defined meanings.

In Open Badges, the @context declaration points to the Open Badges vocabulary (a published JSON-LD context document). This means any machine reading a badge assertion knows that issuedOn means "the date this badge was issued," recipient means "the person who received this badge," and so on, not because of local conventions, but because of the shared vocabulary.

The practical significance: JSON-LD is what makes badge metadata interoperable. Because the field meanings are defined by a shared, published standard, any verifier built to the same standard can read any conforming badge, even if the badge was issued on a completely different platform.

Badge Baking: embedding metadata in images

"Badge baking" is one of those terms that sounds mysterious but describes something elegantly simple: the process of embedding the badge's JSON-LD assertion metadata directly into the badge image file.

Digital image files, particularly PNG and SVG formats, support metadata fields that can store arbitrary text. In PNG files, this is done through "iTXt" chunks (international text chunks) in the PNG data structure. The badge assertion JSON is stored in one of these chunks, attached to the image data but not displayed visually.

What this means: when someone downloads their badge image, they're not just downloading a picture. They're downloading a picture that contains its own proof of authenticity. If they upload it to a verifier, the verifier reads the hidden metadata and checks the credential chain.

Not all badges are baked, though. In Open Badges 2.0, there are two delivery formats:

Most modern badge platforms default to hosted badges, with baking available on request or automatically. Open Badges 3.0 shifts toward self-contained credentials (more like baked badges) because the cryptographic proof makes server-independent verification possible.

The three Badge objects and their fields

Open Badge metadata is organized into three interconnected JSON-LD objects. Here's each one with its key fields.

1. The Assertion

This is the individual credential record, the specific instance of a badge being awarded to a specific person. Every issued badge has exactly one assertion.

FieldRequired?Description
@contextRequiredPoints to the Open Badges JSON-LD vocabulary (e.g., "https://w3id.org/openbadges/v2")
typeRequiredMust be "Assertion" (OB 2.0) or "OpenBadgeCredential" (OB 3.0)
idRequiredUnique URL identifying this specific assertion, the canonical location of the hosted assertion
recipientRequiredObject containing the hashed recipient identity and the identity type (email, DID)
badgeRequiredURL pointing to the BadgeClass, the definition of what was earned
issuedOnRequiredISO 8601 date-time of when the badge was issued
verificationRequiredObject describing how to verify the assertion (hosted URL or signed key)
expiresOptionalISO 8601 date after which the credential is considered expired
evidenceOptionalArray of evidence objects, URLs, descriptions, and artifact references showing the work done to earn the badge
narrativeOptionalFree-text description of the achievement in the context of this specific earner

2. The BadgeClass

This is the template or definition of the badge, what it means, who grants it, and what's required to earn it. It's shared across all assertions of that badge type.

FieldRequired?Description
typeRequiredMust be "BadgeClass"
idRequiredUnique URL for this badge definition, must be stable and publicly accessible
nameRequiredThe human-readable name of the badge
descriptionRequiredDescription of the badge and what it represents
imageRequiredURL of the badge image
criteriaRequiredURL or inline object describing what was required to earn the badge
issuerRequiredURL pointing to the IssuerProfile
tagsOptionalArray of keyword strings for categorization
alignmentOptionalArray of alignment objects mapping the badge to external frameworks (e.g., O*NET, ESCO)

3. The issuer profile

Describes the organization or person issuing the badge. Verifiers fetch this to confirm who issued the badge and to retrieve the public key (in OB 3.0).

FieldRequired?Description
typeRequiredMust be "Issuer" or "Profile"
idRequiredUnique URL or DID for the issuing organization
nameRequiredThe name of the issuing organization
urlOptionalThe organization's website URL
emailOptionalContact email for the issuing organization
publicKeyOB 3.0The organization's public key used to verify cryptographic proofs on OB 3.0 credentials

How recipient identity Is protected (Hashing)

A common question: is my email address visible in the badge metadata? The answer is no, and the mechanism used to protect it while still enabling verification is called hashing.

When an assertion is created, the recipient's email is not stored directly. Instead, a one-way mathematical function (a hash function, specifically SHA-256) is applied to the email, producing a fixed-length string that looks like gibberish. This hash is stored in the metadata. Also, a random "salt" value is added to the email before hashing, preventing rainbow-table attacks (pre-computed hash tables).

Recipient field in an assertion
{
  "recipient": {
    "type": "email",
    "hashed": true,
    "salt": "abc123randomsalt",
    "identity": "sha256$a9b8c7..."  // hash of salt+email
  }
}

To verify that a badge belongs to a specific person, the verifier takes the claimed email address, prepends the salt, hashes the result, and compares it to the stored hash. If they match, the badge belongs to that person. If they don't, it doesn't. Crucially, no one can reverse the hash to find the email address.

The verification flow, step by step

1

Input: Badge file or URL

The verifier receives either the badge image file (with baked metadata) or the assertion URL. Both lead to the same JSON-LD assertion data.

2

Extract or fetch the assertion

For a baked badge: extract the JSON-LD from the PNG's iTXt chunk. For a hosted badge: perform an HTTP GET request to the assertion URL to retrieve the JSON.

3

Fetch the BadgeClass

The assertion contains a badge field with a URL pointing to the BadgeClass. The verifier fetches this URL and confirms the badge definition exists and is valid.

4

Fetch the Issuer Profile

The BadgeClass contains an issuer field with the Issuer Profile URL. The verifier fetches this to confirm the issuing organization and, in OB 3.0, to retrieve the public key.

5

Verify recipient identity

If checking against a specific person, the verifier hashes the provided email (with the stored salt) and compares to the identity hash in the assertion.

6

Check expiration and revocation

If the assertion has an expires field, the verifier checks whether the badge is still within its validity period. If the issuer has published a revocation list, the verifier checks it too.

7

Return result

The verifier returns a clear result: Valid, Expired, Revoked, or Error, with details about what was found and any issues encountered.

Hosted verification vs signed verification

There are two fundamentally different verification models in the Open Badges ecosystem, and the difference matters for long-term credential durability.

Hosted verification (OB 2.0)

The assertion is hosted at a URL maintained by the badge platform. Verification requires fetching live data from that URL. If the URL is down, the badge cannot be verified. The platform is the single point of truth.

Signed verification (OB 2.0 signed / OB 3.0)

The assertion is signed with the issuer's private key, and the signature is embedded in the badge. Verification checks the signature using the issuer's public key (fetched from a DID document or key URL). If the signature is valid, the badge is authentic, regardless of whether the issuing platform is online.

Bottom line: Hosted verification is simpler but fragile. Signed verification is more complex but durable. For credentials that need to remain valid for years, signed verification (OB 3.0) is the right foundation.

How OB 3.0 adds cryptographic proofs

In Open Badges 3.0, every credential must include a proof object in the JSON-LD. This proof contains the cryptographic signature and specifies the proof method used.

OB 3.0 proof object (simplified)
{
  "proof": {
    "type": "Ed25519Signature2020",
    "created": "2026-03-16T10:00:00Z",
    "verificationMethod": "did:web:issuebadge.com#key-1",
    "proofPurpose": "assertionMethod",
    "proofValue": "z5rYqP2..."  // the actual signature
  }
}

The verificationMethod field points to the issuer's DID and a specific key. A verifier resolves this DID, retrieves the public key, and uses it to verify the signature. If the credential content has been altered at all, even a single character, the signature check fails.

What issuers need to know about their metadata

Most badge platforms handle metadata automatically. But there are things every issuer should verify about the metadata quality in their badges:

Watch out for: Some platforms generate badge images that look professional but fail independent verification, because the hosted assertion URLs are malformed, the BadgeClass JSON is missing required fields, or the context declaration is incorrect. Always test with an independent verifier before rolling out a badge program.

Frequently asked questions

What is JSON-LD in the context of digital badges?

JSON-LD (JavaScript Object Notation for Linked Data) is the data format used to embed verifiable metadata inside Open Badge images and assertions. It structures badge information, who earned it, who issued it, what criteria were required, in a machine-readable format that any compliant verifier can check.

What is badge baking?

Badge baking is the process of embedding JSON-LD assertion metadata directly into a badge PNG image file. A baked badge carries its own proof of authenticity, the metadata is stored in the image's iTXt chunk and can be extracted by any verifier tool.

What data is inside an Open Badge assertion?

An assertion contains: a unique assertion ID, the BadgeClass URL, the recipient's hashed identity, issue date, optional expiration date, evidence URLs, and verification information. In OB 3.0, it also contains a cryptographic proof object.

How does a badge verifier check a badge?

A badge verifier reads the JSON-LD assertion, fetches the BadgeClass and Issuer Profile, verifies the recipient identity hash, checks expiration and revocation, and in OB 3.0 verifies the cryptographic proof. The result is a clear pass or fail with details.

Is the recipient's email visible in a badge?

No. The email is stored as a salted SHA-256 hash, a one-way transformation that makes the original email unreadable. Verifiers can confirm that a specific email matches the hash, but cannot extract the original email from the metadata.

Issue Badges with verified metadata

IssueBadge.com generates standards-compliant JSON-LD metadata for every badge, so your credentials pass independent verification and stay credible long-term.

Start Issuing Free →