All requests are JSON over HTTPS. Authenticate with X-API-KEY: zada_….
/api/v1/issueX-API-KEY (scope: issue)Sign a payload through the full ZADA pipeline and (optionally) render an A4 PDF. `subject` is optional and becomes the JWT `sub` claim — use it for personal credentials, omit it for bearer credentials.
{
"issuer_id": "did:key:z6Mk…", // required — the HOT SD-JWT issuer DID (not the cold DID)
"subject": "patient-1234", // optional — JWT 'sub' claim, identifies who the credential is about
"claims": { "type": "HealthCertificate", "result": "negative" },
"generate_pdf": true // optional, default true
}{
"zada": "ZADA:6BFOXN%TS3DH...",
"pdf_url": "https://.../credentials/<tenant>/<id>.pdf",
"issuer": { "id": "...", "did": "did:key:zCold…", "linked_hot_did": "did:key:zHot…", "name": "...", "kid": "...", "x5t_s256": "..." },
"issued_at": "2026-04-20T12:00:00Z"
}/api/v1/verifyX-API-KEY (scope: verify)Decode and verify a ZADA string against the cached trust registry.
{ "zada": "ZADA:6BFOXN%..." }{
"valid": true,
"issuer": { "name": "...", "kid": "...", "x5t_s256": "...", "linked_hot_did": "did:key:zHot…", "trust_source": "registry_cache" },
"algorithm": "EdDSA",
"claims": { ... }
}/api/v1/registry/syncPublicReturns a CBOR-encoded, COSE_Sign1-signed bundle of trusted issuers for offline verification.
—
Binary application/cose payload (download as zada-trust-bundle.cose)
/api/v1/registry/refreshX-API-KEY (scope: issue)Pull latest entries from the configured ZADA mirror (env MOCK_ZADA_URL) into trust_registry_cache. Seeds 2 mock issuers if no URL is set.
—
{ "refreshed": 2, "source": "mock-seed" }Claims
└─ CBOR encode
└─ COSE_Sign1 (alg: EdDSA, kid, x5t#S256)
└─ ZLIB deflate
└─ Base45 encode
└─ Prepend "ZADA:"
└─ QR code (Level H)Cold credentials are signed by a separate cold-system key, but you address issuers by their hot SD-JWT DID. The cold system handles the mapping — wallets only need to know one DID per issuer.
curl -X POST https://coldcred.zada.solutions/api/v1/issue \
-H "X-API-KEY: zada_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"issuer_id": "did:key:zDnaepLCSitGvvprHJZFjaC61aFUmHrKcGLGEkBrf1PAceUna",
"subject": "patient-1234",
"claims": { "type": "HealthCertificate", "result": "negative" },
"generate_pdf": true
}'The issuer_id is the hot SD-JWT issuer DID — exactly the one your wallet already has. The iss claim inside the signed cold credential is the cold signing DID (so verifiers can resolve the public key from the credential alone). Use linked_hot_did in the verify response to display the familiar hot identity to users.
subject is a free-form string identifying who the credential is about. It maps to the standard JWT sub claim inside the signed payload, is stored on the credential row (so you can list/filter by it later), is rendered on the PDF, and is returned inside the verified claims on /verify. The cold system never interprets it — pick whatever identifier makes sense for your use case (patient ID, employee email, student number, VIN, etc.).
Omit it for bearer-style credentials (event tickets, vouchers, anything not tied to a specific person). When omitted, sub in the signed payload is null.
curl -X POST https://coldcred.zada.solutions/api/v1/issue \
-H "X-API-KEY: zada_…" \
-H "Content-Type: application/json" \
-d '{
"issuer_id": "did:key:zDnaepLCSitGvvprHJZFjaC61aFUmHrKcGLGEkBrf1PAceUna",
"subject": "patient-1234",
"claims": {
"type": "HealthCertificate",
"result": "negative",
"testedAt": "2026-04-24"
}
}'curl -X POST https://coldcred.zada.solutions/api/v1/issue \
-H "X-API-KEY: zada_…" \
-H "Content-Type: application/json" \
-d '{
"issuer_id": "did:key:zDnaepLCSitGvvprHJZFjaC61aFUmHrKcGLGEkBrf1PAceUna",
"claims": {
"type": "EventTicket",
"event": "ZADA Summit 2026",
"seat": "A12"
}
}'curl -X POST https://coldcred.zada.solutions/api/v1/verify \
-H "X-API-KEY: zada_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "zada": "ZADA:6BFOXN%TS3DH..." }'Public — no authentication required.
curl https://coldcred.zada.solutions/api/v1/registry/sync \ -o zada-trust-bundle.cose
curl -X POST https://coldcred.zada.solutions/api/v1/registry/refresh \ -H "X-API-KEY: zada_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxx"