This example showcases a Credential Verifier for ACK-ID and ACK-Pay Verifiable Credentials. This API is built with Hono.
ControllerCredential: ACK-ID credentials that prove DID ownership hierarchies.PaymentReceiptCredential: ACK-Pay credentials that provide proof of payment that satisfies a given Payment Request.
This verifier uses Bitstring Status List, to check if a credential is revoked.
pnpm run setuppnpm run devAll API responses respond as JSON objects with the following format:
{
"ok": true,
"data": <anything>
}or
{
"ok": false,
"error": "string error message"
}Verify a Credential
Request Payload
{
"credential": "<credential as a JWT string or raw credential>"
}Response Body
{
"ok": true,
"data": null
}If the credential isn't valid, the API will respond with an error.
Sample cURL
curl --request POST \
--url http://localhost:3457/verify \
--header 'Content-Type: application/json' \
--data '{
"credential": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiQ29udHJvbGxlckNyZWRlbnRpYWwiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiY29udHJvbGxlciI6ImRpZDp3ZWI6MC4wLjAuMCUzQTM0NTg6Y29udHJvbGxlciJ9LCJjcmVkZW50aWFsU3RhdHVzIjp7ImlkIjoiaHR0cDovL2xvY2FsaG9zdDozNDU2L3N0YXR1cy8wIzAiLCJ0eXBlIjoiU3RhdHVzTGlzdDIwMjFFbnRyeSIsInN0YXR1c1B1cnBvc2UiOiJyZXZvY2F0aW9uIiwic3RhdHVzTGlzdEluZGV4IjoiMCIsInN0YXR1c0xpc3RDcmVkZW50aWFsIjoiaHR0cDovL2xvY2FsaG9zdDozNDU2L3N0YXR1cy8wIn19LCJzdWIiOiJkaWQ6d2ViOjAuMC4wLjAlM0EzNDU4OmFnZW50IiwianRpIjoiaHR0cDovL2xvY2FsaG9zdDozNDU2L2NyZWRlbnRpYWxzL2NvbnRyb2xsZXIvMSIsIm5iZiI6MTc0NzQ1MTE4NSwiaXNzIjoiZGlkOndlYjpsb2NhbGhvc3QlM0EzNDU2In0.q1PaaSbuE0rEGWM87Y-dEO9TVuY3tRm1BV1C24OiDHIfDH2f74HALVIS1yLgUyqgHZbgRQGPpJ57kAKBUnDu_w"
}'Or:
curl --request POST \
--url http://localhost:3457/verify \
--header 'Content-Type: application/json' \
--data '{
"credential": {
"@context": ["https://www.w3.org/2018/credentials/v1"],
"id": "http://localhost:3456/credentials/controller/1",
"type": ["VerifiableCredential", "ControllerCredential"],
"issuer": {
"id": "did:web:localhost%3A3456"
},
"issuanceDate": "2025-05-17T03:06:25.000Z",
"credentialSubject": {
"controller": "did:web:0.0.0.0%3A3458:controller",
"id": "did:web:0.0.0.0%3A3458:agent"
},
"credentialStatus": {
"id": "http://localhost:3456/status/0#0",
"type": "BitstringStatusListEntry",
"statusPurpose": "revocation",
"statusListIndex": "0",
"statusListCredential": "http://localhost:3456/status/0"
},
"proof": {
"type": "JwtProof2020",
"jwt": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiQ29udHJvbGxlckNyZWRlbnRpYWwiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiY29udHJvbGxlciI6ImRpZDp3ZWI6MC4wLjAuMCUzQTM0NTg6Y29udHJvbGxlciJ9LCJjcmVkZW50aWFsU3RhdHVzIjp7ImlkIjoiaHR0cDovL2xvY2FsaG9zdDozNDU2L3N0YXR1cy8wIzAiLCJ0eXBlIjoiU3RhdHVzTGlzdDIwMjFFbnRyeSIsInN0YXR1c1B1cnBvc2UiOiJyZXZvY2F0aW9uIiwic3RhdHVzTGlzdEluZGV4IjoiMCIsInN0YXR1c0xpc3RDcmVkZW50aWFsIjoiaHR0cDovL2xvY2FsaG9zdDozNDU2L3N0YXR1cy8wIn19LCJzdWIiOiJkaWQ6d2ViOjAuMC4wLjAlM0EzNDU4OmFnZW50IiwianRpIjoiaHR0cDovL2xvY2FsaG9zdDozNDU2L2NyZWRlbnRpYWxzL2NvbnRyb2xsZXIvMSIsIm5iZiI6MTc0NzQ1MTE4NSwiaXNzIjoiZGlkOndlYjpsb2NhbGhvc3QlM0EzNDU2In0.q1PaaSbuE0rEGWM87Y-dEO9TVuY3tRm1BV1C24OiDHIfDH2f74HALVIS1yLgUyqgHZbgRQGPpJ57kAKBUnDu_w"
}
}
}'Copyright (c) 2025 Catena Labs, Inc.