---
title: "Get embeddable badge descriptor"
method: GET
path: "/api/v1/profiles/badge/{username}"
tags: ["Profiles"]
---

# Get embeddable badge descriptor

`GET /api/v1/profiles/badge/{username}`

## Request

- Base URL: `https://api.proof.holdings`
- URL: `https://api.proof.holdings/api/v1/profiles/badge/{username}`
- Auth: none declared

Public, unauthenticated. Everything needed to embed the verification badge for a username: the subject it asserts, the live verified count, the badge image URL for each style, and ready-to-paste Markdown/HTML snippets. There is NO 404 branch — an unknown username, a profile that is not public, and a published profile with no live proof all answer 200 with state `no_public_record`, so a caller never has to treat "nothing to show" as an error and the three cases stay indistinguishable.

## Path parameters

- `username` string, required: Username

## Response `200`

Badge descriptor

- ProfileBadgeResponse: Everything needed to embed the verification badge for a username (proof.holdings/badge/{username})
  - `username` string, required
  - `subject` string, required: What the badge asserts ABOUT — a verified domain where the profile has one, else the business or display name, else the @handle. In the `no_public_record` state it is always the requested handle, so a profile the endpoint declines to describe leaks no name
  - `verified_count` integer, required: LIVE count of visible proofs whose backing asset is still active — a revoked asset still present in the profile snapshot is not counted. Zero in the `no_public_record` state
  - `state` 'published' | 'no_public_record', required: Branch on THIS, not the HTTP status. An unknown username, a profile that is not public, and a published profile with no live proof all answer 200 with `no_public_record` and are deliberately indistinguishable from one another — this endpoint must not become the oracle that separates cases `GET /profiles/u/{username}` answers with a uniform 404
  - `checked_at` string, required: When this answer was computed (ISO 8601)
  - `profile_url` string, required
  - `badge_urls` object, required: The live badge image per style. EXTENSIONLESS by design: the badge is served live so that unpublishing a profile changes every embed of it, and a `.svg` URL would be served with the long-lived immutable static-image cache instead
    - `default` string, required
    - `paper` string, required
    - `compact` string, required
  - `snippets` object, required: Ready-to-paste embeds linking the badge image to the profile
    - `markdown` string, required
    - `html` string, required

---

[API](https://skmtc.dev/proof/apis/proof-holdings-api.md) · [All operations](https://skmtc.dev/proof/apis/proof-holdings-api/llms.txt) · [OpenAPI document](https://skmtc.dev/proof/apis/proof-holdings-api/revisions/b15f506de696?raw)
