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
| Name | In | Type | Description |
|---|---|---|---|
providersrequired | query | string | Required. Provider names you have accounts with, in order of preference for ties. Never keys. Comma-separated.Example: gemini,openrouter |
task | query | string | A task, e.g. text.chat. Required unless purpose is given.Example: text.chat |
purpose | query | string | A purpose preset id or alias, e.g. read-receipts. |
needs | query | string | Required capabilities, optionally with a level: "input.pdf:native". Comma-separated. |
provider_terms | query | string | Your terms per provider: "openrouter:byok", "gemini:free_tier", "openai:discount:0.2". Comma-separated. |
origin | query | string | Model maker countries or groups: "us", "eu", "not:cn". Comma-separated. |
origin_strict | query | "true" | "false" | Also require a fine-tune's base model maker to match. |
budget | query | "cheap" | "medium" | "premium" | Thirds of the market's prices for the task.Example: cheap |
max_price | query | string | Hard cap on the typical call, in USD, e.g. 0.002. |
optimize | query | "cost" | "quality" | "value" | cost (default), quality or value. |
quality_margin | query | string | For optimize=cost: how far below the best score still counts (default 0.05). |
input_tokens | query | string | Expected input tokens per call. |
output_tokens | query | string | Expected output tokens per call. |
cached_input_tokens | query | string | Input tokens served from the provider's cache. |
prompt_tokens | query | string | Prompt size, for long-prompt price tiers. |
images | query | string | Input images per call. |
output_images | query | string | Generated images per call. |
resolution | query | string | Image resolution key, e.g. "1k". |
pages | query | string | PDF pages per call. |
audio_seconds | query | string | Audio seconds per call. |
video_seconds | query | string | Video seconds per call. |
min_quality | query | string | Minimum quality score, 0–1. |
min_context | query | string | Minimum context window in tokens. |
max_memory_gb | query | string | Local 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_gb | query | string | Local runtimes: GPU memory in GB, for a full offload (unified memory counts as both). |
max_disk_gb | query | string | Local runtimes: free disk in GB for the weights. |
released_after | query | string | YYYY-MM-DD. |
allow_preview | query | "true" | "false" | Allow preview models (default false). |
exclude | query | string | Model ids, vendors, or provider:model pairs to leave out. Comma-separated. |
license | query | string | Accepted open-weight licenses. Comma-separated. |
service_tier | query | "standard" | "batch" | "flex" | "priority" | |
currency | query | string | Adds the typical call converted to this currency, e.g. EUR. |
shape | query | "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). |
strategy | query | "debate" | "red-team" | "competitive" | "hierarchical" | "expert-panel" | "collaborative" | A team strategy preset: its roles and their rules. |
roles | query | string | Team 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. |
length | query | string | Escalation steps, 1–5 (default 3). |
synthesis | query | "true" | "false" | Add a synthesizer role to the team. |
origin_mix | query | string | Team origin rules: "eu:>=1", "cn:<=0", "us:=2". Comma-separated. |
providers_distinct | query | "true" | "false" | Every team member, or escalation step, on a different provider. |
Responses
200body:ResolutionThe 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-Limit400body:Errorinvalid_request (an unknown name or a malformed value:
fieldandallowedsay 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-Limitinvalid_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:Errormissing_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:Erroraccount_suspended; insufficient_scope (the key lacks the scope the endpoint needs:
required_scopenames 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=jevis 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:Errorrequest_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:NoCandidateno_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-Limit429body:Errorrate_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_atandupgrade_urlinstead).Headers:
Retry-After,RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset,X-Quota-Limit,X-Quota-Remaining,X-Quota-Reset,X-Overage-Used,X-Overage-Limitrate_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:PlanResponseThe 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-Limit400body:Errorinvalid_request (an unknown name or a malformed value:
fieldandallowedsay 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-Limitinvalid_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:Errormissing_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:Erroraccount_suspended; insufficient_scope (the key lacks the scope the endpoint needs:
required_scopenames 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=jevis 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:Errorrequest_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:NoCandidateno_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-Limit429body:Errorrate_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_atandupgrade_urlinstead).Headers:
Retry-After,RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset,X-Quota-Limit,X-Quota-Remaining,X-Quota-Reset,X-Overage-Used,X-Overage-Limitrate_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
| Name | In | Type | Description |
|---|---|---|---|
task | query | string | Only models for this task.Example: text.chat |
providers | query | string | Only offerings on these providers. Comma-separated.Example: openrouter |
needs | query | string | Only offerings with these capabilities. Comma-separated. |
include_retired | query | "true" | "false" | Include retired offerings (default false). |
limit | query | string | Page size, 1–500 (default 100).Example: 20 |
offset | query | string | Models to skip (default 0). |
Responses
200body:ModelsListThe 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-Limit400body:Errorinvalid_request (an unknown name or a malformed value:
fieldandallowedsay 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-Limitinvalid_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:Errormissing_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:Erroraccount_suspended; insufficient_scope (the key lacks the scope the endpoint needs:
required_scopenames 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=jevis 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:Errorrequest_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:Errorrate_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_atandupgrade_urlinstead).Headers:
Retry-After,RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset,X-Quota-Limit,X-Quota-Remaining,X-Quota-Reset,X-Overage-Used,X-Overage-Limitrate_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
| Name | In | Type | Description |
|---|---|---|---|
vendorrequired | path | string | The model maker, e.g. google.Example: google |
modelrequired | path | string | The model name, e.g. gemini-3.5-flash-lite.Example: gemini-3.5-flash-lite |
provider | query | string | Only this provider's offering.Example: gemini |
at | query | string | ISO date or time: return the price revision in force then.Example: 2026-06-01 |
Responses
200body:ModelDetailThe 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-Limit400body:Errorinvalid_request (an unknown name or a malformed value:
fieldandallowedsay 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-Limitinvalid_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:Errormissing_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:Erroraccount_suspended; insufficient_scope (the key lacks the scope the endpoint needs:
required_scopenames 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=jevis 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:Errormodel_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-Limitmodel_not_found { "error": { "code": "model_not_found", "message": "No model google/nope", "field": "id" } }413body:Errorrequest_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:Errorrate_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_atandupgrade_urlinstead).Headers:
Retry-After,RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset,X-Quota-Limit,X-Quota-Remaining,X-Quota-Reset,X-Overage-Used,X-Overage-Limitrate_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:PurposesListThe 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-Limit400body:Errorinvalid_request (an unknown name or a malformed value:
fieldandallowedsay 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-Limitinvalid_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:Errormissing_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:Erroraccount_suspended; insufficient_scope (the key lacks the scope the endpoint needs:
required_scopenames 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=jevis 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:Errorrequest_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:Errorrate_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_atandupgrade_urlinstead).Headers:
Retry-After,RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset,X-Quota-Limit,X-Quota-Remaining,X-Quota-Reset,X-Overage-Used,X-Overage-Limitrate_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:VocabularyThe 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-Limit400body:Errorinvalid_request (an unknown name or a malformed value:
fieldandallowedsay 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-Limitinvalid_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:Errormissing_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:Erroraccount_suspended; insufficient_scope (the key lacks the scope the endpoint needs:
required_scopenames 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=jevis 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:Errorrequest_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:Errorrate_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_atandupgrade_urlinstead).Headers:
Retry-After,RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset,X-Quota-Limit,X-Quota-Remaining,X-Quota-Reset,X-Overage-Used,X-Overage-Limitrate_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:LicensesThe 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-Limit400body:Errorinvalid_request (an unknown name or a malformed value:
fieldandallowedsay 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-Limitinvalid_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:Errormissing_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:Erroraccount_suspended; insufficient_scope (the key lacks the scope the endpoint needs:
required_scopenames 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=jevis 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:Errorrequest_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:Errorrate_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_atandupgrade_urlinstead).Headers:
Retry-After,RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset,X-Quota-Limit,X-Quota-Remaining,X-Quota-Reset,X-Overage-Used,X-Overage-Limitrate_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:KeyInfoThe 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-Limit400body:Errorinvalid_request (an unknown name or a malformed value:
fieldandallowedsay 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-Limitinvalid_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:Errormissing_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:Erroraccount_suspended; insufficient_scope (the key lacks the scope the endpoint needs:
required_scopenames 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=jevis 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:Errorrequest_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:Errorrate_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_atandupgrade_urlinstead).Headers:
Retry-After,RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset,X-Quota-Limit,X-Quota-Remaining,X-Quota-Reset,X-Overage-Used,X-Overage-Limitrate_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:HealthThe service is up (status ok or degraded).
Answer schemas
Resolution
{
"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
{
"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
{
"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
{
"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
{
"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
{
"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
{
"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
{
"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
{
"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
{
"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
{
"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
{
"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"
]
}