Skip to content

Model catalog

GET
/open/v1/models
curl --request GET \
--url 'https://api.harperharbor.com/open/v1/models?contextLevel=1' \
--header 'Authorization: Bearer <token>'

Returns configured model groups and current per-tier estimates. Requires chat.play. pendingAgent previews the unsaved mode. Agent estimates are typical/high credits and never a charge cap; use /player/agent-mode for the selected estimate and confirmation decision.

scene
string

story replaces costScore with the story-mode price. Any other value is ignored (no error).

roleId
string format: uuid

Card id; used to read whether agent mode is on for the card (affects billingType, noLimitEligible, noLimitCovered) and to pick per-card price samples.

contextLevel
integer
default: 1 >= 1

Context tier the client intends to use (a contextBudgetOptions[].value); affects noLimitCovered and dynamic price estimates. Invalid/<=0 becomes 1.

pendingAgent
boolean

Read-only preview of the pending Agent selection. True uses token-priced Agent estimates and no unlimited-plan coverage; false previews ordinary mode. Does not save a preference.

Successful response.

Media typeapplication/json
Array<object>
object
group
required

Localized group name.

string
desc
required

Group description (may be empty).

string
families
required
Array<object>
object
family
required

Family name (e.g. a model generation); equals the model name for single-variant models.

string
description
required

Localized description.

string
icon
required

Icon URL/identifier.

string
isMember
required

True if any variant requires membership.

boolean
isSupportMax
required

True if any variant supports MAX output.

boolean
isCacheStable
boolean
supportsMultiPass
boolean
contextBudgetOptions
Array<object>
object
text
required

Label such as 64K.

string
value
required

Tier id to store in role-settings context.

integer
>= 1 <= 5
tokens
required

Context budget in tokens.

integer
badges

Union of variant badges (e.g. new).

Array<string>
thinkingDepthOptions
Array<object>
object
value
required

Value to store in role-settings thinkingDepth (off, high, max, ultra, on depending on the model).

string
label

Literal label when no i18n key exists.

string
labelKey
required

Client i18n key.

string
descriptionKey
string
defaultThinkingDepth
string
bestStatus
required

Best health status among variants (variants without status count as green).

string
Allowed values: green yellow red unknown
freeQuotaRemaining

Remaining free uses for free-tier families; -1 = unlimited.

integer
aaIntelligenceIndex
integer
aaAgenticIndex
integer
usageRank
integer
usageShare
number
usageTotal
integer
variants
required

Sorted by costScore ascending.

Array<object>

One selectable model/lane. Fields marked omitempty in the server are absent when zero/false/empty.

object
name
required

Display name (localized for free-tier slots).

string
value
required

Stable model value to store in selectModel and to query uptime-history with.

string
description
required

Localized description.

string
isMember
required

Requires membership.

boolean
icon
required
string
fast
required

Speed rating.

integer
smart
required

Capability rating.

integer
safe
required

Safety/filter rating.

integer
costScore
required

Points per turn at 1x (story price when scene=story; discounted price during a promotion).

integer
isSupportMax
required

Supports MAX output length.

boolean
maxScore
required

Points per turn with MAX output.

integer
isCacheStable

Uses the cache-stable working-set context mode (affects contextBudgetOptions).

boolean
supportsMultiPass

Agent mode available.

boolean
agentModeCostWarning

Warn before enabling agent mode.

boolean
contextBudgetOptions

Selectable context tiers; store the chosen value in role-settings context.

Array<object>
object
text
required

Label such as 64K.

string
value
required

Tier id to store in role-settings context.

integer
>= 1 <= 5
tokens
required

Context budget in tokens.

integer
badges

Known value: new. Other values unverified.

Array<string>
thinkingDepthOptions

Present only for reasoning models with selectable depth (absent when thinkingControl is none or adaptive).

Array<object>
object
value
required

Value to store in role-settings thinkingDepth (off, high, max, ultra, on depending on the model).

string
label

Literal label when no i18n key exists.

string
labelKey
required

Client i18n key.

string
descriptionKey
string
defaultThinkingDepth
string
thinkingControl

none = no thinking control; toggleable = use thinkingDepthOptions; adaptive = model decides, no control shown.

string
Allowed values: none toggleable adaptive
apiFormat

Upstream protocol; informational.

string
Allowed values: openai anthropic
status
object
status
required

Green = healthy, yellow = degraded/high latency, red = unavailable, unknown = insufficient samples.

string
Allowed values: green yellow red unknown
failureRate
required

Percent 0-100.

number
avgLatencyMs
required
integer format: int64
message
required
string
sampleCount
required
integer format: int64
windowTotalCalls
required
integer
confidence
required
string
Allowed values: none low medium high
latencyBaseline
object
currentAvgMs
required
integer format: int64
baselineAvgMs
required
integer format: int64
ratio
required
number
sampleCount
required
integer
baselineSampleCount
required
integer
signal
required

Same signal scale as the performance metrics (copied from the latency metric).

string
Allowed values: observing normal elevated extreme reduced
performance
object
latencyMs
object
current
required

Current-window median.

number
p90
number
baseline
required
number
ratio
required
number
sampleCount
required
integer
baselineSampleCount
required
integer
signal
required
string
Allowed values: observing normal elevated extreme reduced
firstTokenLatencyMs
object
current
required

Current-window median.

number
p90
number
baseline
required
number
ratio
required
number
sampleCount
required
integer
baselineSampleCount
required
integer
signal
required
string
Allowed values: observing normal elevated extreme reduced
charsPerSecond
object
current
required

Current-window median.

number
p90
number
baseline
required
number
ratio
required
number
sampleCount
required
integer
baselineSampleCount
required
integer
signal
required
string
Allowed values: observing normal elevated extreme reduced
tokensPerSecond
object
current
required

Current-window median.

number
p90
number
baseline
required
number
ratio
required
number
sampleCount
required
integer
baselineSampleCount
required
integer
signal
required
string
Allowed values: observing normal elevated extreme reduced
outputRate
object
current
required

Current-window median.

number
p90
number
baseline
required
number
ratio
required
number
sampleCount
required
integer
baselineSampleCount
required
integer
signal
required
string
Allowed values: observing normal elevated extreme reduced
completionRate
object
current
required

Current-window median.

number
p90
number
baseline
required
number
ratio
required
number
sampleCount
required
integer
baselineSampleCount
required
integer
signal
required
string
Allowed values: observing normal elevated extreme reduced
uptime
object
percent24h
required
number
samples24h
required
integer format: int64
percent72h
required
number
samples72h
required
integer format: int64
evidenceAgeMs

Age of the newest availability evidence.

integer format: int64
probeOnly

Status is based on synthetic probes only.

boolean
family
string
channel

Lane/channel key, e.g. value_based, stable_1, stable_2, default, or a provider lane code.

string
channelLabel

Localized lane label.

string
freeQuotaRemaining

Free-tier remaining uses; -1 = unlimited.

integer
aaIntelligenceIndex
integer
aaAgenticIndex
integer
usageRank
integer
usageShare

Percent.

number
usageTotal
integer
originalCostScore

Pre-discount 1x price (only during a promotion).

integer
originalMaxScore
integer
discountUntilTs

Promotion end, Unix seconds.

integer format: int64
discountReasonKey

I18n key for the promotion label.

string
chatDiscountPercent

Platform chat discount relative to this lane’s normal tier price. Already included in quoted and billed chat rates; do not apply it again. Omitted when not discounted. Independent of upstream discounts and bare API pricing; no scheduled end date.

integer
>= 1 <= 99
providerDiscountPercent

Upstream provider’s current discount in percent (no end date).

integer
laneAutoListed

Lane was auto-generated from the provider roster (clients typically collapse these).

boolean
noLimitEligible

Covered by the unlimited plan in principle (false while agent mode is on for the card).

boolean
noLimitCovered

Covered by the unlimited plan at the requested contextLevel.

boolean
billingType

Present when billed by actual token usage; absent = fixed price.

string
Allowed values: dynamic
estMinScore

Estimated minimum points per turn (dynamic billing).

integer
estMaxScore
integer
estSource

Where the estimate comes from: this card’s samples, global samples, or a formula.

string
Allowed values: role global formula
estSampleCount

0 for formula.

integer
originalCostScore
integer
originalMaxScore
integer
discountUntilTs

Unix seconds.

integer format: int64
discountReasonKey
string
billingType

Present (dynamic) if any variant is dynamically billed.

string
Allowed values: dynamic
estMinScore
integer
estMaxScore
integer
estSource
string
Allowed values: role global formula
estSampleCount
integer
Example
[
{
"families": [
{
"bestStatus": "green",
"variants": [
{
"thinkingControl": "none",
"apiFormat": "openai",
"status": {
"status": "green",
"confidence": "none",
"latencyBaseline": {
"signal": "observing"
},
"performance": {
"latencyMs": {
"signal": "observing"
},
"firstTokenLatencyMs": {
"signal": "observing"
},
"charsPerSecond": {
"signal": "observing"
},
"tokensPerSecond": {
"signal": "observing"
},
"outputRate": {
"signal": "observing"
},
"completionRate": {
"signal": "observing"
}
}
},
"billingType": "dynamic",
"estSource": "role"
}
],
"billingType": "dynamic",
"estSource": "role"
}
]
}
]

Invalid_request

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
}

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
}

Insufficient_scope: requires chat.play

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
}

Not_found: inaccessible resource

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
}

Chat_operation_conflict

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
}

Temporarily_unavailable

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
}