Skip to content

Achievements​

The public badge catalogue, single badges, the "just earned" feed, and individual earned cards with their share pictures and verify QR codes.


Get the badge catalogue​

GET
/achievements

Every badge on the platform with its copy, tier ladder, holder counts and rarity, plus header totals, series and the grid's slots, in the reader's language (?lang=, then Accept-Language, then the i18next cookie). The payload is the same for every reader; a token is accepted and ignored. Cached per language.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)
or

Parameters​

Query Parameters

lang

Reader language; falls back to Accept-Language, then the i18next cookie, then English.

Type
string
Valid values
"en""ru""uk""es"

Responses​

Catalogue (bare object)

application/json
JSON
{
"items": [
],
"totals": {
"achievements": 0,
"earned_total": 0,
"collectors": 0,
"rarest": {
"slug": "string",
"title": "string",
"key": "string",
"label": "string",
"holders": 0
},
"computed_at": "string"
},
"language": "string",
"vocabulary": "string",
"series": [
{
"additionalProperties": "string"
}
],
"slots": [
{
"series_id": "string",
"series_number": 0,
"state": "string",
"slug": "string",
"track": "string"
}
],
"default_series_id": "string"
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Get an achievement art sheet image​

GET
/achievements/art-sheets/{id}

The image of one badge art sheet, served immutably (one year) under its version token ?v=. A request without the current token is redirected (302, uncached) to the current versioned URL. Public.

Parameters​

Path Parameters

id*
Type
string
Required
Format
"uuid"

Query Parameters

size

Anything else is the full sheet.

Type
string
Valid values
"full""small""cutout""cutout_small"
Default
"full"
v

Version token. Cut-out sizes append -c.

Type
string

Responses​

The image (its stored content type)

image/*

Playground​

Server
Variables
Key
Value

Samples​


Get an achievement library image​

GET
/achievements/art-images/{id}

One image from the badge art library, served immutably under its version token ?v=; a request without the current token is redirected (302) to it. Public.

Parameters​

Path Parameters

id*
Type
string
Required

Query Parameters

size
Type
string
Valid values
"full""small"
Default
"full"
v
Type
string

Responses​

The image (its stored content type)

image/*

Playground​

Server
Variables
Key
Value

Samples​


Get the achievement vocabulary​

GET
/achievements/vocabulary

The labels and colours every badge card is drawn with (tiers, tracks, rarity frames and so on), in the reader's language. Public.

Parameters​

Query Parameters

lang

Reader language; falls back to Accept-Language, then the i18next cookie, then English.

Type
string
Valid values
"en""ru""uk""es"

Responses​

Vocabulary

application/json
JSON
{
"vocabulary": "string",
"language": "string"
}

Playground​

Server
Variables
Key
Value

Samples​


Get the "just earned" feed​

GET
/achievements/feed

The most recent cards issued or upgraded, platform-wide or for one badge (species). The size, maximum age and suggested refresh interval come from platform settings. An unknown, hidden or private badge answers an empty list. Public; sent with Cache-Control: no-store.

Parameters​

Query Parameters

species

A badge slug. Repeating the parameter answers an empty list.

Type
string
lang

Reader language; falls back to Accept-Language, then the i18next cookie, then English.

Type
string
Valid values
"en""ru""uk""es"

Responses​

Feed

application/json
JSON
{
"data": [
],
"refresh_seconds": 0
}

Playground​

Server
Variables
Key
Value

Samples​


Get one badge​

GET
/achievements/{slug}

One badge with its copy, ladder and rarity. Authentication is optional: a signed-in reader also gets their own standing (earned, tier, progress). With holder_type and holder_id, the badge is answered for that holder instead (a profile's or organization's badge); both must be given together.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)
or

Parameters​

Path Parameters

slug*
Type
string
Required

Query Parameters

holder_type
Type
string
Valid values
"user""organization"
holder_id
Type
string
Format
"uuid"
lang

Reader language; falls back to Accept-Language, then the i18next cookie, then English.

Type
string
Valid values
"en""ru""uk""es"

Responses​

The badge

application/json
JSON
{
"data": "string",
"vocabulary": "string"
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Get a badge share picture​

GET
/achievements/{slug}/share/{asset}

A PNG of the badge for sharing: og 1200×630, post 1080×1080, story and reel 1080×1920. A trailing .png on asset is accepted. ?tier= draws it at that tier when the tier exists. Drafts and private badges answer 404. Public; cached for 5 minutes.

Parameters​

Path Parameters

slug*
Type
string
Required
asset*
Type
string
Required
Valid values
"og""post""story""reel""og.png""post.png""story.png""reel.png"

Query Parameters

tier
Type
string
lang

Reader language; falls back to Accept-Language, then the i18next cookie, then English.

Type
string
Valid values
"en""ru""uk""es"

Responses​

PNG image

image/png

Playground​

Server
Variables
Key
Value

Samples​


Get an earned card​

GET
/cards/{code}

One earned card by its short code, as the card's public page shows it: the badge, holder, tier, dates, serial, evidence, ladder, rarity, the verify URL and share links. Authentication is optional; the holder's own session adds an owner block. Sent private, no-store.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)
or

Parameters​

Path Parameters

code*

The card's short code.

Type
string
Required

Query Parameters

lang

Reader language; falls back to Accept-Language, then the i18next cookie, then English.

Type
string
Valid values
"en""ru""uk""es"

Responses​

The card

application/json
JSON
{
"data": "string"
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Get an earned card's share picture​

GET
/cards/{code}/share/{asset}

A PNG of one earned card: og 1200×630, post 1080×1080, story 1080×1920 (a trailing .png is accepted). Served only when the card is readable by a stranger. When the card's own picture is not rendered yet, the badge's generic picture is served with X-Card-Render: pending and no-store. Supports If-None-Match (304). Public; a per-IP limit (120 per minute by default) applies in addition to the public browsing limit.

Parameters​

Path Parameters

code*

The card's short code.

Type
string
Required
asset*
Type
string
Required
Valid values
"og""post""story""og.png""post.png""story.png"

Query Parameters

lang
Type
string

Responses​

PNG image. Content-Language names the language it was drawn in.

image/png

Playground​

Server
Variables
Key
Value

Samples​


Get an earned card's verify QR code​

GET
/cards/{code}/qr.svg

An SVG QR code pointing at the card's verify URL. Only for cards readable by a stranger. Public; same per-IP limit as the share pictures. Cached for 60 seconds.

Parameters​

Path Parameters

code*

The card's short code.

Type
string
Required

Responses​

SVG image

image/svg+xml
JSON
"string"

Playground​

Server
Variables
Key
Value

Samples​


Get a profile's achievements​

GET
/users/{id}/achievements

The achievements section of a profile: the badges the person has earned that visitors may see, each with its card, plus a public holder block, a summary counted over the returned rows, the profile's pinned card and the label vocabulary. id is a UUID or a profile slug.

The answer is the same for everyone, the owner included, except that the owner's own rows carry their counts (stats). A private or inactive profile read by anyone but its owner answers { "data": [], "withheld": true, "vocabulary": … }.

Authentication is optional. Rate limited at 300 requests/minute per IP.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)
or

Parameters​

Path Parameters

id*

Profile UUID or profile slug.

Type
string
Required

Query Parameters

lang

Locale for titles and labels; unsupported locales fall back to English.

Type
string

Responses​

The collection, or a withheld answer

application/json
JSON
{
"data": [
],
"withheld": true,
"holder": "string",
"summary": {
"additionalProperties": "string"
},
"pin": "string",
"vocabulary": "string"
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Get my achievements​

GET
/me/achievements

The owner view: every achievement the caller holds — themselves and through organizations they administer — including those set to "only me", with private stats and progress; next_up, the closest badges not yet earned; the caller's pin; and how many new cards are waiting to be revealed.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Query Parameters

lang
Type
string

Responses​

The owner collection

application/json
JSON
{
"data": [
],
"holder": {
"kind": "string",
"first_name": "string",
"short_name": "Vitaliy R.",
"handle": "string",
"profile_path": "string",
"source": "string",
"full_name": "string"
},
"summary": {
"additionalProperties": "string"
},
"next_up": [
{
"additionalProperties": "string"
}
],
"pin": {
"source": "string",
"slug": "string",
"code": "string",
"publicly_readable": true
},
"pin_writable": true,
"unrevealed_count": 0,
"vocabulary": "string"
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Pin an achievement card​

PUT
/me/achievements/pin

Pins one of the caller's own live cards (theirs, or an organization's they administer) to that holder's profile. A malformed, unknown, void or someone else's card all get the same 404 body, so the answer never says whether a code exists. Responses are private, no-store.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
"card_code": "string"
}

Responses​

Pinned

application/json
JSON
{
"data": {
"pin": {
"source": "string",
"slug": "string",
"code": "string",
"publicly_readable": true
}
}
}

Playground​

Server
Authorization
Body

Samples​


Unpin an achievement card​

DELETE
/me/achievements/pin

Clears the caller's pin, or with organization that organization's pin when the caller administers it. Idempotent. The profile then shows the automatic choice.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Query Parameters

organization
Type
string
Format
"uuid"

Responses​

Unpinned

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Get my reveal pack​

GET
/me/achievements/reveals

Cards waiting to be "opened": with receipt, the ones a particular donation earned (the thank-you page — status: pending while the award is still being computed); with all=true, every unrevealed card. Pass exactly one. Someone else's receipt answers like a donation that earned nothing (status: none). Responses are private, no-store.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Query Parameters

receipt

A Stripe PaymentIntent id.

Type
string
Pattern
"^pi_[A-Za-z0-9_]{1,255}$"
all
Type
string
Valid values
"true"

Responses​

The pack

application/json
JSON
{
"data": {
"status": "string",
"events": [
{
"id": 0,
"event_ids": [
0
],
"kind": "string",
"tier": {
"key": "string",
"label": "string"
},
"from_tier": {
"key": "string",
"label": "string"
},
"revealed": true,
"card": {
"additionalProperties": "string"
},
"tierup_line": "string"
}
]
}
}

Playground​

Server
Authorization
Variables
Key
Value

Samples​


Mark reveal events as opened​

POST
/me/achievements/reveals/ack

Marks the caller's own reveal events as revealed. Ids that are not the caller's are ignored silently; the answer is 204 either way.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Request Body​

application/json
JSON
{
"event_ids": [
0
]
}

Responses​

Acknowledged

Playground​

Server
Authorization
Body

Samples​


Set an achievement's visibility​

PATCH
/me/achievements/{slug}

The holder's "Visible to: Everyone / Only me" control for one badge. default follows the badge's own visibility. When the caller wears the badge both personally and through an organization (or through two organizations), holder must say which; otherwise 409 with the list of holders.

Authorizations​

BearerAuth

In the browser, authentication rides on the httpOnly session cookies set by /cognito/signin or the Google / Apple sign-in at /cognito/oauth/{provider}. For scripts and for Swagger UI testing, paste an API key (fh_live_…, created with POST /api-keys); a Cognito JWT is accepted too. Sign-in does not return a token in its body.

Type
HTTP (bearer)

Parameters​

Path Parameters

slug*

The achievement's slug.

Type
string
Required

Request Body​

application/json
JSON
{
"visibility_override": "string",
"holder": {
"type": "string",
"id": "string"
}
}

Responses​

The updated award

application/json
JSON
{
"data": "string"
}

Playground​

Server
Authorization
Variables
Key
Value
Body

Samples​


Powered by VitePress OpenAPI

Built with VitePress