GET /api/v1/badges/{credential_type} serves the official badge images for a credential. The endpoint is public — no API key — so you can embed it directly on any page, including pages you don’t control like a token listing.
Options
iconis the square mark;fullis the pill badge with the credential name.sizeapplies toicononly and is ignored forfull.size=64falls back to the 32 px asset — no 64 px icon exists.webpis accepted as a value but returns415 Unsupported Media Type— it isn’t available yet.
Every variant
KYI verified

kyi_verified · full · light

kyi_verified · full · dark

kyi_verified · icon · light

kyi_verified · icon · dark
Proof of Collateral

proof_of_collateral · full · light

proof_of_collateral · full · dark

proof_of_collateral · icon · light

proof_of_collateral · icon · dark
Embed it
asset_url from an asset lookup) so anyone can check the claim behind it.
Caching
Badge responses are immutable:Errors
All errors return a JSON body even though the route serves images:FAQ
Why is badge serving public while every other route needs a key?
Why is badge serving public while every other route needs a key?
The badge only displays a public verification status — it leaks nothing. Requiring a key would make it impossible to embed on third-party sites, which is its purpose.
Which theme should I use?
Which theme should I use?
Match the surface the badge sits on.
light for light backgrounds, dark for dark. The pill (full) reads better as a standalone element; the icon works inline next to a token name.Does the badge image reflect live verification state?
Does the badge image reflect live verification state?
The badge is a static claim image — it doesn’t check state at render time. Resolve the verification first with an asset lookup, then show the badge only when the asset is verified.
Related
- Recipe: KYI badge — the end-to-end walkthrough
- Asset lookup — get
asset_urland the verification state to gate the badge