Skip to the content

DocsReference

API reference

Every operation, parameter, answer, error and header.

Tells an app which AI model to call on the providers it has accounts with. /v1 changes are additive only: new fields, parameters and values may appear, so ignore what you do not know.

Base URL: https://rhumbdata.com. Send your key as Authorization: Bearer <key> (or in an X-API-Key header). The machine-readable spec is at /v1/openapi.json.

GET /v1/resolve

Resolve a need to a model

A structured need (a task or purpose, your providers, and constraints) to the model to call, with the same model on your other providers and the next alternatives. shape=team answers models in named roles (team), from a strategy preset or your own roles, under one budget for the whole team; shape=escalation answers an ordered list of steps (escalation), or one model plus the team to escalate to. A team or escalation is one call. Local runtimes (ollama, lmstudio, llama.cpp, mlx, webllm) are providers like any other: send the device's max_memory_gb, max_vram_gb and max_disk_gb with them, and a local answer carries its quantization, license and requirements (memory at the request's context). Local offerings are free, count as the cheap band, and their score has the quantization's penalty taken off. The same answer for the same catalog version, need and shape; cache it. Counted.

Example: GET /v1/resolve?task=text.chat&budget=cheap&providers=gemini,openrouter

Parameters

Parameters of resolve
NameInTypeDescription
providersrequiredquerystringRequired. Provider names you have accounts with, in order of preference for ties. Never keys. Comma-separated.Example: gemini,openrouter
taskquerystringA task, e.g. text.chat. Required unless purpose is given.Example: text.chat
purposequerystringA purpose preset id or alias, e.g. read-receipts.
needsquerystringRequired capabilities, optionally with a level: "input.pdf:native". Comma-separated.
provider_termsquerystringYour terms per provider: "openrouter:byok", "gemini:free_tier", "openai:discount:0.2". Comma-separated.
originquerystringModel maker countries or groups: "us", "eu", "not:cn". Comma-separated.
origin_strictquery"true" | "false"Also require a fine-tune's base model maker to match.
budgetquery"cheap" | "medium" | "premium"Thirds of the market's prices for the task.Example: cheap
max_pricequerystringHard cap on the typical call, in USD, e.g. 0.002.
optimizequery"cost" | "quality" | "value"cost (default), quality or value.
quality_marginquerystringFor optimize=cost: how far below the best score still counts (default 0.05).
input_tokensquerystringExpected input tokens per call.
output_tokensquerystringExpected output tokens per call.
cached_input_tokensquerystringInput tokens served from the provider's cache.
prompt_tokensquerystringPrompt size, for long-prompt price tiers.
imagesquerystringInput images per call.
output_imagesquerystringGenerated images per call.
resolutionquerystringImage resolution key, e.g. "1k".
pagesquerystringPDF pages per call.
audio_secondsquerystringAudio seconds per call.
video_secondsquerystringVideo seconds per call.
min_qualityquerystringMinimum quality score, 0–1.
min_contextquerystringMinimum context window in tokens.
max_memory_gbquerystringLocal runtimes: the device's memory in GB (10^9 bytes). A local offering fits when its weights, KV cache at the request's min_context (8,192 tokens when smaller) and runtime overhead fit. Cloud offerings are not limited.
max_vram_gbquerystringLocal runtimes: GPU memory in GB, for a full offload (unified memory counts as both).
max_disk_gbquerystringLocal runtimes: free disk in GB for the weights.
released_afterquerystringYYYY-MM-DD.
allow_previewquery"true" | "false"Allow preview models (default false).
excludequerystringModel ids, vendors, or provider:model pairs to leave out. Comma-separated.
licensequerystringAccepted open-weight licenses. Comma-separated.
service_tierquery"standard" | "batch" | "flex" | "priority"
currencyquerystringAdds the typical call converted to this currency, e.g. EUR.
shapequery"single" | "team" | "escalation"single (default, or the purpose's), team (with strategy or roles) or escalation (a ladder of length steps, or one model then a team with strategy or roles).
strategyquery"debate" | "red-team" | "competitive" | "hierarchical" | "expert-panel" | "collaborative"A team strategy preset: its roles and their rules.
rolesquerystringTeam roles: "name:count" pairs, comma-separated (lead:1,workers:4), or a JSON object of role name to { count, task, needs, min_quality, optimize, distinct_vendor_from, distinct_family, judges }. Overrides and extends the strategy's roles.
lengthquerystringEscalation steps, 1–5 (default 3).
synthesisquery"true" | "false"Add a synthesizer role to the team.
origin_mixquerystringTeam origin rules: "eu:>=1", "cn:<=0", "us:=2". Comma-separated.
providers_distinctquery"true" | "false"Every team member, or escalation step, on a different provider.

Responses

200body: Resolution

The answer. Counts one call against the quota.

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

400body: Error

invalid_request (an unknown name or a malformed value: field and allowed say which) or key_in_query (keys go in a header, never the URL).

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

invalid_request
{
  "error": {
    "code": "invalid_request",
    "message": "Unknown task \"text.chit\"",
    "field": "task",
    "allowed": [
      "text.chat",
      "text.embed"
    ]
  }
}
key_in_query
{
  "error": {
    "code": "key_in_query",
    "message": "API keys are not accepted in the query string; send them in the Authorization header. Rotate a key that was put in a URL."
  }
}
401body: Error

missing_api_key (no key sent) or invalid_api_key (unknown, disabled, revoked or expired).

missing_api_key
{
  "error": {
    "code": "missing_api_key",
    "message": "Send your API key as `Authorization: Bearer <key>`"
  }
}
invalid_api_key
{
  "error": {
    "code": "invalid_api_key",
    "message": "The API key is not valid"
  }
}
403body: Error

account_suspended; insufficient_scope (the key lacks the scope the endpoint needs: required_scope names it); ip_not_allowed (the key's IP allowlist does not include the caller); wrong_key_kind (a management key, which calls only the key-management API); or (POST /v1/plan) decision_model_not_allowed: decision.model=jev is for internal accounts only.

account_suspended
{
  "error": {
    "code": "account_suspended",
    "message": "This account is suspended"
  }
}
insufficient_scope
{
  "error": {
    "code": "insufficient_scope",
    "message": "This key lacks the `resolve` scope this endpoint needs",
    "required_scope": "resolve"
  }
}
ip_not_allowed
{
  "error": {
    "code": "ip_not_allowed",
    "message": "This key may not be used from this IP address"
  }
}
wrong_key_kind
{
  "error": {
    "code": "wrong_key_kind",
    "message": "Management keys only call the key-management API (/api/v1/manage); use a live or test key here"
  }
}
decision_model_not_allowed
{
  "error": {
    "code": "decision_model_not_allowed",
    "message": "decision.model=jev is available to internal accounts only; use openai or local",
    "field": "decision.model",
    "allowed": [
      "openai",
      "local"
    ]
  }
}
413body: Error

request_too_large: request bodies are limited to 64 KB.

request_too_large
{
  "error": {
    "code": "request_too_large",
    "message": "Request bodies are limited to 64 KB"
  }
}
422body: NoCandidate

no_candidate: nothing on your providers meets the need. Says how many candidates each constraint removed, and the nearest miss. Not counted against the quota.

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

429body: Error

rate_limited (the per-minute rate; Retry-After says when to try again) or quota_exhausted (the period's calls are used up; no Retry-After, resets_at and upgrade_url instead).

Headers: Retry-After, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

rate_limited
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit of 10 requests a minute reached"
  }
}
quota_exhausted
{
  "error": {
    "code": "quota_exhausted",
    "message": "Your plan's 1,000 calls for this period are used up",
    "resets_at": "2026-12-01T00:00:00.000Z",
    "upgrade_url": "https://rhumbdata.com/app/billing"
  }
}

POST /v1/plan

Plan a request from its prompt and tags

Reads a request (a prompt, tags and attachment types) into a need, then resolves it as /v1/resolve does. Facts come first (attachment types set input needs, the prompt's size sets min_context and usage), then tags (a synonym list for origin, budget, capabilities and purpose aliases), then the decision model for the rest; facts and constraints always win over the decision model, and sources says where each part came from. The decision model reads at most the first 4,000 tokens of the prompt within the decision budget (350 ms by default); on a timeout, an error or an invalid answer the local classifier reads it instead and decision.fallback_used is true, so the call never fails because of the decision model. decision.model: openai (default, OpenAI's Decisions API) or local (allow_remote: false also keeps the prompt on the server); test keys always read locally. The prompt is sent only to the decision model you choose and is never stored or logged; readings are cached for 24 hours under a keyed hash. With shape: "auto" the reading chooses the shape: a team (the request's strategy or roles, the purpose's, else red-team for an adversarial request and expert-panel otherwise) when reading.ensemble_helps is true, an escalation when constraints give a length, else one model. Counts as 5 calls against the quota, since each reading calls the decision model; errors and no_candidate are not counted.

Example: POST /v1/plan

Parameters

None.

Responses

200body: PlanResponse

The answer. Counts as 5 calls against the quota.

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

400body: Error

invalid_request (an unknown name or a malformed value: field and allowed say which) or key_in_query (keys go in a header, never the URL).

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

invalid_request
{
  "error": {
    "code": "invalid_request",
    "message": "Unknown task \"text.chit\"",
    "field": "task",
    "allowed": [
      "text.chat",
      "text.embed"
    ]
  }
}
key_in_query
{
  "error": {
    "code": "key_in_query",
    "message": "API keys are not accepted in the query string; send them in the Authorization header. Rotate a key that was put in a URL."
  }
}
401body: Error

missing_api_key (no key sent) or invalid_api_key (unknown, disabled, revoked or expired).

missing_api_key
{
  "error": {
    "code": "missing_api_key",
    "message": "Send your API key as `Authorization: Bearer <key>`"
  }
}
invalid_api_key
{
  "error": {
    "code": "invalid_api_key",
    "message": "The API key is not valid"
  }
}
403body: Error

account_suspended; insufficient_scope (the key lacks the scope the endpoint needs: required_scope names it); ip_not_allowed (the key's IP allowlist does not include the caller); wrong_key_kind (a management key, which calls only the key-management API); or (POST /v1/plan) decision_model_not_allowed: decision.model=jev is for internal accounts only.

account_suspended
{
  "error": {
    "code": "account_suspended",
    "message": "This account is suspended"
  }
}
insufficient_scope
{
  "error": {
    "code": "insufficient_scope",
    "message": "This key lacks the `resolve` scope this endpoint needs",
    "required_scope": "resolve"
  }
}
ip_not_allowed
{
  "error": {
    "code": "ip_not_allowed",
    "message": "This key may not be used from this IP address"
  }
}
wrong_key_kind
{
  "error": {
    "code": "wrong_key_kind",
    "message": "Management keys only call the key-management API (/api/v1/manage); use a live or test key here"
  }
}
decision_model_not_allowed
{
  "error": {
    "code": "decision_model_not_allowed",
    "message": "decision.model=jev is available to internal accounts only; use openai or local",
    "field": "decision.model",
    "allowed": [
      "openai",
      "local"
    ]
  }
}
413body: Error

request_too_large: request bodies are limited to 64 KB.

request_too_large
{
  "error": {
    "code": "request_too_large",
    "message": "Request bodies are limited to 64 KB"
  }
}
422body: NoCandidate

no_candidate: nothing on your providers meets the need. Says how many candidates each constraint removed, and the nearest miss. Not counted against the quota.

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

429body: Error

rate_limited (the per-minute rate; Retry-After says when to try again) or quota_exhausted (the period's calls are used up; no Retry-After, resets_at and upgrade_url instead).

Headers: Retry-After, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

rate_limited
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit of 10 requests a minute reached"
  }
}
quota_exhausted
{
  "error": {
    "code": "quota_exhausted",
    "message": "Your plan's 1,000 calls for this period are used up",
    "resets_at": "2026-12-01T00:00:00.000Z",
    "upgrade_url": "https://rhumbdata.com/app/billing"
  }
}

GET /v1/models

List models

Candidates for a task on given providers, with capabilities, current prices and quality scores. Counted.

Example: GET /v1/models?task=text.chat&providers=openrouter&limit=20

Parameters

Parameters of listModels
NameInTypeDescription
taskquerystringOnly models for this task.Example: text.chat
providersquerystringOnly offerings on these providers. Comma-separated.Example: openrouter
needsquerystringOnly offerings with these capabilities. Comma-separated.
include_retiredquery"true" | "false"Include retired offerings (default false).
limitquerystringPage size, 1–500 (default 100).Example: 20
offsetquerystringModels to skip (default 0).

Responses

200body: ModelsList

The answer. Counts one call against the quota.

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

400body: Error

invalid_request (an unknown name or a malformed value: field and allowed say which) or key_in_query (keys go in a header, never the URL).

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

invalid_request
{
  "error": {
    "code": "invalid_request",
    "message": "Unknown task \"text.chit\"",
    "field": "task",
    "allowed": [
      "text.chat",
      "text.embed"
    ]
  }
}
key_in_query
{
  "error": {
    "code": "key_in_query",
    "message": "API keys are not accepted in the query string; send them in the Authorization header. Rotate a key that was put in a URL."
  }
}
401body: Error

missing_api_key (no key sent) or invalid_api_key (unknown, disabled, revoked or expired).

missing_api_key
{
  "error": {
    "code": "missing_api_key",
    "message": "Send your API key as `Authorization: Bearer <key>`"
  }
}
invalid_api_key
{
  "error": {
    "code": "invalid_api_key",
    "message": "The API key is not valid"
  }
}
403body: Error

account_suspended; insufficient_scope (the key lacks the scope the endpoint needs: required_scope names it); ip_not_allowed (the key's IP allowlist does not include the caller); wrong_key_kind (a management key, which calls only the key-management API); or (POST /v1/plan) decision_model_not_allowed: decision.model=jev is for internal accounts only.

account_suspended
{
  "error": {
    "code": "account_suspended",
    "message": "This account is suspended"
  }
}
insufficient_scope
{
  "error": {
    "code": "insufficient_scope",
    "message": "This key lacks the `resolve` scope this endpoint needs",
    "required_scope": "resolve"
  }
}
ip_not_allowed
{
  "error": {
    "code": "ip_not_allowed",
    "message": "This key may not be used from this IP address"
  }
}
wrong_key_kind
{
  "error": {
    "code": "wrong_key_kind",
    "message": "Management keys only call the key-management API (/api/v1/manage); use a live or test key here"
  }
}
decision_model_not_allowed
{
  "error": {
    "code": "decision_model_not_allowed",
    "message": "decision.model=jev is available to internal accounts only; use openai or local",
    "field": "decision.model",
    "allowed": [
      "openai",
      "local"
    ]
  }
}
413body: Error

request_too_large: request bodies are limited to 64 KB.

request_too_large
{
  "error": {
    "code": "request_too_large",
    "message": "Request bodies are limited to 64 KB"
  }
}
429body: Error

rate_limited (the per-minute rate; Retry-After says when to try again) or quota_exhausted (the period's calls are used up; no Retry-After, resets_at and upgrade_url instead).

Headers: Retry-After, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

rate_limited
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit of 10 requests a minute reached"
  }
}
quota_exhausted
{
  "error": {
    "code": "quota_exhausted",
    "message": "Your plan's 1,000 calls for this period are used up",
    "resets_at": "2026-12-01T00:00:00.000Z",
    "upgrade_url": "https://rhumbdata.com/app/billing"
  }
}

GET /v1/models/{vendor}/{model}

Get one model

One model with every offering and its price revisions; provider and at give one offering's price in force at a time. Counted.

Example: GET /v1/models/google/gemini-3.5-flash-lite?provider=gemini&at=2026-06-01

Parameters

Parameters of getModel
NameInTypeDescription
vendorrequiredpathstringThe model maker, e.g. google.Example: google
modelrequiredpathstringThe model name, e.g. gemini-3.5-flash-lite.Example: gemini-3.5-flash-lite
providerquerystringOnly this provider's offering.Example: gemini
atquerystringISO date or time: return the price revision in force then.Example: 2026-06-01

Responses

200body: ModelDetail

The answer. Counts one call against the quota.

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

400body: Error

invalid_request (an unknown name or a malformed value: field and allowed say which) or key_in_query (keys go in a header, never the URL).

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

invalid_request
{
  "error": {
    "code": "invalid_request",
    "message": "Unknown task \"text.chit\"",
    "field": "task",
    "allowed": [
      "text.chat",
      "text.embed"
    ]
  }
}
key_in_query
{
  "error": {
    "code": "key_in_query",
    "message": "API keys are not accepted in the query string; send them in the Authorization header. Rotate a key that was put in a URL."
  }
}
401body: Error

missing_api_key (no key sent) or invalid_api_key (unknown, disabled, revoked or expired).

missing_api_key
{
  "error": {
    "code": "missing_api_key",
    "message": "Send your API key as `Authorization: Bearer <key>`"
  }
}
invalid_api_key
{
  "error": {
    "code": "invalid_api_key",
    "message": "The API key is not valid"
  }
}
403body: Error

account_suspended; insufficient_scope (the key lacks the scope the endpoint needs: required_scope names it); ip_not_allowed (the key's IP allowlist does not include the caller); wrong_key_kind (a management key, which calls only the key-management API); or (POST /v1/plan) decision_model_not_allowed: decision.model=jev is for internal accounts only.

account_suspended
{
  "error": {
    "code": "account_suspended",
    "message": "This account is suspended"
  }
}
insufficient_scope
{
  "error": {
    "code": "insufficient_scope",
    "message": "This key lacks the `resolve` scope this endpoint needs",
    "required_scope": "resolve"
  }
}
ip_not_allowed
{
  "error": {
    "code": "ip_not_allowed",
    "message": "This key may not be used from this IP address"
  }
}
wrong_key_kind
{
  "error": {
    "code": "wrong_key_kind",
    "message": "Management keys only call the key-management API (/api/v1/manage); use a live or test key here"
  }
}
decision_model_not_allowed
{
  "error": {
    "code": "decision_model_not_allowed",
    "message": "decision.model=jev is available to internal accounts only; use openai or local",
    "field": "decision.model",
    "allowed": [
      "openai",
      "local"
    ]
  }
}
404body: Error

model_not_found: no model with that id or alias.

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

model_not_found
{
  "error": {
    "code": "model_not_found",
    "message": "No model google/nope",
    "field": "id"
  }
}
413body: Error

request_too_large: request bodies are limited to 64 KB.

request_too_large
{
  "error": {
    "code": "request_too_large",
    "message": "Request bodies are limited to 64 KB"
  }
}
429body: Error

rate_limited (the per-minute rate; Retry-After says when to try again) or quota_exhausted (the period's calls are used up; no Retry-After, resets_at and upgrade_url instead).

Headers: Retry-After, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

rate_limited
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit of 10 requests a minute reached"
  }
}
quota_exhausted
{
  "error": {
    "code": "quota_exhausted",
    "message": "Your plan's 1,000 calls for this period are used up",
    "resets_at": "2026-12-01T00:00:00.000Z",
    "upgrade_url": "https://rhumbdata.com/app/billing"
  }
}

GET /v1/purposes

List purpose presets

Purpose presets usable as purpose in /v1/resolve. Free.

Example: GET /v1/purposes

Parameters

None.

Responses

200body: PurposesList

The answer. Not counted against the quota.

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

400body: Error

invalid_request (an unknown name or a malformed value: field and allowed say which) or key_in_query (keys go in a header, never the URL).

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

invalid_request
{
  "error": {
    "code": "invalid_request",
    "message": "Unknown task \"text.chit\"",
    "field": "task",
    "allowed": [
      "text.chat",
      "text.embed"
    ]
  }
}
key_in_query
{
  "error": {
    "code": "key_in_query",
    "message": "API keys are not accepted in the query string; send them in the Authorization header. Rotate a key that was put in a URL."
  }
}
401body: Error

missing_api_key (no key sent) or invalid_api_key (unknown, disabled, revoked or expired).

missing_api_key
{
  "error": {
    "code": "missing_api_key",
    "message": "Send your API key as `Authorization: Bearer <key>`"
  }
}
invalid_api_key
{
  "error": {
    "code": "invalid_api_key",
    "message": "The API key is not valid"
  }
}
403body: Error

account_suspended; insufficient_scope (the key lacks the scope the endpoint needs: required_scope names it); ip_not_allowed (the key's IP allowlist does not include the caller); wrong_key_kind (a management key, which calls only the key-management API); or (POST /v1/plan) decision_model_not_allowed: decision.model=jev is for internal accounts only.

account_suspended
{
  "error": {
    "code": "account_suspended",
    "message": "This account is suspended"
  }
}
insufficient_scope
{
  "error": {
    "code": "insufficient_scope",
    "message": "This key lacks the `resolve` scope this endpoint needs",
    "required_scope": "resolve"
  }
}
ip_not_allowed
{
  "error": {
    "code": "ip_not_allowed",
    "message": "This key may not be used from this IP address"
  }
}
wrong_key_kind
{
  "error": {
    "code": "wrong_key_kind",
    "message": "Management keys only call the key-management API (/api/v1/manage); use a live or test key here"
  }
}
decision_model_not_allowed
{
  "error": {
    "code": "decision_model_not_allowed",
    "message": "decision.model=jev is available to internal accounts only; use openai or local",
    "field": "decision.model",
    "allowed": [
      "openai",
      "local"
    ]
  }
}
413body: Error

request_too_large: request bodies are limited to 64 KB.

request_too_large
{
  "error": {
    "code": "request_too_large",
    "message": "Request bodies are limited to 64 KB"
  }
}
429body: Error

rate_limited (the per-minute rate; Retry-After says when to try again) or quota_exhausted (the period's calls are used up; no Retry-After, resets_at and upgrade_url instead).

Headers: Retry-After, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

rate_limited
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit of 10 requests a minute reached"
  }
}
quota_exhausted
{
  "error": {
    "code": "quota_exhausted",
    "message": "Your plan's 1,000 calls for this period are used up",
    "resets_at": "2026-12-01T00:00:00.000Z",
    "upgrade_url": "https://rhumbdata.com/app/billing"
  }
}

GET /v1/vocabulary

Get the vocabulary

The task, capability, level, provider, origin, budget, optimize and service tier names. Free.

Example: GET /v1/vocabulary

Parameters

None.

Responses

200body: Vocabulary

The answer. Not counted against the quota.

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

400body: Error

invalid_request (an unknown name or a malformed value: field and allowed say which) or key_in_query (keys go in a header, never the URL).

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

invalid_request
{
  "error": {
    "code": "invalid_request",
    "message": "Unknown task \"text.chit\"",
    "field": "task",
    "allowed": [
      "text.chat",
      "text.embed"
    ]
  }
}
key_in_query
{
  "error": {
    "code": "key_in_query",
    "message": "API keys are not accepted in the query string; send them in the Authorization header. Rotate a key that was put in a URL."
  }
}
401body: Error

missing_api_key (no key sent) or invalid_api_key (unknown, disabled, revoked or expired).

missing_api_key
{
  "error": {
    "code": "missing_api_key",
    "message": "Send your API key as `Authorization: Bearer <key>`"
  }
}
invalid_api_key
{
  "error": {
    "code": "invalid_api_key",
    "message": "The API key is not valid"
  }
}
403body: Error

account_suspended; insufficient_scope (the key lacks the scope the endpoint needs: required_scope names it); ip_not_allowed (the key's IP allowlist does not include the caller); wrong_key_kind (a management key, which calls only the key-management API); or (POST /v1/plan) decision_model_not_allowed: decision.model=jev is for internal accounts only.

account_suspended
{
  "error": {
    "code": "account_suspended",
    "message": "This account is suspended"
  }
}
insufficient_scope
{
  "error": {
    "code": "insufficient_scope",
    "message": "This key lacks the `resolve` scope this endpoint needs",
    "required_scope": "resolve"
  }
}
ip_not_allowed
{
  "error": {
    "code": "ip_not_allowed",
    "message": "This key may not be used from this IP address"
  }
}
wrong_key_kind
{
  "error": {
    "code": "wrong_key_kind",
    "message": "Management keys only call the key-management API (/api/v1/manage); use a live or test key here"
  }
}
decision_model_not_allowed
{
  "error": {
    "code": "decision_model_not_allowed",
    "message": "decision.model=jev is available to internal accounts only; use openai or local",
    "field": "decision.model",
    "allowed": [
      "openai",
      "local"
    ]
  }
}
413body: Error

request_too_large: request bodies are limited to 64 KB.

request_too_large
{
  "error": {
    "code": "request_too_large",
    "message": "Request bodies are limited to 64 KB"
  }
}
429body: Error

rate_limited (the per-minute rate; Retry-After says when to try again) or quota_exhausted (the period's calls are used up; no Retry-After, resets_at and upgrade_url instead).

Headers: Retry-After, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

rate_limited
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit of 10 requests a minute reached"
  }
}
quota_exhausted
{
  "error": {
    "code": "quota_exhausted",
    "message": "Your plan's 1,000 calls for this period are used up",
    "resets_at": "2026-12-01T00:00:00.000Z",
    "upgrade_url": "https://rhumbdata.com/app/billing"
  }
}

GET /v1/licenses

Get data licenses

The data sources behind the catalog and the notices to show with their data. Free.

Example: GET /v1/licenses

Parameters

None.

Responses

200body: Licenses

The answer. Not counted against the quota.

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

400body: Error

invalid_request (an unknown name or a malformed value: field and allowed say which) or key_in_query (keys go in a header, never the URL).

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

invalid_request
{
  "error": {
    "code": "invalid_request",
    "message": "Unknown task \"text.chit\"",
    "field": "task",
    "allowed": [
      "text.chat",
      "text.embed"
    ]
  }
}
key_in_query
{
  "error": {
    "code": "key_in_query",
    "message": "API keys are not accepted in the query string; send them in the Authorization header. Rotate a key that was put in a URL."
  }
}
401body: Error

missing_api_key (no key sent) or invalid_api_key (unknown, disabled, revoked or expired).

missing_api_key
{
  "error": {
    "code": "missing_api_key",
    "message": "Send your API key as `Authorization: Bearer <key>`"
  }
}
invalid_api_key
{
  "error": {
    "code": "invalid_api_key",
    "message": "The API key is not valid"
  }
}
403body: Error

account_suspended; insufficient_scope (the key lacks the scope the endpoint needs: required_scope names it); ip_not_allowed (the key's IP allowlist does not include the caller); wrong_key_kind (a management key, which calls only the key-management API); or (POST /v1/plan) decision_model_not_allowed: decision.model=jev is for internal accounts only.

account_suspended
{
  "error": {
    "code": "account_suspended",
    "message": "This account is suspended"
  }
}
insufficient_scope
{
  "error": {
    "code": "insufficient_scope",
    "message": "This key lacks the `resolve` scope this endpoint needs",
    "required_scope": "resolve"
  }
}
ip_not_allowed
{
  "error": {
    "code": "ip_not_allowed",
    "message": "This key may not be used from this IP address"
  }
}
wrong_key_kind
{
  "error": {
    "code": "wrong_key_kind",
    "message": "Management keys only call the key-management API (/api/v1/manage); use a live or test key here"
  }
}
decision_model_not_allowed
{
  "error": {
    "code": "decision_model_not_allowed",
    "message": "decision.model=jev is available to internal accounts only; use openai or local",
    "field": "decision.model",
    "allowed": [
      "openai",
      "local"
    ]
  }
}
413body: Error

request_too_large: request bodies are limited to 64 KB.

request_too_large
{
  "error": {
    "code": "request_too_large",
    "message": "Request bodies are limited to 64 KB"
  }
}
429body: Error

rate_limited (the per-minute rate; Retry-After says when to try again) or quota_exhausted (the period's calls are used up; no Retry-After, resets_at and upgrade_url instead).

Headers: Retry-After, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

rate_limited
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit of 10 requests a minute reached"
  }
}
quota_exhausted
{
  "error": {
    "code": "quota_exhausted",
    "message": "Your plan's 1,000 calls for this period are used up",
    "resets_at": "2026-12-01T00:00:00.000Z",
    "upgrade_url": "https://rhumbdata.com/app/billing"
  }
}

GET /v1/key

Get the calling key

The calling key's own id, kind, project, scopes and monthly cap, its per-minute rate, the account's quota and calls this period (a day for test keys), and its calls against its own cap. Needs the usage:read scope. Free.

Example: GET /v1/key

Parameters

None.

Responses

200body: KeyInfo

The answer. Not counted against the quota.

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

400body: Error

invalid_request (an unknown name or a malformed value: field and allowed say which) or key_in_query (keys go in a header, never the URL).

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

invalid_request
{
  "error": {
    "code": "invalid_request",
    "message": "Unknown task \"text.chit\"",
    "field": "task",
    "allowed": [
      "text.chat",
      "text.embed"
    ]
  }
}
key_in_query
{
  "error": {
    "code": "key_in_query",
    "message": "API keys are not accepted in the query string; send them in the Authorization header. Rotate a key that was put in a URL."
  }
}
401body: Error

missing_api_key (no key sent) or invalid_api_key (unknown, disabled, revoked or expired).

missing_api_key
{
  "error": {
    "code": "missing_api_key",
    "message": "Send your API key as `Authorization: Bearer <key>`"
  }
}
invalid_api_key
{
  "error": {
    "code": "invalid_api_key",
    "message": "The API key is not valid"
  }
}
403body: Error

account_suspended; insufficient_scope (the key lacks the scope the endpoint needs: required_scope names it); ip_not_allowed (the key's IP allowlist does not include the caller); wrong_key_kind (a management key, which calls only the key-management API); or (POST /v1/plan) decision_model_not_allowed: decision.model=jev is for internal accounts only.

account_suspended
{
  "error": {
    "code": "account_suspended",
    "message": "This account is suspended"
  }
}
insufficient_scope
{
  "error": {
    "code": "insufficient_scope",
    "message": "This key lacks the `resolve` scope this endpoint needs",
    "required_scope": "resolve"
  }
}
ip_not_allowed
{
  "error": {
    "code": "ip_not_allowed",
    "message": "This key may not be used from this IP address"
  }
}
wrong_key_kind
{
  "error": {
    "code": "wrong_key_kind",
    "message": "Management keys only call the key-management API (/api/v1/manage); use a live or test key here"
  }
}
decision_model_not_allowed
{
  "error": {
    "code": "decision_model_not_allowed",
    "message": "decision.model=jev is available to internal accounts only; use openai or local",
    "field": "decision.model",
    "allowed": [
      "openai",
      "local"
    ]
  }
}
413body: Error

request_too_large: request bodies are limited to 64 KB.

request_too_large
{
  "error": {
    "code": "request_too_large",
    "message": "Request bodies are limited to 64 KB"
  }
}
429body: Error

rate_limited (the per-minute rate; Retry-After says when to try again) or quota_exhausted (the period's calls are used up; no Retry-After, resets_at and upgrade_url instead).

Headers: Retry-After, RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, X-Quota-Limit, X-Quota-Remaining, X-Quota-Reset, X-Overage-Used, X-Overage-Limit

rate_limited
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit of 10 requests a minute reached"
  }
}
quota_exhausted
{
  "error": {
    "code": "quota_exhausted",
    "message": "Your plan's 1,000 calls for this period are used up",
    "resets_at": "2026-12-01T00:00:00.000Z",
    "upgrade_url": "https://rhumbdata.com/app/billing"
  }
}

GET /v1/healthNo key

Health check

Whether the service is up, and the catalog's version and age. No key needed; not counted. Always 200 while the service answers: status is degraded when the catalog is older than 48 hours.

Parameters

None.

Responses

200body: Health

The service is up (status ok or degraded).

Answer schemas

Resolution
Resolution (JSON Schema)
{
  "type": "object",
  "properties": {
    "shape": {
      "type": "string",
      "enum": [
        "single",
        "team",
        "escalation"
      ],
      "description": "single: `model`. team: `team`, with `model` its first role's first member. escalation: `escalation`, with `model` its first step."
    },
    "catalog_version": {
      "type": "string"
    },
    "need": {
      "type": "object",
      "properties": {
        "task": {
          "type": "string"
        },
        "purpose": {
          "type": "string"
        },
        "needs": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "capability": {
                "type": "string"
              },
              "level": {
                "type": "string"
              }
            },
            "required": [
              "capability",
              "level"
            ]
          }
        },
        "providers": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "provider_terms": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string"
                }
              },
              "required": [
                "kind"
              ],
              "additionalProperties": {}
            }
          }
        },
        "origin": {
          "type": "object",
          "properties": {
            "include": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "exclude": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "strict": {
              "type": "boolean"
            }
          },
          "required": [
            "include",
            "exclude",
            "strict"
          ]
        },
        "budget": {
          "type": "string"
        },
        "max_price": {
          "type": "string"
        },
        "optimize": {
          "type": "string"
        },
        "quality_margin": {
          "type": "number"
        },
        "usage": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": [
              "number",
              "string"
            ]
          }
        },
        "allow_preview": {
          "type": "boolean"
        },
        "exclude": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "service_tier": {
          "type": "string"
        },
        "currency": {
          "type": "string"
        }
      },
      "required": [
        "task",
        "needs",
        "providers",
        "provider_terms",
        "optimize",
        "quality_margin",
        "usage",
        "allow_preview",
        "exclude",
        "service_tier"
      ],
      "additionalProperties": {}
    },
    "model": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "Canonical model id, vendor/model."
        },
        "vendor": {
          "type": "string"
        },
        "origin": {
          "type": "string"
        },
        "provider": {
          "type": "string"
        },
        "provider_model_id": {
          "type": "string",
          "description": "Use this as the model name in the provider's API."
        },
        "status": {
          "type": "string",
          "enum": [
            "preview",
            "ga",
            "deprecated",
            "retired"
          ]
        },
        "released": {
          "type": "string"
        },
        "capabilities": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "object",
            "properties": {
              "level": {
                "type": "string",
                "enum": [
                  "claimed",
                  "parsed",
                  "native",
                  "probed"
                ]
              },
              "probed_on": {
                "type": "string"
              },
              "efforts": {
                "description": "Reasoning effort levels the offering accepts, for reasoning.",
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "level"
            ]
          }
        },
        "limits": {
          "type": "object",
          "properties": {
            "context": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            "max_input": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            "max_output": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            "dimensions": {
              "description": "Embedding vector length, as a probe measured it.",
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            }
          }
        },
        "price": {
          "type": "object",
          "properties": {
            "currency": {
              "type": "string"
            },
            "per_1m": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {
                "type": "string",
                "description": "A decimal number as a string; never a float."
              }
            },
            "typical_call": {
              "type": "string",
              "description": "USD, after fees and your provider_terms."
            },
            "converted": {
              "type": "object",
              "properties": {
                "currency": {
                  "type": "string"
                },
                "typical_call": {
                  "type": "string",
                  "description": "A decimal number as a string; never a float."
                }
              },
              "required": [
                "currency",
                "typical_call"
              ]
            },
            "unverified": {
              "type": "boolean"
            }
          },
          "required": [
            "currency",
            "per_1m",
            "typical_call"
          ]
        },
        "quality": {
          "type": "object",
          "properties": {
            "score": {
              "type": "number"
            },
            "basis": {
              "type": "string",
              "description": "<source>:<signal>, or curated."
            },
            "measured_on": {
              "type": "string"
            },
            "attribution": {
              "type": "string",
              "description": "Show this wherever the score is shown."
            },
            "kind": {
              "type": "string",
              "enum": [
                "measured",
                "estimated"
              ]
            },
            "quantization_penalty": {
              "type": "number",
              "description": "Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."
            }
          },
          "required": [
            "score",
            "basis",
            "measured_on",
            "attribution",
            "kind"
          ]
        },
        "routing": {
          "description": "Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.",
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          }
        },
        "quantization": {
          "type": "string",
          "description": "Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."
        },
        "parameters_b": {
          "type": "number",
          "description": "Local runtimes: parameters, in billions."
        },
        "requirements": {
          "type": "object",
          "properties": {
            "memory_gb": {
              "type": "number",
              "description": "Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."
            },
            "vram_gb": {
              "type": "number",
              "description": "GPU memory for a full offload, at the same context."
            },
            "disk_gb": {
              "type": "number",
              "description": "The weights' download size."
            },
            "context_for_memory": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991,
              "description": "The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."
            },
            "kv_bytes_per_token": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991,
              "description": "KV cache bytes per further token of context."
            },
            "low_resource": {
              "type": "boolean",
              "description": "WebLLM: runs on low-resource devices."
            }
          },
          "required": [
            "memory_gb",
            "context_for_memory"
          ],
          "description": "Local runtimes: what the device needs."
        },
        "license": {
          "type": "string",
          "description": "Local runtimes: the weights' license, e.g. \"apache-2.0\"."
        }
      },
      "required": [
        "id",
        "vendor",
        "provider",
        "provider_model_id",
        "status",
        "capabilities",
        "limits"
      ]
    },
    "also_on": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string"
          },
          "provider_model_id": {
            "type": "string"
          },
          "typical_call": {
            "type": "string",
            "description": "A decimal number as a string; never a float."
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "provider",
          "provider_model_id"
        ]
      }
    },
    "alternatives": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Canonical model id, vendor/model."
          },
          "vendor": {
            "type": "string"
          },
          "origin": {
            "type": "string"
          },
          "provider": {
            "type": "string"
          },
          "provider_model_id": {
            "type": "string",
            "description": "Use this as the model name in the provider's API."
          },
          "status": {
            "type": "string",
            "enum": [
              "preview",
              "ga",
              "deprecated",
              "retired"
            ]
          },
          "released": {
            "type": "string"
          },
          "capabilities": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "object",
              "properties": {
                "level": {
                  "type": "string",
                  "enum": [
                    "claimed",
                    "parsed",
                    "native",
                    "probed"
                  ]
                },
                "probed_on": {
                  "type": "string"
                },
                "efforts": {
                  "description": "Reasoning effort levels the offering accepts, for reasoning.",
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "level"
              ]
            }
          },
          "limits": {
            "type": "object",
            "properties": {
              "context": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "max_input": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "max_output": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "dimensions": {
                "description": "Embedding vector length, as a probe measured it.",
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              }
            }
          },
          "price": {
            "type": "object",
            "properties": {
              "currency": {
                "type": "string"
              },
              "per_1m": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string",
                  "description": "A decimal number as a string; never a float."
                }
              },
              "typical_call": {
                "type": "string",
                "description": "USD, after fees and your provider_terms."
              },
              "converted": {
                "type": "object",
                "properties": {
                  "currency": {
                    "type": "string"
                  },
                  "typical_call": {
                    "type": "string",
                    "description": "A decimal number as a string; never a float."
                  }
                },
                "required": [
                  "currency",
                  "typical_call"
                ]
              },
              "unverified": {
                "type": "boolean"
              }
            },
            "required": [
              "currency",
              "per_1m",
              "typical_call"
            ]
          },
          "quality": {
            "type": "object",
            "properties": {
              "score": {
                "type": "number"
              },
              "basis": {
                "type": "string",
                "description": "<source>:<signal>, or curated."
              },
              "measured_on": {
                "type": "string"
              },
              "attribution": {
                "type": "string",
                "description": "Show this wherever the score is shown."
              },
              "kind": {
                "type": "string",
                "enum": [
                  "measured",
                  "estimated"
                ]
              },
              "quantization_penalty": {
                "type": "number",
                "description": "Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."
              }
            },
            "required": [
              "score",
              "basis",
              "measured_on",
              "attribution",
              "kind"
            ]
          },
          "routing": {
            "description": "Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          },
          "quantization": {
            "type": "string",
            "description": "Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."
          },
          "parameters_b": {
            "type": "number",
            "description": "Local runtimes: parameters, in billions."
          },
          "requirements": {
            "type": "object",
            "properties": {
              "memory_gb": {
                "type": "number",
                "description": "Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."
              },
              "vram_gb": {
                "type": "number",
                "description": "GPU memory for a full offload, at the same context."
              },
              "disk_gb": {
                "type": "number",
                "description": "The weights' download size."
              },
              "context_for_memory": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991,
                "description": "The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."
              },
              "kv_bytes_per_token": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991,
                "description": "KV cache bytes per further token of context."
              },
              "low_resource": {
                "type": "boolean",
                "description": "WebLLM: runs on low-resource devices."
              }
            },
            "required": [
              "memory_gb",
              "context_for_memory"
            ],
            "description": "Local runtimes: what the device needs."
          },
          "license": {
            "type": "string",
            "description": "Local runtimes: the weights' license, e.g. \"apache-2.0\"."
          }
        },
        "required": [
          "id",
          "vendor",
          "provider",
          "provider_model_id",
          "status",
          "capabilities",
          "limits"
        ]
      }
    },
    "reason": {
      "type": "string"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          }
        },
        "required": [
          "code"
        ],
        "additionalProperties": {}
      }
    },
    "team": {
      "type": "object",
      "properties": {
        "strategy": {
          "type": "string"
        },
        "roles": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "object",
            "properties": {
              "task": {
                "type": "string"
              },
              "members": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "description": "Canonical model id, vendor/model."
                    },
                    "vendor": {
                      "type": "string"
                    },
                    "origin": {
                      "type": "string"
                    },
                    "provider": {
                      "type": "string"
                    },
                    "provider_model_id": {
                      "type": "string",
                      "description": "Use this as the model name in the provider's API."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "preview",
                        "ga",
                        "deprecated",
                        "retired"
                      ]
                    },
                    "released": {
                      "type": "string"
                    },
                    "capabilities": {
                      "type": "object",
                      "propertyNames": {
                        "type": "string"
                      },
                      "additionalProperties": {
                        "type": "object",
                        "properties": {
                          "level": {
                            "type": "string",
                            "enum": [
                              "claimed",
                              "parsed",
                              "native",
                              "probed"
                            ]
                          },
                          "probed_on": {
                            "type": "string"
                          },
                          "efforts": {
                            "description": "Reasoning effort levels the offering accepts, for reasoning.",
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "required": [
                          "level"
                        ]
                      }
                    },
                    "limits": {
                      "type": "object",
                      "properties": {
                        "context": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "max_input": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "max_output": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "dimensions": {
                          "description": "Embedding vector length, as a probe measured it.",
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        }
                      }
                    },
                    "price": {
                      "type": "object",
                      "properties": {
                        "currency": {
                          "type": "string"
                        },
                        "per_1m": {
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {
                            "type": "string",
                            "description": "A decimal number as a string; never a float."
                          }
                        },
                        "typical_call": {
                          "type": "string",
                          "description": "USD, after fees and your provider_terms."
                        },
                        "converted": {
                          "type": "object",
                          "properties": {
                            "currency": {
                              "type": "string"
                            },
                            "typical_call": {
                              "type": "string",
                              "description": "A decimal number as a string; never a float."
                            }
                          },
                          "required": [
                            "currency",
                            "typical_call"
                          ]
                        },
                        "unverified": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "currency",
                        "per_1m",
                        "typical_call"
                      ]
                    },
                    "quality": {
                      "type": "object",
                      "properties": {
                        "score": {
                          "type": "number"
                        },
                        "basis": {
                          "type": "string",
                          "description": "<source>:<signal>, or curated."
                        },
                        "measured_on": {
                          "type": "string"
                        },
                        "attribution": {
                          "type": "string",
                          "description": "Show this wherever the score is shown."
                        },
                        "kind": {
                          "type": "string",
                          "enum": [
                            "measured",
                            "estimated"
                          ]
                        },
                        "quantization_penalty": {
                          "type": "number",
                          "description": "Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."
                        }
                      },
                      "required": [
                        "score",
                        "basis",
                        "measured_on",
                        "attribution",
                        "kind"
                      ]
                    },
                    "routing": {
                      "description": "Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.",
                      "type": "object",
                      "propertyNames": {
                        "type": "string"
                      },
                      "additionalProperties": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {}
                      }
                    },
                    "quantization": {
                      "type": "string",
                      "description": "Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."
                    },
                    "parameters_b": {
                      "type": "number",
                      "description": "Local runtimes: parameters, in billions."
                    },
                    "requirements": {
                      "type": "object",
                      "properties": {
                        "memory_gb": {
                          "type": "number",
                          "description": "Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."
                        },
                        "vram_gb": {
                          "type": "number",
                          "description": "GPU memory for a full offload, at the same context."
                        },
                        "disk_gb": {
                          "type": "number",
                          "description": "The weights' download size."
                        },
                        "context_for_memory": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991,
                          "description": "The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."
                        },
                        "kv_bytes_per_token": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991,
                          "description": "KV cache bytes per further token of context."
                        },
                        "low_resource": {
                          "type": "boolean",
                          "description": "WebLLM: runs on low-resource devices."
                        }
                      },
                      "required": [
                        "memory_gb",
                        "context_for_memory"
                      ],
                      "description": "Local runtimes: what the device needs."
                    },
                    "license": {
                      "type": "string",
                      "description": "Local runtimes: the weights' license, e.g. \"apache-2.0\"."
                    }
                  },
                  "required": [
                    "id",
                    "vendor",
                    "provider",
                    "provider_model_id",
                    "status",
                    "capabilities",
                    "limits"
                  ]
                }
              }
            },
            "required": [
              "task",
              "members"
            ]
          },
          "description": "Role name → its task and members, in the roles' order."
        },
        "typical_call": {
          "type": "string",
          "description": "The whole team's typical call in USD, when every member is priced."
        }
      },
      "required": [
        "roles"
      ],
      "description": "shape=team: the members by role."
    },
    "escalation": {
      "type": "object",
      "properties": {
        "steps": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Canonical model id, vendor/model."
              },
              "vendor": {
                "type": "string"
              },
              "origin": {
                "type": "string"
              },
              "provider": {
                "type": "string"
              },
              "provider_model_id": {
                "type": "string",
                "description": "Use this as the model name in the provider's API."
              },
              "status": {
                "type": "string",
                "enum": [
                  "preview",
                  "ga",
                  "deprecated",
                  "retired"
                ]
              },
              "released": {
                "type": "string"
              },
              "capabilities": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "level": {
                      "type": "string",
                      "enum": [
                        "claimed",
                        "parsed",
                        "native",
                        "probed"
                      ]
                    },
                    "probed_on": {
                      "type": "string"
                    },
                    "efforts": {
                      "description": "Reasoning effort levels the offering accepts, for reasoning.",
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "level"
                  ]
                }
              },
              "limits": {
                "type": "object",
                "properties": {
                  "context": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "max_input": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "max_output": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "dimensions": {
                    "description": "Embedding vector length, as a probe measured it.",
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  }
                }
              },
              "price": {
                "type": "object",
                "properties": {
                  "currency": {
                    "type": "string"
                  },
                  "per_1m": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "string",
                      "description": "A decimal number as a string; never a float."
                    }
                  },
                  "typical_call": {
                    "type": "string",
                    "description": "USD, after fees and your provider_terms."
                  },
                  "converted": {
                    "type": "object",
                    "properties": {
                      "currency": {
                        "type": "string"
                      },
                      "typical_call": {
                        "type": "string",
                        "description": "A decimal number as a string; never a float."
                      }
                    },
                    "required": [
                      "currency",
                      "typical_call"
                    ]
                  },
                  "unverified": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "currency",
                  "per_1m",
                  "typical_call"
                ]
              },
              "quality": {
                "type": "object",
                "properties": {
                  "score": {
                    "type": "number"
                  },
                  "basis": {
                    "type": "string",
                    "description": "<source>:<signal>, or curated."
                  },
                  "measured_on": {
                    "type": "string"
                  },
                  "attribution": {
                    "type": "string",
                    "description": "Show this wherever the score is shown."
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "measured",
                      "estimated"
                    ]
                  },
                  "quantization_penalty": {
                    "type": "number",
                    "description": "Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."
                  }
                },
                "required": [
                  "score",
                  "basis",
                  "measured_on",
                  "attribution",
                  "kind"
                ]
              },
              "routing": {
                "description": "Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.",
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {}
                }
              },
              "quantization": {
                "type": "string",
                "description": "Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."
              },
              "parameters_b": {
                "type": "number",
                "description": "Local runtimes: parameters, in billions."
              },
              "requirements": {
                "type": "object",
                "properties": {
                  "memory_gb": {
                    "type": "number",
                    "description": "Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."
                  },
                  "vram_gb": {
                    "type": "number",
                    "description": "GPU memory for a full offload, at the same context."
                  },
                  "disk_gb": {
                    "type": "number",
                    "description": "The weights' download size."
                  },
                  "context_for_memory": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991,
                    "description": "The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."
                  },
                  "kv_bytes_per_token": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991,
                    "description": "KV cache bytes per further token of context."
                  },
                  "low_resource": {
                    "type": "boolean",
                    "description": "WebLLM: runs on low-resource devices."
                  }
                },
                "required": [
                  "memory_gb",
                  "context_for_memory"
                ],
                "description": "Local runtimes: what the device needs."
              },
              "license": {
                "type": "string",
                "description": "Local runtimes: the weights' license, e.g. \"apache-2.0\"."
              }
            },
            "required": [
              "id",
              "vendor",
              "provider",
              "provider_model_id",
              "status",
              "capabilities",
              "limits"
            ]
          },
          "description": "Cheapest first; each step clears a higher quality tier."
        },
        "team": {
          "type": "object",
          "properties": {
            "strategy": {
              "type": "string"
            },
            "roles": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {
                "type": "object",
                "properties": {
                  "task": {
                    "type": "string"
                  },
                  "members": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Canonical model id, vendor/model."
                        },
                        "vendor": {
                          "type": "string"
                        },
                        "origin": {
                          "type": "string"
                        },
                        "provider": {
                          "type": "string"
                        },
                        "provider_model_id": {
                          "type": "string",
                          "description": "Use this as the model name in the provider's API."
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "preview",
                            "ga",
                            "deprecated",
                            "retired"
                          ]
                        },
                        "released": {
                          "type": "string"
                        },
                        "capabilities": {
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {
                            "type": "object",
                            "properties": {
                              "level": {
                                "type": "string",
                                "enum": [
                                  "claimed",
                                  "parsed",
                                  "native",
                                  "probed"
                                ]
                              },
                              "probed_on": {
                                "type": "string"
                              },
                              "efforts": {
                                "description": "Reasoning effort levels the offering accepts, for reasoning.",
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              }
                            },
                            "required": [
                              "level"
                            ]
                          }
                        },
                        "limits": {
                          "type": "object",
                          "properties": {
                            "context": {
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991
                            },
                            "max_input": {
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991
                            },
                            "max_output": {
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991
                            },
                            "dimensions": {
                              "description": "Embedding vector length, as a probe measured it.",
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991
                            }
                          }
                        },
                        "price": {
                          "type": "object",
                          "properties": {
                            "currency": {
                              "type": "string"
                            },
                            "per_1m": {
                              "type": "object",
                              "propertyNames": {
                                "type": "string"
                              },
                              "additionalProperties": {
                                "type": "string",
                                "description": "A decimal number as a string; never a float."
                              }
                            },
                            "typical_call": {
                              "type": "string",
                              "description": "USD, after fees and your provider_terms."
                            },
                            "converted": {
                              "type": "object",
                              "properties": {
                                "currency": {
                                  "type": "string"
                                },
                                "typical_call": {
                                  "type": "string",
                                  "description": "A decimal number as a string; never a float."
                                }
                              },
                              "required": [
                                "currency",
                                "typical_call"
                              ]
                            },
                            "unverified": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "currency",
                            "per_1m",
                            "typical_call"
                          ]
                        },
                        "quality": {
                          "type": "object",
                          "properties": {
                            "score": {
                              "type": "number"
                            },
                            "basis": {
                              "type": "string",
                              "description": "<source>:<signal>, or curated."
                            },
                            "measured_on": {
                              "type": "string"
                            },
                            "attribution": {
                              "type": "string",
                              "description": "Show this wherever the score is shown."
                            },
                            "kind": {
                              "type": "string",
                              "enum": [
                                "measured",
                                "estimated"
                              ]
                            },
                            "quantization_penalty": {
                              "type": "number",
                              "description": "Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."
                            }
                          },
                          "required": [
                            "score",
                            "basis",
                            "measured_on",
                            "attribution",
                            "kind"
                          ]
                        },
                        "routing": {
                          "description": "Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.",
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {
                            "type": "object",
                            "propertyNames": {
                              "type": "string"
                            },
                            "additionalProperties": {}
                          }
                        },
                        "quantization": {
                          "type": "string",
                          "description": "Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."
                        },
                        "parameters_b": {
                          "type": "number",
                          "description": "Local runtimes: parameters, in billions."
                        },
                        "requirements": {
                          "type": "object",
                          "properties": {
                            "memory_gb": {
                              "type": "number",
                              "description": "Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."
                            },
                            "vram_gb": {
                              "type": "number",
                              "description": "GPU memory for a full offload, at the same context."
                            },
                            "disk_gb": {
                              "type": "number",
                              "description": "The weights' download size."
                            },
                            "context_for_memory": {
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991,
                              "description": "The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."
                            },
                            "kv_bytes_per_token": {
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991,
                              "description": "KV cache bytes per further token of context."
                            },
                            "low_resource": {
                              "type": "boolean",
                              "description": "WebLLM: runs on low-resource devices."
                            }
                          },
                          "required": [
                            "memory_gb",
                            "context_for_memory"
                          ],
                          "description": "Local runtimes: what the device needs."
                        },
                        "license": {
                          "type": "string",
                          "description": "Local runtimes: the weights' license, e.g. \"apache-2.0\"."
                        }
                      },
                      "required": [
                        "id",
                        "vendor",
                        "provider",
                        "provider_model_id",
                        "status",
                        "capabilities",
                        "limits"
                      ]
                    }
                  }
                },
                "required": [
                  "task",
                  "members"
                ]
              },
              "description": "Role name → its task and members, in the roles' order."
            },
            "typical_call": {
              "type": "string",
              "description": "The whole team's typical call in USD, when every member is priced."
            }
          },
          "required": [
            "roles"
          ],
          "description": "Check then escalate: the team to escalate to."
        }
      },
      "required": [
        "steps"
      ],
      "description": "shape=escalation: the steps, and the team to escalate to."
    }
  },
  "required": [
    "shape",
    "catalog_version",
    "need",
    "model",
    "also_on",
    "alternatives",
    "reason",
    "warnings"
  ]
}
PlanRequest
PlanRequest (JSON Schema)
{
  "type": "object",
  "properties": {
    "providers": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Required. Provider names, in order of preference for ties."
    },
    "prompt": {
      "type": "string",
      "description": "The request to read. Sent only to the decision model you choose; never stored or logged."
    },
    "tags": {
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 100
      },
      "description": "Free tags, e.g. [\"vision\", \"read receipts\", \"usa\", \"medium\"]."
    },
    "attachments": {
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "MIME type, e.g. image/jpeg. Only type and size are sent, never the file."
          },
          "bytes": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "pages": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          },
          "seconds": {
            "type": "number",
            "minimum": 0
          }
        },
        "required": [
          "type",
          "bytes"
        ],
        "additionalProperties": false
      }
    },
    "decision": {
      "type": "object",
      "properties": {
        "model": {
          "type": "string",
          "enum": [
            "openai",
            "local",
            "jev"
          ],
          "description": "openai (default) or local; jev is for internal accounts only."
        },
        "allow_remote": {
          "type": "boolean",
          "description": "false keeps the prompt on the server: the local classifier only."
        }
      },
      "additionalProperties": false
    },
    "device": {
      "type": "object",
      "properties": {
        "memory_gb": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "vram_gb": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "disk_gb": {
          "type": "number",
          "exclusiveMinimum": 0
        }
      },
      "additionalProperties": false,
      "description": "The device's memory, GPU memory and free disk in GB, for local runtimes: facts that become max_memory_gb, max_vram_gb and max_disk_gb unless constraints set them."
    },
    "shape": {
      "type": "string",
      "enum": [
        "single",
        "team",
        "escalation",
        "auto"
      ],
      "description": "As in /v1/resolve, or auto: a team when the reading says several models would help (ensemble_helps), an escalation when the request gives length, else single."
    },
    "constraints": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      },
      "description": "Any /v1/resolve query parameter except providers, as strings; these win over the reading."
    }
  },
  "required": [
    "providers"
  ],
  "additionalProperties": false
}
PlanResponse
PlanResponse (JSON Schema)
{
  "type": "object",
  "properties": {
    "shape": {
      "type": "string",
      "enum": [
        "single",
        "team",
        "escalation"
      ],
      "description": "single: `model`. team: `team`, with `model` its first role's first member. escalation: `escalation`, with `model` its first step."
    },
    "catalog_version": {
      "type": "string"
    },
    "need": {
      "type": "object",
      "properties": {
        "task": {
          "type": "string"
        },
        "purpose": {
          "type": "string"
        },
        "needs": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "capability": {
                "type": "string"
              },
              "level": {
                "type": "string"
              }
            },
            "required": [
              "capability",
              "level"
            ]
          }
        },
        "providers": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "provider_terms": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string"
                }
              },
              "required": [
                "kind"
              ],
              "additionalProperties": {}
            }
          }
        },
        "origin": {
          "type": "object",
          "properties": {
            "include": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "exclude": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "strict": {
              "type": "boolean"
            }
          },
          "required": [
            "include",
            "exclude",
            "strict"
          ]
        },
        "budget": {
          "type": "string"
        },
        "max_price": {
          "type": "string"
        },
        "optimize": {
          "type": "string"
        },
        "quality_margin": {
          "type": "number"
        },
        "usage": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": [
              "number",
              "string"
            ]
          }
        },
        "allow_preview": {
          "type": "boolean"
        },
        "exclude": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "service_tier": {
          "type": "string"
        },
        "currency": {
          "type": "string"
        }
      },
      "required": [
        "task",
        "needs",
        "providers",
        "provider_terms",
        "optimize",
        "quality_margin",
        "usage",
        "allow_preview",
        "exclude",
        "service_tier"
      ],
      "additionalProperties": {}
    },
    "model": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "Canonical model id, vendor/model."
        },
        "vendor": {
          "type": "string"
        },
        "origin": {
          "type": "string"
        },
        "provider": {
          "type": "string"
        },
        "provider_model_id": {
          "type": "string",
          "description": "Use this as the model name in the provider's API."
        },
        "status": {
          "type": "string",
          "enum": [
            "preview",
            "ga",
            "deprecated",
            "retired"
          ]
        },
        "released": {
          "type": "string"
        },
        "capabilities": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "object",
            "properties": {
              "level": {
                "type": "string",
                "enum": [
                  "claimed",
                  "parsed",
                  "native",
                  "probed"
                ]
              },
              "probed_on": {
                "type": "string"
              },
              "efforts": {
                "description": "Reasoning effort levels the offering accepts, for reasoning.",
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "level"
            ]
          }
        },
        "limits": {
          "type": "object",
          "properties": {
            "context": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            "max_input": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            "max_output": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            "dimensions": {
              "description": "Embedding vector length, as a probe measured it.",
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            }
          }
        },
        "price": {
          "type": "object",
          "properties": {
            "currency": {
              "type": "string"
            },
            "per_1m": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {
                "type": "string",
                "description": "A decimal number as a string; never a float."
              }
            },
            "typical_call": {
              "type": "string",
              "description": "USD, after fees and your provider_terms."
            },
            "converted": {
              "type": "object",
              "properties": {
                "currency": {
                  "type": "string"
                },
                "typical_call": {
                  "type": "string",
                  "description": "A decimal number as a string; never a float."
                }
              },
              "required": [
                "currency",
                "typical_call"
              ]
            },
            "unverified": {
              "type": "boolean"
            }
          },
          "required": [
            "currency",
            "per_1m",
            "typical_call"
          ]
        },
        "quality": {
          "type": "object",
          "properties": {
            "score": {
              "type": "number"
            },
            "basis": {
              "type": "string",
              "description": "<source>:<signal>, or curated."
            },
            "measured_on": {
              "type": "string"
            },
            "attribution": {
              "type": "string",
              "description": "Show this wherever the score is shown."
            },
            "kind": {
              "type": "string",
              "enum": [
                "measured",
                "estimated"
              ]
            },
            "quantization_penalty": {
              "type": "number",
              "description": "Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."
            }
          },
          "required": [
            "score",
            "basis",
            "measured_on",
            "attribution",
            "kind"
          ]
        },
        "routing": {
          "description": "Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.",
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          }
        },
        "quantization": {
          "type": "string",
          "description": "Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."
        },
        "parameters_b": {
          "type": "number",
          "description": "Local runtimes: parameters, in billions."
        },
        "requirements": {
          "type": "object",
          "properties": {
            "memory_gb": {
              "type": "number",
              "description": "Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."
            },
            "vram_gb": {
              "type": "number",
              "description": "GPU memory for a full offload, at the same context."
            },
            "disk_gb": {
              "type": "number",
              "description": "The weights' download size."
            },
            "context_for_memory": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991,
              "description": "The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."
            },
            "kv_bytes_per_token": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991,
              "description": "KV cache bytes per further token of context."
            },
            "low_resource": {
              "type": "boolean",
              "description": "WebLLM: runs on low-resource devices."
            }
          },
          "required": [
            "memory_gb",
            "context_for_memory"
          ],
          "description": "Local runtimes: what the device needs."
        },
        "license": {
          "type": "string",
          "description": "Local runtimes: the weights' license, e.g. \"apache-2.0\"."
        }
      },
      "required": [
        "id",
        "vendor",
        "provider",
        "provider_model_id",
        "status",
        "capabilities",
        "limits"
      ]
    },
    "also_on": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string"
          },
          "provider_model_id": {
            "type": "string"
          },
          "typical_call": {
            "type": "string",
            "description": "A decimal number as a string; never a float."
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "provider",
          "provider_model_id"
        ]
      }
    },
    "alternatives": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Canonical model id, vendor/model."
          },
          "vendor": {
            "type": "string"
          },
          "origin": {
            "type": "string"
          },
          "provider": {
            "type": "string"
          },
          "provider_model_id": {
            "type": "string",
            "description": "Use this as the model name in the provider's API."
          },
          "status": {
            "type": "string",
            "enum": [
              "preview",
              "ga",
              "deprecated",
              "retired"
            ]
          },
          "released": {
            "type": "string"
          },
          "capabilities": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "object",
              "properties": {
                "level": {
                  "type": "string",
                  "enum": [
                    "claimed",
                    "parsed",
                    "native",
                    "probed"
                  ]
                },
                "probed_on": {
                  "type": "string"
                },
                "efforts": {
                  "description": "Reasoning effort levels the offering accepts, for reasoning.",
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "level"
              ]
            }
          },
          "limits": {
            "type": "object",
            "properties": {
              "context": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "max_input": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "max_output": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "dimensions": {
                "description": "Embedding vector length, as a probe measured it.",
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              }
            }
          },
          "price": {
            "type": "object",
            "properties": {
              "currency": {
                "type": "string"
              },
              "per_1m": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string",
                  "description": "A decimal number as a string; never a float."
                }
              },
              "typical_call": {
                "type": "string",
                "description": "USD, after fees and your provider_terms."
              },
              "converted": {
                "type": "object",
                "properties": {
                  "currency": {
                    "type": "string"
                  },
                  "typical_call": {
                    "type": "string",
                    "description": "A decimal number as a string; never a float."
                  }
                },
                "required": [
                  "currency",
                  "typical_call"
                ]
              },
              "unverified": {
                "type": "boolean"
              }
            },
            "required": [
              "currency",
              "per_1m",
              "typical_call"
            ]
          },
          "quality": {
            "type": "object",
            "properties": {
              "score": {
                "type": "number"
              },
              "basis": {
                "type": "string",
                "description": "<source>:<signal>, or curated."
              },
              "measured_on": {
                "type": "string"
              },
              "attribution": {
                "type": "string",
                "description": "Show this wherever the score is shown."
              },
              "kind": {
                "type": "string",
                "enum": [
                  "measured",
                  "estimated"
                ]
              },
              "quantization_penalty": {
                "type": "number",
                "description": "Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."
              }
            },
            "required": [
              "score",
              "basis",
              "measured_on",
              "attribution",
              "kind"
            ]
          },
          "routing": {
            "description": "Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            }
          },
          "quantization": {
            "type": "string",
            "description": "Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."
          },
          "parameters_b": {
            "type": "number",
            "description": "Local runtimes: parameters, in billions."
          },
          "requirements": {
            "type": "object",
            "properties": {
              "memory_gb": {
                "type": "number",
                "description": "Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."
              },
              "vram_gb": {
                "type": "number",
                "description": "GPU memory for a full offload, at the same context."
              },
              "disk_gb": {
                "type": "number",
                "description": "The weights' download size."
              },
              "context_for_memory": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991,
                "description": "The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."
              },
              "kv_bytes_per_token": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991,
                "description": "KV cache bytes per further token of context."
              },
              "low_resource": {
                "type": "boolean",
                "description": "WebLLM: runs on low-resource devices."
              }
            },
            "required": [
              "memory_gb",
              "context_for_memory"
            ],
            "description": "Local runtimes: what the device needs."
          },
          "license": {
            "type": "string",
            "description": "Local runtimes: the weights' license, e.g. \"apache-2.0\"."
          }
        },
        "required": [
          "id",
          "vendor",
          "provider",
          "provider_model_id",
          "status",
          "capabilities",
          "limits"
        ]
      }
    },
    "reason": {
      "type": "string"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          }
        },
        "required": [
          "code"
        ],
        "additionalProperties": {}
      }
    },
    "team": {
      "type": "object",
      "properties": {
        "strategy": {
          "type": "string"
        },
        "roles": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "object",
            "properties": {
              "task": {
                "type": "string"
              },
              "members": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "description": "Canonical model id, vendor/model."
                    },
                    "vendor": {
                      "type": "string"
                    },
                    "origin": {
                      "type": "string"
                    },
                    "provider": {
                      "type": "string"
                    },
                    "provider_model_id": {
                      "type": "string",
                      "description": "Use this as the model name in the provider's API."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "preview",
                        "ga",
                        "deprecated",
                        "retired"
                      ]
                    },
                    "released": {
                      "type": "string"
                    },
                    "capabilities": {
                      "type": "object",
                      "propertyNames": {
                        "type": "string"
                      },
                      "additionalProperties": {
                        "type": "object",
                        "properties": {
                          "level": {
                            "type": "string",
                            "enum": [
                              "claimed",
                              "parsed",
                              "native",
                              "probed"
                            ]
                          },
                          "probed_on": {
                            "type": "string"
                          },
                          "efforts": {
                            "description": "Reasoning effort levels the offering accepts, for reasoning.",
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "required": [
                          "level"
                        ]
                      }
                    },
                    "limits": {
                      "type": "object",
                      "properties": {
                        "context": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "max_input": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "max_output": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        "dimensions": {
                          "description": "Embedding vector length, as a probe measured it.",
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        }
                      }
                    },
                    "price": {
                      "type": "object",
                      "properties": {
                        "currency": {
                          "type": "string"
                        },
                        "per_1m": {
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {
                            "type": "string",
                            "description": "A decimal number as a string; never a float."
                          }
                        },
                        "typical_call": {
                          "type": "string",
                          "description": "USD, after fees and your provider_terms."
                        },
                        "converted": {
                          "type": "object",
                          "properties": {
                            "currency": {
                              "type": "string"
                            },
                            "typical_call": {
                              "type": "string",
                              "description": "A decimal number as a string; never a float."
                            }
                          },
                          "required": [
                            "currency",
                            "typical_call"
                          ]
                        },
                        "unverified": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "currency",
                        "per_1m",
                        "typical_call"
                      ]
                    },
                    "quality": {
                      "type": "object",
                      "properties": {
                        "score": {
                          "type": "number"
                        },
                        "basis": {
                          "type": "string",
                          "description": "<source>:<signal>, or curated."
                        },
                        "measured_on": {
                          "type": "string"
                        },
                        "attribution": {
                          "type": "string",
                          "description": "Show this wherever the score is shown."
                        },
                        "kind": {
                          "type": "string",
                          "enum": [
                            "measured",
                            "estimated"
                          ]
                        },
                        "quantization_penalty": {
                          "type": "number",
                          "description": "Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."
                        }
                      },
                      "required": [
                        "score",
                        "basis",
                        "measured_on",
                        "attribution",
                        "kind"
                      ]
                    },
                    "routing": {
                      "description": "Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.",
                      "type": "object",
                      "propertyNames": {
                        "type": "string"
                      },
                      "additionalProperties": {
                        "type": "object",
                        "propertyNames": {
                          "type": "string"
                        },
                        "additionalProperties": {}
                      }
                    },
                    "quantization": {
                      "type": "string",
                      "description": "Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."
                    },
                    "parameters_b": {
                      "type": "number",
                      "description": "Local runtimes: parameters, in billions."
                    },
                    "requirements": {
                      "type": "object",
                      "properties": {
                        "memory_gb": {
                          "type": "number",
                          "description": "Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."
                        },
                        "vram_gb": {
                          "type": "number",
                          "description": "GPU memory for a full offload, at the same context."
                        },
                        "disk_gb": {
                          "type": "number",
                          "description": "The weights' download size."
                        },
                        "context_for_memory": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991,
                          "description": "The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."
                        },
                        "kv_bytes_per_token": {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991,
                          "description": "KV cache bytes per further token of context."
                        },
                        "low_resource": {
                          "type": "boolean",
                          "description": "WebLLM: runs on low-resource devices."
                        }
                      },
                      "required": [
                        "memory_gb",
                        "context_for_memory"
                      ],
                      "description": "Local runtimes: what the device needs."
                    },
                    "license": {
                      "type": "string",
                      "description": "Local runtimes: the weights' license, e.g. \"apache-2.0\"."
                    }
                  },
                  "required": [
                    "id",
                    "vendor",
                    "provider",
                    "provider_model_id",
                    "status",
                    "capabilities",
                    "limits"
                  ]
                }
              }
            },
            "required": [
              "task",
              "members"
            ]
          },
          "description": "Role name → its task and members, in the roles' order."
        },
        "typical_call": {
          "type": "string",
          "description": "The whole team's typical call in USD, when every member is priced."
        }
      },
      "required": [
        "roles"
      ],
      "description": "shape=team: the members by role."
    },
    "escalation": {
      "type": "object",
      "properties": {
        "steps": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Canonical model id, vendor/model."
              },
              "vendor": {
                "type": "string"
              },
              "origin": {
                "type": "string"
              },
              "provider": {
                "type": "string"
              },
              "provider_model_id": {
                "type": "string",
                "description": "Use this as the model name in the provider's API."
              },
              "status": {
                "type": "string",
                "enum": [
                  "preview",
                  "ga",
                  "deprecated",
                  "retired"
                ]
              },
              "released": {
                "type": "string"
              },
              "capabilities": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "level": {
                      "type": "string",
                      "enum": [
                        "claimed",
                        "parsed",
                        "native",
                        "probed"
                      ]
                    },
                    "probed_on": {
                      "type": "string"
                    },
                    "efforts": {
                      "description": "Reasoning effort levels the offering accepts, for reasoning.",
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "level"
                  ]
                }
              },
              "limits": {
                "type": "object",
                "properties": {
                  "context": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "max_input": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "max_output": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  },
                  "dimensions": {
                    "description": "Embedding vector length, as a probe measured it.",
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991
                  }
                }
              },
              "price": {
                "type": "object",
                "properties": {
                  "currency": {
                    "type": "string"
                  },
                  "per_1m": {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "string",
                      "description": "A decimal number as a string; never a float."
                    }
                  },
                  "typical_call": {
                    "type": "string",
                    "description": "USD, after fees and your provider_terms."
                  },
                  "converted": {
                    "type": "object",
                    "properties": {
                      "currency": {
                        "type": "string"
                      },
                      "typical_call": {
                        "type": "string",
                        "description": "A decimal number as a string; never a float."
                      }
                    },
                    "required": [
                      "currency",
                      "typical_call"
                    ]
                  },
                  "unverified": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "currency",
                  "per_1m",
                  "typical_call"
                ]
              },
              "quality": {
                "type": "object",
                "properties": {
                  "score": {
                    "type": "number"
                  },
                  "basis": {
                    "type": "string",
                    "description": "<source>:<signal>, or curated."
                  },
                  "measured_on": {
                    "type": "string"
                  },
                  "attribution": {
                    "type": "string",
                    "description": "Show this wherever the score is shown."
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "measured",
                      "estimated"
                    ]
                  },
                  "quantization_penalty": {
                    "type": "number",
                    "description": "Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."
                  }
                },
                "required": [
                  "score",
                  "basis",
                  "measured_on",
                  "attribution",
                  "kind"
                ]
              },
              "routing": {
                "description": "Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.",
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {}
                }
              },
              "quantization": {
                "type": "string",
                "description": "Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."
              },
              "parameters_b": {
                "type": "number",
                "description": "Local runtimes: parameters, in billions."
              },
              "requirements": {
                "type": "object",
                "properties": {
                  "memory_gb": {
                    "type": "number",
                    "description": "Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."
                  },
                  "vram_gb": {
                    "type": "number",
                    "description": "GPU memory for a full offload, at the same context."
                  },
                  "disk_gb": {
                    "type": "number",
                    "description": "The weights' download size."
                  },
                  "context_for_memory": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991,
                    "description": "The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."
                  },
                  "kv_bytes_per_token": {
                    "type": "integer",
                    "minimum": -9007199254740991,
                    "maximum": 9007199254740991,
                    "description": "KV cache bytes per further token of context."
                  },
                  "low_resource": {
                    "type": "boolean",
                    "description": "WebLLM: runs on low-resource devices."
                  }
                },
                "required": [
                  "memory_gb",
                  "context_for_memory"
                ],
                "description": "Local runtimes: what the device needs."
              },
              "license": {
                "type": "string",
                "description": "Local runtimes: the weights' license, e.g. \"apache-2.0\"."
              }
            },
            "required": [
              "id",
              "vendor",
              "provider",
              "provider_model_id",
              "status",
              "capabilities",
              "limits"
            ]
          },
          "description": "Cheapest first; each step clears a higher quality tier."
        },
        "team": {
          "type": "object",
          "properties": {
            "strategy": {
              "type": "string"
            },
            "roles": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {
                "type": "object",
                "properties": {
                  "task": {
                    "type": "string"
                  },
                  "members": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Canonical model id, vendor/model."
                        },
                        "vendor": {
                          "type": "string"
                        },
                        "origin": {
                          "type": "string"
                        },
                        "provider": {
                          "type": "string"
                        },
                        "provider_model_id": {
                          "type": "string",
                          "description": "Use this as the model name in the provider's API."
                        },
                        "status": {
                          "type": "string",
                          "enum": [
                            "preview",
                            "ga",
                            "deprecated",
                            "retired"
                          ]
                        },
                        "released": {
                          "type": "string"
                        },
                        "capabilities": {
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {
                            "type": "object",
                            "properties": {
                              "level": {
                                "type": "string",
                                "enum": [
                                  "claimed",
                                  "parsed",
                                  "native",
                                  "probed"
                                ]
                              },
                              "probed_on": {
                                "type": "string"
                              },
                              "efforts": {
                                "description": "Reasoning effort levels the offering accepts, for reasoning.",
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              }
                            },
                            "required": [
                              "level"
                            ]
                          }
                        },
                        "limits": {
                          "type": "object",
                          "properties": {
                            "context": {
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991
                            },
                            "max_input": {
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991
                            },
                            "max_output": {
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991
                            },
                            "dimensions": {
                              "description": "Embedding vector length, as a probe measured it.",
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991
                            }
                          }
                        },
                        "price": {
                          "type": "object",
                          "properties": {
                            "currency": {
                              "type": "string"
                            },
                            "per_1m": {
                              "type": "object",
                              "propertyNames": {
                                "type": "string"
                              },
                              "additionalProperties": {
                                "type": "string",
                                "description": "A decimal number as a string; never a float."
                              }
                            },
                            "typical_call": {
                              "type": "string",
                              "description": "USD, after fees and your provider_terms."
                            },
                            "converted": {
                              "type": "object",
                              "properties": {
                                "currency": {
                                  "type": "string"
                                },
                                "typical_call": {
                                  "type": "string",
                                  "description": "A decimal number as a string; never a float."
                                }
                              },
                              "required": [
                                "currency",
                                "typical_call"
                              ]
                            },
                            "unverified": {
                              "type": "boolean"
                            }
                          },
                          "required": [
                            "currency",
                            "per_1m",
                            "typical_call"
                          ]
                        },
                        "quality": {
                          "type": "object",
                          "properties": {
                            "score": {
                              "type": "number"
                            },
                            "basis": {
                              "type": "string",
                              "description": "<source>:<signal>, or curated."
                            },
                            "measured_on": {
                              "type": "string"
                            },
                            "attribution": {
                              "type": "string",
                              "description": "Show this wherever the score is shown."
                            },
                            "kind": {
                              "type": "string",
                              "enum": [
                                "measured",
                                "estimated"
                              ]
                            },
                            "quantization_penalty": {
                              "type": "number",
                              "description": "Local runtimes: taken off the model's score for the quantization (q8_0 0, q6_K 0.005, q5_K_M 0.01, q4_K_M 0.03); above 0 the score is an estimate."
                            }
                          },
                          "required": [
                            "score",
                            "basis",
                            "measured_on",
                            "attribution",
                            "kind"
                          ]
                        },
                        "routing": {
                          "description": "Provider-specific request fields the answer depends on; send them with the call. On OpenRouter with needs=zdr: { \"openrouter\": { \"provider\": { \"zdr\": true } } }, so OpenRouter routes only to zero-data-retention upstreams.",
                          "type": "object",
                          "propertyNames": {
                            "type": "string"
                          },
                          "additionalProperties": {
                            "type": "object",
                            "propertyNames": {
                              "type": "string"
                            },
                            "additionalProperties": {}
                          }
                        },
                        "quantization": {
                          "type": "string",
                          "description": "Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."
                        },
                        "parameters_b": {
                          "type": "number",
                          "description": "Local runtimes: parameters, in billions."
                        },
                        "requirements": {
                          "type": "object",
                          "properties": {
                            "memory_gb": {
                              "type": "number",
                              "description": "Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."
                            },
                            "vram_gb": {
                              "type": "number",
                              "description": "GPU memory for a full offload, at the same context."
                            },
                            "disk_gb": {
                              "type": "number",
                              "description": "The weights' download size."
                            },
                            "context_for_memory": {
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991,
                              "description": "The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."
                            },
                            "kv_bytes_per_token": {
                              "type": "integer",
                              "minimum": -9007199254740991,
                              "maximum": 9007199254740991,
                              "description": "KV cache bytes per further token of context."
                            },
                            "low_resource": {
                              "type": "boolean",
                              "description": "WebLLM: runs on low-resource devices."
                            }
                          },
                          "required": [
                            "memory_gb",
                            "context_for_memory"
                          ],
                          "description": "Local runtimes: what the device needs."
                        },
                        "license": {
                          "type": "string",
                          "description": "Local runtimes: the weights' license, e.g. \"apache-2.0\"."
                        }
                      },
                      "required": [
                        "id",
                        "vendor",
                        "provider",
                        "provider_model_id",
                        "status",
                        "capabilities",
                        "limits"
                      ]
                    }
                  }
                },
                "required": [
                  "task",
                  "members"
                ]
              },
              "description": "Role name → its task and members, in the roles' order."
            },
            "typical_call": {
              "type": "string",
              "description": "The whole team's typical call in USD, when every member is priced."
            }
          },
          "required": [
            "roles"
          ],
          "description": "Check then escalate: the team to escalate to."
        }
      },
      "required": [
        "steps"
      ],
      "description": "shape=escalation: the steps, and the team to escalate to."
    },
    "sources": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string",
        "enum": [
          "fact",
          "tag",
          "decision",
          "request",
          "default"
        ]
      },
      "description": "Need field → where it came from (fact, tag, decision, request, default)."
    },
    "reading": {
      "type": "object",
      "properties": {
        "purpose": {
          "type": "string",
          "description": "The purpose preset the request reads as."
        },
        "task": {
          "type": "string"
        },
        "category": {
          "type": "string"
        },
        "difficulty": {
          "type": "number",
          "description": "1 (trivial) to 5 (expert)."
        },
        "stakes": {
          "type": "number",
          "description": "1 (casual) to 5 (critical)."
        },
        "answer_shape": {
          "type": "string"
        },
        "domain": {
          "type": "string"
        },
        "needs_reasoning": {
          "type": "boolean"
        },
        "needs_tools": {
          "type": "boolean"
        },
        "needs_web": {
          "type": "boolean"
        },
        "ensemble_helps": {
          "type": "boolean",
          "description": "Whether several models would help; with shape auto it picks a team."
        },
        "adversarial": {
          "type": "boolean"
        },
        "ambiguous": {
          "type": "boolean"
        },
        "budget": {
          "type": "string",
          "description": "Read from tags the synonym list did not know."
        },
        "origin": {
          "type": "string",
          "description": "Read from tags the synonym list did not know."
        }
      },
      "additionalProperties": {},
      "description": "The decision model's structured reading (never the prompt)."
    },
    "decision": {
      "type": "object",
      "properties": {
        "model": {
          "type": "string",
          "enum": [
            "openai",
            "local",
            "jev"
          ],
          "description": "The model that read the request (local when the prompt never left the server)."
        },
        "latency_ms": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "fallback_used": {
          "type": "boolean",
          "description": "The local classifier answered instead of the model asked."
        },
        "fallback_reason": {
          "type": "string",
          "enum": [
            "timeout",
            "error",
            "invalid",
            "unavailable",
            "budget_exhausted"
          ],
          "description": "Why the local classifier answered, when it did."
        },
        "cached": {
          "type": "boolean"
        }
      },
      "required": [
        "model",
        "latency_ms",
        "fallback_used",
        "cached"
      ]
    }
  },
  "required": [
    "shape",
    "catalog_version",
    "need",
    "model",
    "also_on",
    "alternatives",
    "reason",
    "warnings",
    "sources",
    "reading",
    "decision"
  ]
}
ModelsList
ModelsList (JSON Schema)
{
  "type": "object",
  "properties": {
    "catalog_version": {
      "type": "string"
    },
    "total": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "models": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "vendor": {
            "type": "string"
          },
          "origin": {
            "type": "string"
          },
          "display_name": {
            "type": "string"
          },
          "tasks": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "released": {
            "type": "string"
          },
          "offerings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "provider": {
                  "type": "string"
                },
                "provider_model_id": {
                  "type": "string"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "preview",
                    "ga",
                    "deprecated",
                    "retired"
                  ]
                },
                "retires_on": {
                  "type": "string"
                },
                "capabilities": {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {
                    "type": "object",
                    "properties": {
                      "level": {
                        "type": "string",
                        "enum": [
                          "claimed",
                          "parsed",
                          "native",
                          "probed"
                        ]
                      },
                      "probed_on": {
                        "type": "string"
                      },
                      "efforts": {
                        "description": "Reasoning effort levels the offering accepts, for reasoning.",
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": [
                      "level"
                    ]
                  }
                },
                "limits": {
                  "type": "object",
                  "properties": {
                    "context": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "max_input": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "max_output": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    "dimensions": {
                      "description": "Embedding vector length, as a probe measured it.",
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    }
                  }
                },
                "price": {
                  "type": "object",
                  "properties": {
                    "currency": {
                      "type": "string"
                    },
                    "per_1m": {
                      "type": "object",
                      "propertyNames": {
                        "type": "string"
                      },
                      "additionalProperties": {
                        "type": "string",
                        "description": "A decimal number as a string; never a float."
                      }
                    },
                    "effective_from": {
                      "type": "string"
                    },
                    "unverified": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "currency",
                    "per_1m",
                    "effective_from"
                  ]
                },
                "quantization": {
                  "type": "string",
                  "description": "Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."
                },
                "parameters_b": {
                  "type": "number",
                  "description": "Local runtimes: parameters, in billions."
                },
                "requirements": {
                  "type": "object",
                  "properties": {
                    "memory_gb": {
                      "type": "number",
                      "description": "Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."
                    },
                    "vram_gb": {
                      "type": "number",
                      "description": "GPU memory for a full offload, at the same context."
                    },
                    "disk_gb": {
                      "type": "number",
                      "description": "The weights' download size."
                    },
                    "context_for_memory": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991,
                      "description": "The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."
                    },
                    "kv_bytes_per_token": {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991,
                      "description": "KV cache bytes per further token of context."
                    },
                    "low_resource": {
                      "type": "boolean",
                      "description": "WebLLM: runs on low-resource devices."
                    }
                  },
                  "required": [
                    "memory_gb",
                    "context_for_memory"
                  ],
                  "description": "Local runtimes: what the device needs, at context_for_memory tokens."
                },
                "license": {
                  "type": "string",
                  "description": "Local runtimes: the weights' license, e.g. \"apache-2.0\"."
                }
              },
              "required": [
                "provider",
                "provider_model_id",
                "status",
                "capabilities",
                "limits"
              ]
            }
          },
          "quality": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "score": {
                  "type": "number"
                },
                "basis": {
                  "type": "string",
                  "description": "<source>:<signal>, or curated."
                },
                "measured_on": {
                  "type": "string"
                },
                "attribution": {
                  "type": "string",
                  "description": "Show this wherever the score is shown."
                },
                "kind": {
                  "type": "string",
                  "enum": [
                    "measured",
                    "estimated"
                  ]
                }
              },
              "required": [
                "score",
                "basis",
                "measured_on",
                "attribution",
                "kind"
              ]
            }
          }
        },
        "required": [
          "id",
          "vendor",
          "display_name",
          "tasks",
          "offerings",
          "quality"
        ]
      }
    }
  },
  "required": [
    "catalog_version",
    "total",
    "models"
  ]
}
ModelDetail
ModelDetail (JSON Schema)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "vendor": {
      "type": "string"
    },
    "origin": {
      "type": "string"
    },
    "display_name": {
      "type": "string"
    },
    "tasks": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "released": {
      "type": "string"
    },
    "offerings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string"
          },
          "provider_model_id": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "preview",
              "ga",
              "deprecated",
              "retired"
            ]
          },
          "retires_on": {
            "type": "string"
          },
          "capabilities": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "object",
              "properties": {
                "level": {
                  "type": "string",
                  "enum": [
                    "claimed",
                    "parsed",
                    "native",
                    "probed"
                  ]
                },
                "probed_on": {
                  "type": "string"
                },
                "efforts": {
                  "description": "Reasoning effort levels the offering accepts, for reasoning.",
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "level"
              ]
            }
          },
          "limits": {
            "type": "object",
            "properties": {
              "context": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "max_input": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "max_output": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              "dimensions": {
                "description": "Embedding vector length, as a probe measured it.",
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              }
            }
          },
          "price": {
            "type": "object",
            "properties": {
              "currency": {
                "type": "string"
              },
              "per_1m": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string",
                  "description": "A decimal number as a string; never a float."
                }
              },
              "effective_from": {
                "type": "string"
              },
              "unverified": {
                "type": "boolean"
              }
            },
            "required": [
              "currency",
              "per_1m",
              "effective_from"
            ]
          },
          "quantization": {
            "type": "string",
            "description": "Local runtimes: the weights' quantization, e.g. \"Q4_K_M\"."
          },
          "parameters_b": {
            "type": "number",
            "description": "Local runtimes: parameters, in billions."
          },
          "requirements": {
            "type": "object",
            "properties": {
              "memory_gb": {
                "type": "number",
                "description": "Memory to run it: weights, KV cache at context_for_memory tokens and about 10% runtime overhead. GB are 10^9 bytes."
              },
              "vram_gb": {
                "type": "number",
                "description": "GPU memory for a full offload, at the same context."
              },
              "disk_gb": {
                "type": "number",
                "description": "The weights' download size."
              },
              "context_for_memory": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991,
                "description": "The context, in tokens, memory_gb is stated at: the request's min_context when larger than the stored 8,192 (WebLLM: its fixed context)."
              },
              "kv_bytes_per_token": {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991,
                "description": "KV cache bytes per further token of context."
              },
              "low_resource": {
                "type": "boolean",
                "description": "WebLLM: runs on low-resource devices."
              }
            },
            "required": [
              "memory_gb",
              "context_for_memory"
            ],
            "description": "Local runtimes: what the device needs, at context_for_memory tokens."
          },
          "license": {
            "type": "string",
            "description": "Local runtimes: the weights' license, e.g. \"apache-2.0\"."
          },
          "prices": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "currency": {
                  "type": "string"
                },
                "per_1m": {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {
                    "type": "string",
                    "description": "A decimal number as a string; never a float."
                  }
                },
                "effective_from": {
                  "type": "string"
                },
                "source": {
                  "type": "string"
                },
                "unverified": {
                  "type": "boolean"
                }
              },
              "required": [
                "currency",
                "per_1m",
                "effective_from",
                "source"
              ]
            }
          }
        },
        "required": [
          "provider",
          "provider_model_id",
          "status",
          "capabilities",
          "limits",
          "prices"
        ]
      }
    },
    "quality": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "score": {
            "type": "number"
          },
          "basis": {
            "type": "string",
            "description": "<source>:<signal>, or curated."
          },
          "measured_on": {
            "type": "string"
          },
          "attribution": {
            "type": "string",
            "description": "Show this wherever the score is shown."
          },
          "kind": {
            "type": "string",
            "enum": [
              "measured",
              "estimated"
            ]
          }
        },
        "required": [
          "score",
          "basis",
          "measured_on",
          "attribution",
          "kind"
        ]
      }
    },
    "catalog_version": {
      "type": "string"
    },
    "aliases": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "id",
    "vendor",
    "display_name",
    "tasks",
    "offerings",
    "quality",
    "catalog_version",
    "aliases"
  ]
}
PurposesList
PurposesList (JSON Schema)
{
  "type": "object",
  "properties": {
    "catalog_version": {
      "type": "string"
    },
    "purposes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "task": {
            "type": "string"
          },
          "needs": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "quality": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "usage": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": [
                "number",
                "string"
              ]
            }
          },
          "aliases": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "shape": {
            "type": "string",
            "enum": [
              "single",
              "team",
              "escalation"
            ],
            "description": "The shape the purpose resolves to when the request does not say."
          }
        },
        "required": [
          "id",
          "description",
          "task",
          "needs",
          "quality",
          "usage",
          "aliases"
        ]
      }
    }
  },
  "required": [
    "catalog_version",
    "purposes"
  ]
}
Vocabulary
Vocabulary (JSON Schema)
{
  "type": "object",
  "properties": {
    "tasks": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "capabilities": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "levels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "providers": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "display_name": {
            "type": "string"
          },
          "local": {
            "type": "boolean",
            "description": "A runtime on the user's device (ollama, lmstudio, llama.cpp, mlx, webllm) rather than a cloud provider; send the device's limits with it."
          }
        },
        "required": [
          "name",
          "display_name"
        ]
      }
    },
    "origin_groups": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "array",
        "items": {
          "type": "string"
        }
      }
    },
    "budgets": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "optimize": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "service_tiers": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "strategies": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Team strategy presets for strategy=."
    }
  },
  "required": [
    "tasks",
    "capabilities",
    "levels",
    "providers",
    "origin_groups",
    "budgets",
    "optimize",
    "service_tiers",
    "strategies"
  ]
}
Licenses
Licenses (JSON Schema)
{
  "type": "object",
  "properties": {
    "catalog_version": {
      "type": "string"
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "license": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "notice": {
            "type": "string"
          }
        },
        "required": [
          "source",
          "name",
          "license",
          "url",
          "notice"
        ]
      }
    }
  },
  "required": [
    "catalog_version",
    "sources"
  ]
}
Health
Health (JSON Schema)
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "ok",
        "degraded"
      ],
      "description": "ok, or degraded when the catalog is older than 48 hours (the API still answers from it)"
    },
    "catalog_version": {
      "description": "The catalog live keys are answered from",
      "type": "string"
    },
    "catalog_age_hours": {
      "description": "Hours since that catalog was generated, to one decimal",
      "type": "number"
    }
  },
  "required": [
    "status"
  ]
}
KeyInfo
KeyInfo (JSON Schema)
{
  "type": "object",
  "properties": {
    "key": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "The key's id"
        },
        "kind": {
          "type": "string",
          "enum": [
            "live",
            "test"
          ],
          "description": "live or test"
        },
        "project_id": {
          "description": "The project the key belongs to; null for none",
          "type": [
            "string",
            "null"
          ]
        },
        "scopes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "What the key may call: resolve, plan, models, usage:read"
        },
        "monthly_cap": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ],
          "description": "The key's own monthly call cap; null for none"
        }
      },
      "required": [
        "id",
        "kind",
        "project_id",
        "scopes",
        "monthly_cap"
      ]
    },
    "rate_per_minute": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Requests allowed a minute"
    },
    "quota": {
      "type": "object",
      "properties": {
        "limit": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ],
          "description": "Counted calls allowed this period; null for unlimited"
        },
        "used": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "Counted calls made this period"
        },
        "period_start": {
          "type": "string",
          "description": "The period's first day, e.g. 2026-11-01 (a day for test keys)"
        },
        "resets_at": {
          "type": "string",
          "description": "When the period resets, ISO 8601"
        }
      },
      "required": [
        "limit",
        "used",
        "period_start",
        "resets_at"
      ],
      "description": "The account's quota this period (test keys: the day's test calls)"
    },
    "key_usage": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "used": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            "limit": {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            }
          },
          "required": [
            "used",
            "limit"
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "Calls against the key's monthly cap; null when it has none"
    }
  },
  "required": [
    "key",
    "rate_per_minute",
    "quota",
    "key_usage"
  ]
}
Error
Error (JSON Schema)
{
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "field": {
          "type": "string"
        },
        "allowed": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "required": [
    "error"
  ]
}
NoCandidate
NoCandidate (JSON Schema)
{
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "const": "no_candidate"
        },
        "message": {
          "type": "string"
        },
        "catalog_version": {
          "type": "string"
        },
        "eliminated": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "constraint": {
                "type": "string"
              },
              "before": {
                "type": "number"
              },
              "after": {
                "type": "number"
              }
            },
            "required": [
              "constraint",
              "before",
              "after"
            ]
          }
        },
        "nearest_miss": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "provider": {
              "type": "string"
            },
            "provider_model_id": {
              "type": "string"
            },
            "failed": {
              "type": "string"
            }
          },
          "required": [
            "id",
            "provider",
            "provider_model_id",
            "failed"
          ]
        },
        "role": {
          "type": "string",
          "description": "For a team: the role no candidate was left for."
        }
      },
      "required": [
        "code",
        "message",
        "catalog_version",
        "eliminated"
      ]
    }
  },
  "required": [
    "error"
  ]
}