The whitepaper, step-by-step guides for verifying and issuing, and the API at a glance. Everything here describes what is live — nothing aspirational.
1. Verify a credential you already have
curl -s -X POST https://api.dcslabs.ai/v1/credentials/verify \
-H "Content-Type: application/json" \
-d '{"cid":"sha256:<your-cid>"}'
2. Or verify by full receipt + original document (checks the hash too)
curl -s -X POST https://api.dcslabs.ai/v1/credentials/verify \
-H "Content-Type: application/json" \
-d '{"receipt":{ ... }, "document":{ ... }}'
3. Issuers: get a free key, then issue
curl -s -X POST https://api.dcslabs.ai/v1/auth/signup -H "Content-Type: application/json" -d '{"email":"[email protected]"}'
curl -s -X POST https://api.dcslabs.ai/v1/credentials/issue \
-H "Authorization: Bearer <key>" -H "Content-Type: application/json" \
-d '{"subject":{ ... }}'
{
"id": "<issuer-scoped id>",
"cid": "sha256:<hash of the canonical unsigned form>",
"issuer": "did:web:dcslabs.ai",
"subject": { ... }, // your credential payload
"status": { "listId": "...", "index": 42 }, // optional
"signature": "<Ed25519 over the canonical bytes>"
}
<script src="https://verify.dcslabs.ai/badge.js" defer></script> <span class="dcs-badge" data-cid="sha256:<your-cid>"></span>
verify.html?cid=... so anyone can re-check independently.POST /v1/credentials/issue signs + stores, with an optional status slot and Base anchor.POST /v1/credentials/{cid}/revoke|suspend|reactivate — revocation permanent, suspension reversible.sha256:…) or the full receipt JSON you were given.curl -s -X POST https://api.dcslabs.ai/v1/credentials/verify \
-H 'Content-Type: application/json' \
-d '{"cid":"sha256:..."}'
→ {"validity_status":"valid","signature_valid":true,
"hash_match":null,"anchor_present":true,"latest_cid":null}
W3C Verifiable Credentials (eddsa-jcs-2022) and Open Badges 3.0 verify through POST /v1/verify/universal — keys resolved via did:key or did:web. Unsupported formats get an honest "not yet verifiable", never a fake valid.
Self-serve at join.html — instant, shown once, store it safely.
curl -s -X POST https://api.dcslabs.ai/v1/issuers/request \
-H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
-d '{"issuer_id":"your-org","display_name":"Your Organisation",
"contact_email":"[email protected]","profile":"r2-education"}'
Requests are reviewed (the public registry lists real, accountable organisations only). Once approved, your profile and trust score appear in the Explorer automatically.
curl -s -X POST https://api.dcslabs.ai/v1/credentials/issue \
-H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
-d '{
"issuer": "your-org",
"credential_type": "certificate",
"subject": { "subject_name": "Asha Verma",
"issuer_institution": "Your Organisation",
"credential_title": "Full-Stack Diploma",
"issued_date": "2026-06-04" },
"status_enabled": true,
"anchor": true
}'
Returns the signed receipt. Give the holder the receipt JSON, or simply the link / QR:
https://verify.dcslabs.ai/verify.html?cid=sha256:...
POST /v1/credentials/{cid}/revoke # permanent — cannot be undone
POST /v1/credentials/{cid}/suspend # temporary
POST /v1/credentials/{cid}/reactivate # clears suspension only
| Endpoint | Auth | What it does |
|---|---|---|
POST /v1/credentials/verify | none | Verify by cid or receipt (+ optional document) → four-state result |
GET /v1/credentials/{id|cid} | none | Fetch a receipt (?format=w3c for the VC envelope) |
GET /v1/status/{listId} | none | Public status bitstring · /v1/status/cid/{cid} for one credential |
POST /v1/verify/universal | none | Any format → verify or honest refusal · GET …/formats for the matrix |
GET /v1/registry | none | All issuers + reproducible trust scores · /{issuer} for one profile |
GET /v1/explorer/stats | none | Real network counts |
POST /v1/portal/check | none | Anti-clone advisory for a portal URL |
POST /v1/auth/signup | none | {email} → free API key (rate-limited) |
POST /v1/credentials/issue | Bearer | Sign + store + optional status slot and Base anchor |
POST /v1/credentials/{cid}/revoke|suspend|reactivate | Bearer | Lifecycle management |
POST /v1/issuers/request | Bearer | Request your own issuer ID |
| Symptom | Likely cause | Fix |
|---|---|---|
Result is unknown | CID not found / never issued by a known issuer | Confirm the CID is exact; check the issuer is in /v1/registry |
Result is invalid after editing the document | The document no longer hashes to the receipt CID | Verify against the original unmodified document JSON |
| Signature check fails | Issuer key rotated, or wrong did:web | Re-fetch the issuer key from dcslabs.ai/.well-known/did.json |
| Badge shows nothing | badge.js blocked or wrong data-cid | Check the script loads over HTTPS and the CID attribute is set |
401 on issue | Missing/expired Bearer key | Re-issue a key via /v1/auth/signup (verification never needs a key) |
429 | Rate limit on the free tier | Back off per the Retry-After header; upgrade for higher limits |