Skip to content

List the canonical tag vocabulary grouped by dimension

GET
/open/v1/tag/canonical
curl --request GET \
--url 'https://api.harperharbor.com/open/v1/tag/canonical?language=zh-Hant' \
--header 'Authorization: Bearer <token>'

Returns the platform’s canonical role tags (the same vocabulary as the in-app tag selector), grouped by dimension in database order, with names localized to language. Mature-only tags are never included on this route. Use the slug/name values when filling roleTag so the card is recognised by rankings and discovery.

language
string
Allowed values: zh-Hant zh-Hans en ja ko

Localization language. Falls back to the language header, then zh-Hant.

language
string

Fallback when the query parameter is absent.

Grouped tags.

Media typeapplication/json
object
language
required

Language the names were localized to.

string
dimensions
required
Array<object>
object
dimension
required

Dimension key (e.g. genre, relationship).

string
tags
required
Array<object>
object
slug
required

Stable tag identifier.

string
name
required

Localized display name.

string
dimension
required
string
visibility
required

Tag visibility class; mature tags are never returned here.

string
Examplegenerated
{
"language": "example",
"dimensions": [
{
"dimension": "example",
"tags": [
{
"slug": "example",
"name": "example",
"dimension": "example",
"visibility": "example"
}
]
}
]
}

unauthorized.

Media typeapplication/json
object
error
required

Error code (snake_case) or, for legacy handlers, a free-text/localized message.

string
message

Human-readable sentence. Present only on middleware errors and /me, /me/wallet.

string
retryable

Whether retrying may succeed. Present only on middleware errors, /me, /me/wallet and service/share routes.

boolean
required_context_tier

Only on a first-turn context_capacity_exceeded: the smallest context tier that fits the whole card with room to talk. Save it as context in player settings and resend. Absent when no tier fits.

integer
>= 1 <= 5
required_context_tokens

The token budget of required_context_tier for the selected model, for display.

integer
constant_lore_trim_fits

Only on a first-turn context_capacity_exceeded: whether saving trimConstantLore=true lets the card play at the current tier. Absent on mid-conversation capacity errors.

boolean
credits_needed

Only on insufficient_credits: the credits this turn needs before it can start. Absent when the refusal came without an estimate.

integer
credits_available

Only on insufficient_credits: the credits the wallet could set aside for it.

integer
Examplegenerated
{
"error": "example",
"message": "example",
"retryable": true,
"required_context_tier": 1,
"required_context_tokens": 1,
"constant_lore_trim_fits": true,
"credits_needed": 1,
"credits_available": 1
}

Database error; retryable: true.

Media typeapplication/json
object
error
required

Error code (snake_case) or, for legacy handlers, a free-text/localized message.

string
message

Human-readable sentence. Present only on middleware errors and /me, /me/wallet.

string
retryable

Whether retrying may succeed. Present only on middleware errors, /me, /me/wallet and service/share routes.

boolean
required_context_tier

Only on a first-turn context_capacity_exceeded: the smallest context tier that fits the whole card with room to talk. Save it as context in player settings and resend. Absent when no tier fits.

integer
>= 1 <= 5
required_context_tokens

The token budget of required_context_tier for the selected model, for display.

integer
constant_lore_trim_fits

Only on a first-turn context_capacity_exceeded: whether saving trimConstantLore=true lets the card play at the current tier. Absent on mid-conversation capacity errors.

boolean
credits_needed

Only on insufficient_credits: the credits this turn needs before it can start. Absent when the refusal came without an estimate.

integer
credits_available

Only on insufficient_credits: the credits the wallet could set aside for it.

integer
Examplegenerated
{
"error": "example",
"message": "example",
"retryable": true,
"required_context_tier": 1,
"required_context_tokens": 1,
"constant_lore_trim_fits": true,
"credits_needed": 1,
"credits_available": 1
}