List model providers
const url = 'https://example.com/v1/providers?limit=25';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://example.com/v1/providers?limit=25' \ --header 'Authorization: Bearer <token>'Cursor-paginated. Optional ?feature= filters to providers whose metadata.features includes the given feature (exact match).
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”1..100. Default 25.
Where the previous page ended: its nextCursor, as it came. A runtime that seals cursors takes one only for the same list, filters and caller, within a day; otherwise 400 bad-input, and the list starts again without it. Absent → first page.
For /v1/capabilities: prefix match on feature. For /v1/providers: exact match against metadata.features[].
Responses
Section titled “Responses”Page of providers.
object
object
Region the connection routes to. All models on this provider share the region (the same models served from two clouds or regions are separate providers). 'unspecified' when not region-scoped.
Models this connection exposes. Non-empty. models[i].name must be unique within the list.
object
Vendor-facing model id passed to the SDK (e.g. claude-sonnet-5-5).
Context window in tokens.
Features this model supports (tool-use, thinking, structured-output, …).
USD per 1K tokens. An adapter may take more rate fields (see the adapter’s README).
object
Best-effort p95 latency estimate in milliseconds. Varies by model.
The default cap on a call’s output tokens: what a call asks for when it sets none. A call’s own ModelCallInput.maxOutputTokens (its agent’s maxOutputTokens) replaces it. Not the model’s own maximum, which its vendor sets.
Whether the model takes sampling settings (temperature). false: its API rejects a non-default value, so the call goes without one and the answer’s warnings say so (sampling-unsupported). Absent: it takes them.
How the model thinks before it answers, and the levels it takes, so a call’s level (an agent’s model settings, or a judge’s lowest) is sent as one it takes: any other is rounded to the next one it takes, or its highest, with a thinking-level-adjusted warning. Absent: it doesn’t think, or nothing is known, and nothing is sent for it.
object
adaptive: on unless turned down. always: on, and it can only be lowered.
The vendor’s own setting for the least thinking: for Anthropic disabled, between_tools or an effort (low); for Gemini a thinking level (low, minimal); for OpenAI a reasoning effort (low, none).
The levels the model takes besides lowest, least first. Absent: low, medium and high, which every thinking model takes, plus minimal when lowest is minimal, minus those below lowest when it is low, medium or high (any case).
The level a call that asks none is sent. It must be lowest or one the model takes (levels), or the registration is refused. Absent: the vendor’s default.
Short per-model description surfaced in logs.
The model to use when an agent doesn’t choose: one of models[].name. When candidates rank equally, it comes before the provider’s other models; without it, ties break by model name. A preset sets it. A runtime before 0.1.4 ignores it.
Soft attributes for preference-ranking (local, lower-cost, higher-accuracy, …). Matched by string equality against Preference.feature.
Short human description of the connection.
Kind of resource this provider fulfils. Absent = llm-inference. Adapters for other kinds (embedding, gpu-compute, sandbox-exec, …) set this explicitly.
A fallback serves a capability only when no other provider satisfies it (e.g. kindgi dev’s scripted dev-echo); an agent turn routed to one carries a fallback-provider warning. Absent = false.
Bookkeeping, such as who manages the provider; the router ignores labels. At most 32 keys; a key is 1-63 lowercase letters and digits, with ., -, _ or / inside; a value is at most 256 characters. The convention key kindgi.com/managed-by names the manager (kindgi-dev, kindgi-deploy:<environment>). Out of bounds: 400 invalid-provider, reason invalid-labels.
object
Example
{ "data": [ { "models": [ { "features": [ "structured-output" ], "thinking": { "mode": "adaptive", "levels": [ "minimal" ], "default": "lowest" } } ] } ]}Malformed query parameter.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Missing / malformed / expired / revoked bearer token.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Not a member of the workspace (permission-denied). Without an authorization store, anyone reads it.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}The database was too busy to answer in time (database-busy); Retry-After (whole seconds) says when to try again.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}