Skip to main content
GET
List the model mappings for one provider

Authorizations

Authorization
string
header
required

A Barndoor API key, sent as Authorization: Bearer <key>. Keys are prefixed bdai_ and are opaque — do not attempt to decode one. Interchangeable with an OAuth 2.0 access token.

Path Parameters

provider_id
string<uuid>
required

Identifier, a UUID

Response

The requested record

cooldown_429_default_secs
integer<int32>
required

Cooldown on a 429 with no usable Retry-After, seconds.

cooldown_base_secs
integer<int32>
required

First cooldown window, doubled on each failed recovery probe up to cooldown_max_secs.

cooldown_failure_threshold
integer<int32>
required

Gateway failures within cooldown_window_secs that cool the route. 0 disables every cooldown of the shared route.

cooldown_max_secs
integer<int32>
required

Cap on every cooldown window.

cooldown_overloaded_secs
integer<int32>
required

Flat cooldown on a 529 "overloaded" with no usable Retry-After, seconds. 0 counts a 529 as an ordinary gateway failure instead.

cooldown_window_secs
integer<int32>
required

Width of the rolling failure window, seconds.

bare_alias
boolean
required

When true the row participates in bare-name resolution (POST /v1/chat/completions {"model": "<alias>"}). Route targets are true; enablements (kind = model) are always false and are addressable solely via the explicit <provider>/<upstream> form.

enabled
boolean
required
id
string<uuid>
required
kind
enum<string>
required

Whether this row is the model's enablement or a route target — see [MappingKind]. Never inferred from model_alias == upstream_model: a route may carry its upstream's name (migration V84).

Available options:
model,
route
model_alias
string
required
priority
integer<int32>
required
provider_id
string<uuid>
required
retry_on_429_count
integer<int32>
required

Same-route retries on upstream 429. 0 means immediate failover.

retry_on_429_max_wait_secs
integer<int32>
required

Cap on honoring upstream Retry-After header. 0 means use a small built-in default and ignore the header value.

source
enum<string>
required

Whether the model was picked from the provider catalog or typed in by an admin. Stamped once at create time and never recomputed — see [ModelSource] and migration V61.

Available options:
catalog,
custom
upstream_model
string
required
effective_pricing
object
required

The rate a request against this mapping would be billed at, resolved through the same tier chain the cost calculator uses (BCP-3564). Always present; source == "none" means unpriced. See [crate::effective_pricing].

created_by_email
string | null
created_by_name
string | null
created_by_user_id
string<uuid> | null
last_change_note
string | null

Optional free text explaining why the last change was made ("Raised for the Q3 batch job", "Vendor deprecated the old endpoint").

Admin-authored and rendered in the portal, so it is untrusted input: length-capped here, escaped on render.

last_modified_at
string<date-time> | null

When the change named by last_modified_by_* happened.

Its own column rather than the row's updated_at, because updated_at is bumped by writes nobody is attributed for -- pairing the two would date a named admin's edit to a background job's clock. See the V75 migration for the full reasoning.

last_modified_by_email
string | null
last_modified_by_name
string | null
last_modified_by_user_id
string<uuid> | null
auto_disabled_reason
enum<string> | null

Set when the gateway turned this row off (BCP-3811's full sync retiring a model the catalog dropped). None means a human decided the enabled flag, and the reconciler will not touch it in either direction — see migration V63. Any admin write to enabled clears this.

Clearing it is not a durable claim on the row, and it is easy to read it that way. It protects a human's disable — the re-enable branch requires the marker to be present, so a row a human turned off is never turned back on. It cannot protect a human's re-enable: a cleared marker is exactly what makes the row eligible for retirement again, so under full a model the catalog still does not list is re-disabled on the next tick. That is full's contract ("enabled set tracks the catalog"), not a bug — see model_sync::tests::re_enabling_a_dropped_model_is_retired_again_on_the_next_tick.

Available options:
catalog_retired
request_timeout_secs
integer<int32> | null

Per-mapping (route-tier / model-tier) total-request timeout for non-streaming requests (streaming responses have no total timeout). Defaults to TOTAL_REQUEST_TIMEOUT_DEFAULT_SECS at insert. On a route target this is the route tier; on the enablement (kind = model) it is the model tier consulted by the resolver for every route target of that model. The range is fixed platform policy (TOTAL_REQUEST_TIMEOUT_MIN_SECS..=TOTAL_REQUEST_TIMEOUT_MAX_SECS), enforced by the column CHECK.

stream_idle_timeout_secs
integer<int32> | null

Per-mapping stream-idle (per-chunk) timeout for streaming responses. Defaults to STREAM_IDLE_TIMEOUT_DEFAULT_SECS at insert; enforced via tokio::time::timeout around each upstream SSE/eventstream chunk read. The range is fixed platform policy (STREAM_IDLE_TIMEOUT_MIN_SECS..=STREAM_IDLE_TIMEOUT_MAX_SECS), enforced by the column CHECK.

budget_status
object | null

Populated when a LlmProvider / Model / ModelAlias budget with action_on_exhaust = block is currently exhausted for the mapping's (provider_id, upstream_model, model_alias) triple. Runtime would drop this route from the resolved plan; the pill surfaces the same state without filtering the row out of the listing.

route_health_status
object | null

Populated when the mapping's (provider_id, upstream_model) route is in a passive-health cooldown. The page renders a "temporarily unavailable" pill; the row stays in the listing.

stale_status
object | null

Populated when the model is enabled from a provider catalog that no longer lists it (BCP-3812). Advisory: nothing is disabled on the strength of it — retirement is BCP-3811's full mode, which the org opts into. See [crate::catalog_status].