
Open Badges 2.0 / 3.0 credential verifier
Verifies an Open Badges credential end to end and says what could and could not be confirmed. Accepts an Open Badges 3.0 credential (JSON with an eddsa-jcs-2022 proof, or a VC-JWT signed with EdDSA, ES256 or RS256), an Open Badges 2.0 assertion (hosted, or signed as an RS256 JWS), a hosted-assertion URL, or a baked PNG or SVG image. Checks the 2.0/3.0 required fields, the issuance and expiry window, the signature, that the signing key (did:key, did:web, JWKS or CryptographicKey) really belongs to the named issuer, the hosted-assertion, BadgeClass and Issuer chain with allowedOrigins and startsWith rules, and revocation (2.0 revocation lists and revoked flag, 3.0 1EdTechRevocationList and Bitstring status lists). Optionally confirms a recipient's email or identity against the badge's salted hash. Every check is pass, fail, unknown (for example an issuer host was unreachable) or unsupported (for example an RDF-canonicalization proof suite), and the verdict is valid only when nothing failed and nothing is left open. No model is used. Remote documents are fetched through an SSRF-guarded client, at most 12 per call, and JSON-LD contexts are never fetched.
What you get
A badge that merely renders proves nothing. This call tells an employer, LMS or wallet whether the issuer really signed it, whether it is expired or revoked, and which parts could not be checked, in under ten seconds.
Call it
Send the JSON body below to https://agents.writerslogic.com/api/v1/open-badges-verifier. An unpaid request answers 402 with the price and how to pay; a request that fails with a 5xx status is not charged.
curl -i -X POST https://agents.writerslogic.com/api/v1/open-badges-verifier \
-H 'content-type: application/json' \
-d '{"credential":{"@context":["https://www.w3.org/ns/credentials/v2","https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"],"id":"urn:uuid:5b6d2c1e-0c1a-4a52-9a53-0c0f7a1c9e11","type":["VerifiableCredential","OpenBadgeCredential"],"issuer":{"id":"did:key:z6MkgAnvkP45uNxwCKeNdt6wrYkEjpYX4f7Nrd8MQqFL8Fbn","type":["Profile"],"name":"Example University"},"validFrom":"2025-01-15T00:00:00Z","name":"Example Achievement","credentialSubject":{"type":["AchievementSubject"],"identifier":[{"type":"IdentityObject","hashed":false,"identityHash":"learner@example.org","identityType":"emailAddress"}],"achievement":{"id":"https://issuer.example/achievements/1","type":["Achievement"],"name":"Example Achievement","description":"Awarded for completing the example course.","criteria":{"narrative":"Complete all modules with a passing grade."}}},"proof":{"type":"DataIntegrityProof","cryptosuite":"eddsa-jcs-2022","created":"2025-01-15T00:00:00Z","verificationMethod":"did:key:z6MkgAnvkP45uNxwCKeNdt6wrYkEjpYX4f7Nrd8MQqFL8Fbn#z6MkgAnvkP45uNxwCKeNdt6wrYkEjpYX4f7Nrd8MQqFL8Fbn","proofPurpose":"assertionMethod","proofValue":"z3iyvJ3hfobNHzMPsBC39QPoo57kX7UWTBkCjL7wda4hxWDoeDeb1tQPq7HueQbbAxBEofghDqXa1rG8MEJexaUWt"}},"recipientIdentity":"learner@example.org"}'
Input
| Field | Type | Required | Description |
|---|---|---|---|
credential | any | no | The credential or assertion as a JSON object (or the same as a JSON string, or a compact JWS string). |
jws | string; length 0..1000000 | no | A compact JWS: an Open Badges 3.0 VC-JWT or an Open Badges 2.0 signed assertion. |
url | string; length 0..2000 | no | https URL of a hosted Open Badges 2.0 assertion or a hosted 3.0 credential. |
image | string; length 0..8500000 | no | A baked badge image, base64 (data URLs accepted): a PNG with an openbadges iTXt chunk, or an SVG with an openbadges:assertion or openbadges:credential element. Up to 6 MB decoded. |
recipientIdentity | string; length 1..320 | no | Optional: the recipient's email or other identity to compare against the badge's recipient, including salted sha256$ and md5$ hashes. |
Example request body
{
"credential": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
],
"id": "urn:uuid:5b6d2c1e-0c1a-4a52-9a53-0c0f7a1c9e11",
"type": [
"VerifiableCredential",
"OpenBadgeCredential"
],
"issuer": {
"id": "did:key:z6MkgAnvkP45uNxwCKeNdt6wrYkEjpYX4f7Nrd8MQqFL8Fbn",
"type": [
"Profile"
],
"name": "Example University"
},
"validFrom": "2025-01-15T00:00:00Z",
"name": "Example Achievement",
"credentialSubject": {
"type": [
"AchievementSubject"
],
"identifier": [
{
"type": "IdentityObject",
"hashed": false,
"identityHash": "learner@example.org",
"identityType": "emailAddress"
}
],
"achievement": {
"id": "https://issuer.example/achievements/1",
"type": [
"Achievement"
],
"name": "Example Achievement",
"description": "Awarded for completing the example course.",
"criteria": {
"narrative": "Complete all modules with a passing grade."
}
}
},
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "eddsa-jcs-2022",
"created": "2025-01-15T00:00:00Z",
"verificationMethod": "did:key:z6MkgAnvkP45uNxwCKeNdt6wrYkEjpYX4f7Nrd8MQqFL8Fbn#z6MkgAnvkP45uNxwCKeNdt6wrYkEjpYX4f7Nrd8MQqFL8Fbn",
"proofPurpose": "assertionMethod",
"proofValue": "z3iyvJ3hfobNHzMPsBC39QPoo57kX7UWTBkCjL7wda4hxWDoeDeb1tQPq7HueQbbAxBEofghDqXa1rG8MEJexaUWt"
}
},
"recipientIdentity": "learner@example.org"
}
Result
The response is { "data": ..., "_provenance": ... }. data carries these fields; _provenance is a signed W3C Verifiable Credential with a C2PA-style manifest, checked free at POST /api/v1/verify-provenance.
| Field | Type | Required | Description |
|---|---|---|---|
verdict | string; one of "valid", "invalid", "unverified" | no | invalid: at least one check failed. unverified: nothing failed but some checks are unknown or unsupported. valid: every check passed. |
verdictReason | string | no | |
format | string; one of "ob2-hosted", "ob2-signed", "ob3-credential", "ob3-jwt", "unrecognized" | no | |
specVersion | string; one of "2.0", "3.0", "unknown" | no | |
source | string; one of "json", "jws", "url", "png", "svg" | no | |
checks | array<object> | no | |
summary | object | no | |
badge | one of | no | |
proof | one of | no | |
recipient | object | no | matched (true, false or null when no identity was supplied) and detail. |
fetched | array<object> | no | |
deterministic | boolean | no | Always true: no model is involved. |
Pay and connect
Available through: x402 (USDC on Base), MCP, RapidAPI, Apify.
Machine-readable
- This agent as JSON (schemas, example, OpenAPI operation)
- Free signed sample response
- OpenAPI 3.1 · Catalog · Index of every agent