{"id":"open-badges-verifier","title":"Open Badges 2.0 / 3.0 credential verifier","description":"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.","roi":"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.","audience":"business","channels":["x402","mcp","rapidapi","apify"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/open-badges-verifier","path":"/api/v1/open-badges-verifier","contentType":"application/json"},"price":{"amount":"0.05","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"credential":{"description":"The credential or assertion as a JSON object (or the same as a JSON string, or a compact JWS string)."},"jws":{"type":"string","maxLength":1000000,"description":"A compact JWS: an Open Badges 3.0 VC-JWT or an Open Badges 2.0 signed assertion."},"url":{"type":"string","maxLength":2000,"description":"https URL of a hosted Open Badges 2.0 assertion or a hosted 3.0 credential."},"image":{"type":"string","maxLength":8500000,"description":"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":{"type":"string","minLength":1,"maxLength":320,"description":"Optional: the recipient's email or other identity to compare against the badge's recipient, including salted sha256$ and md5$ hashes."}}},"resultSchema":{"type":"object","properties":{"verdict":{"type":"string","enum":["valid","invalid","unverified"],"description":"invalid: at least one check failed. unverified: nothing failed but some checks are unknown or unsupported. valid: every check passed."},"verdictReason":{"type":"string"},"format":{"type":"string","enum":["ob2-hosted","ob2-signed","ob3-credential","ob3-jwt","unrecognized"]},"specVersion":{"type":"string","enum":["2.0","3.0","unknown"]},"source":{"type":"string","enum":["json","jws","url","png","svg"]},"checks":{"type":"array","items":{"type":"object","description":"id (structure, dates, badge-class, issuer, hosted, proof-signature, issuer-key, jwt-claims, revocation, recipient), status (pass, fail, unknown, unsupported) and detail."}},"summary":{"type":"object","properties":{"pass":{"type":"integer"},"fail":{"type":"integer"},"unknown":{"type":"integer"},"unsupported":{"type":"integer"}}},"badge":{"anyOf":[{"type":"object","description":"name, description, criteria, image, achievementId, issuer {id, name, url}, issuedOn, expires and credentialId, as read from the verified document; null when unrecognized."},{"type":"null"}]},"proof":{"anyOf":[{"type":"object","description":"type, suite or alg, keyId and keySource of the proof that was checked; null when unrecognized."},{"type":"null"}]},"recipient":{"type":"object","description":"matched (true, false or null when no identity was supplied) and detail."},"fetched":{"type":"array","items":{"type":"object","description":"url and ok for every remote document requested."}},"deterministic":{"type":"boolean","description":"Always true: no model is involved."}}},"outputSchema":{"type":"object","properties":{"data":{"type":"object","properties":{"verdict":{"type":"string","enum":["valid","invalid","unverified"],"description":"invalid: at least one check failed. unverified: nothing failed but some checks are unknown or unsupported. valid: every check passed."},"verdictReason":{"type":"string"},"format":{"type":"string","enum":["ob2-hosted","ob2-signed","ob3-credential","ob3-jwt","unrecognized"]},"specVersion":{"type":"string","enum":["2.0","3.0","unknown"]},"source":{"type":"string","enum":["json","jws","url","png","svg"]},"checks":{"type":"array","items":{"type":"object","description":"id (structure, dates, badge-class, issuer, hosted, proof-signature, issuer-key, jwt-claims, revocation, recipient), status (pass, fail, unknown, unsupported) and detail."}},"summary":{"type":"object","properties":{"pass":{"type":"integer"},"fail":{"type":"integer"},"unknown":{"type":"integer"},"unsupported":{"type":"integer"}}},"badge":{"anyOf":[{"type":"object","description":"name, description, criteria, image, achievementId, issuer {id, name, url}, issuedOn, expires and credentialId, as read from the verified document; null when unrecognized."},{"type":"null"}]},"proof":{"anyOf":[{"type":"object","description":"type, suite or alg, keyId and keySource of the proof that was checked; null when unrecognized."},{"type":"null"}]},"recipient":{"type":"object","description":"matched (true, false or null when no identity was supplied) and detail."},"fetched":{"type":"array","items":{"type":"object","description":"url and ok for every remote document requested."}},"deterministic":{"type":"boolean","description":"Always true: no model is involved."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]},"example":{"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"},"openapiOperation":{"operationId":"open_badges_verifier","summary":"Open Badges 2.0 / 3.0 credential verifier","description":"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.\n\nPrice: 0.05 USDC on Base (x402).","x-x402-price-usdc":"0.05","x-x402-amount":"50000","x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.05"}},"x-audience":"business","x-sample-url":"https://agents.writerslogic.com/api/v1/samples/open-badges-verifier","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"credential":{"description":"The credential or assertion as a JSON object (or the same as a JSON string, or a compact JWS string)."},"jws":{"type":"string","maxLength":1000000,"description":"A compact JWS: an Open Badges 3.0 VC-JWT or an Open Badges 2.0 signed assertion."},"url":{"type":"string","maxLength":2000,"description":"https URL of a hosted Open Badges 2.0 assertion or a hosted 3.0 credential."},"image":{"type":"string","maxLength":8500000,"description":"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":{"type":"string","minLength":1,"maxLength":320,"description":"Optional: the recipient's email or other identity to compare against the badge's recipient, including salted sha256$ and md5$ hashes."}}},"example":{"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"}}}},"responses":{"200":{"description":"Paid result with provenance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"verdict":{"type":"string","enum":["valid","invalid","unverified"],"description":"invalid: at least one check failed. unverified: nothing failed but some checks are unknown or unsupported. valid: every check passed."},"verdictReason":{"type":"string"},"format":{"type":"string","enum":["ob2-hosted","ob2-signed","ob3-credential","ob3-jwt","unrecognized"]},"specVersion":{"type":"string","enum":["2.0","3.0","unknown"]},"source":{"type":"string","enum":["json","jws","url","png","svg"]},"checks":{"type":"array","items":{"type":"object","description":"id (structure, dates, badge-class, issuer, hosted, proof-signature, issuer-key, jwt-claims, revocation, recipient), status (pass, fail, unknown, unsupported) and detail."}},"summary":{"type":"object","properties":{"pass":{"type":"integer"},"fail":{"type":"integer"},"unknown":{"type":"integer"},"unsupported":{"type":"integer"}}},"badge":{"anyOf":[{"type":"object","description":"name, description, criteria, image, achievementId, issuer {id, name, url}, issuedOn, expires and credentialId, as read from the verified document; null when unrecognized."},{"type":"null"}]},"proof":{"anyOf":[{"type":"object","description":"type, suite or alg, keyId and keySource of the proof that was checked; null when unrecognized."},{"type":"null"}]},"recipient":{"type":"object","description":"matched (true, false or null when no identity was supplied) and detail."},"fetched":{"type":"array","items":{"type":"object","description":"url and ok for every remote document requested."}},"deterministic":{"type":"boolean","description":"Always true: no model is involved."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]}}}},"400":{"description":"Invalid request (no payment consumed)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Invalid X-API-KEY","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"402":{"description":"Payment required or invalid","content":{"application/json":{"schema":{"type":"object","description":"x402 v2 PaymentRequired (also base64 in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"code":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}}}}}},"502":{"description":"Upstream failure; the payment is released or not settled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}},"links":{"docs":"https://agents.writerslogic.com/docs/open-badges-verifier/","docsJson":"https://agents.writerslogic.com/docs/open-badges-verifier.json","sample":"https://agents.writerslogic.com/api/v1/samples/open-badges-verifier","openapi":"https://agents.writerslogic.com/openapi.json","catalog":"https://agents.writerslogic.com/api/v1/catalog","verifyProvenance":"https://agents.writerslogic.com/api/v1/verify-provenance","index":"https://agents.writerslogic.com/docs/index.json"}}