Documentation Index
Fetch the complete documentation index at: https://docs.beltic.com/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Verification answers a simple question: is this credential currently valid, and what does it say? The Beltic Credentials API runs a deterministic seven-step pipeline for every verify call, returning a flat response that’s either a success (with the full subject + claims) or a structured rejection (with a machine-readable reason code).Prerequisites
- A Beltic API key with
credentials:verifypermission - A signed credential JWT — the
signed_payloadfield from a previous issue response
The Seven-Step Pipeline
Every verify call runs through these checks, in order. The first failure short-circuits the rest.Parse JWS
Decode the JWT header and payload. Extract
alg, kid, and iss. Reject if malformed or if alg isn’t ES256.Resolve the issuer key
Look up
iss in the trusted-issuer list (V1 is just did:web:beltic.com), then fetch the public JWK by kid from /.well-known/jwks.json.Verify the signature
Cryptographically verify the JWT against the resolved key using
jose.jwtVerify. Reject on signature mismatch.Check standard claims
Validate
iat, exp, nbf. Optionally validate aud if context.audience was provided.Validate the schema
Match the JWT claims against the registered credential-type schema. Catches forged credentials whose signature is valid but whose claim shape is wrong.
Check status
Look up the credential in Beltic’s registry, then check the Status List 2021 bit. Reject if revoked, expired, or suspended.
Basic Verify
The minimum request: just the JWT.The issue response returns the JWT as
signed_payload; the verify endpoint accepts it as credential. Same value, different field names — signed_payload is the persisted resource field, credential follows the JWT-VC presentation convention. Pass the JWT string directly either way.Success Response
valid: trueis the headline.statusis the persisted lifecycle (active,revoked,expired,suspended) — different fromvalid, which is the protocol outcome.verification_idis unique per call. Use it as a correlation handle for audit and support.
Rejection Response
Verify with Policy Context
Foragent_authorization credentials, you can pass a context object to evaluate the agent’s permissions against a specific request. This is how downstream services (e.g. a payment gateway) check that the agent is authorized for this particular call.
policy_match:
Reject Reason Codes
| Reason | Pipeline step | Meaning |
|---|---|---|
malformed_jwt | 1 | JWT couldn’t be parsed |
alg_not_allowed | 1 | Algorithm isn’t ES256 |
issuer_not_trusted | 2 | iss isn’t in the trust list |
kid_not_found | 2 | Key ID doesn’t resolve in the issuer’s JWKS |
signature_mismatch | 3 | Signature failed verification |
expired | 4 or 6 | Credential past its exp, or status list says expired |
not_yet_valid | 4 | nbf is in the future |
audience_mismatch | 4 | aud doesn’t match context.audience |
schema_mismatch | 5 | JWT claim shape doesn’t match the credential type |
revoked | 6 | Status List 2021 bit is flipped |
policy_deny | 7 | Generic policy denial |
no_matching_permission | 7 | No permission in the credential matched the request |
condition_failed | 7 | A permission matched but its conditions failed |
Verifying Offline (Without the API)
The full pipeline runs server-side, but the cryptographic checks (steps 1-5) can be replicated offline:- Fetch
https://api.beltic.com/.well-known/jwks.jsonand cache it. Honour the response’sCache-Controlheader (typically 1 hour). - Use any JWT library to verify the JWS against the JWKs.
- Validate
iat,exp,nbfyourself. - To check revocation, fetch
https://api.beltic.com/.well-known/status-lists/v1and decode the bitstring at the credential’sstatus_list_index.
Public Verify (No Auth)
There’s also a public verify endpoint atPOST /v1/credentials/_public/verify that doesn’t require an API key. It returns the same shape but doesn’t expose org-internal fields. Use it for verifier integrations where you can’t ship an API key (e.g. browser-side checks).
Next Steps
Revoke a Credential
Mark a credential revoked and understand how verifiers see the change.
Issue a Credential
Mint a new credential to verify.