---
title: "List models, per-role runtime defaults, and the system default fallback chain"
method: GET
path: "/v1/model-router/catalog"
tags: ["model-router"]
---

# List models, per-role runtime defaults, and the system default fallback chain

`GET /v1/model-router/catalog`

Selectable models + the code-default model each runtime role falls back to.

The role defaults mirror the runtime constants (single-sourced via
``src.runtime.model_defaults.ROLE_DEFAULTS``, which imports the SAME constants
the runtime applies) so the UI can show what's actually used — model + effort +
max_tokens + temperature + thinking budget — when an entity leaves a setting
unset. Imported lazily inside the handler: ``model_router`` deliberately never
imports ``src.runtime`` at module scope (the runtime imports
``model_router.service`` — a top-level import here risks a cycle).

## Response `200`

Successful Response

- ModelCatalogResponse — Selectable models, per-role code defaults, and the system default fallback chain. ``default_chain`` is the platform-level fallback chain (a hardcoded constant from ``src.model_router.defaults``) used when no org-level default router config exists. It is read-only — there is no API to mutate it.
  - `models` AvailableModel[], required
    - `model_identifier` string, required
    - `provider` string, required
    - `supports_streaming` boolean, required
    - `supports_tools` boolean
    - `supports_vision` boolean
    - `max_context_window` integer, required
    - `regions` string[]
    - `family` string
    - `supports_json_schema` boolean
    - `supports_reasoning_effort` boolean
    - `allowed_efforts` string[]
    - `fastest_effort` string, nullable
    - `supports_temperature` boolean
    - `supports_thinking` boolean
    - `supports_thinking_budget` boolean
    - `supports_audio` boolean
    - `compliance_tags` string[]
    - `input_price_per_1m` number, required
    - `output_price_per_1m` number, required
  - `role_defaults` RoleModelDefault[], required
    - `role` string, required
    - `model` string, required
    - `reasoning_effort` string, nullable
    - `max_tokens` integer, nullable
    - `temperature` number, nullable
    - `thinking_budget` integer, nullable
  - `default_chain` ModelChainEntry[], required
    - `model` string, required
    - `config` ModelConfig
      - `temperature` number, nullable
      - `max_tokens` integer, nullable
      - `top_p` number, nullable
      - `stop_sequences` string[], nullable
      - `reasoning_effort` 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max', nullable
      - `request_timeout_ms` integer, nullable
      - `thinking_budget` integer, nullable

## Other responses

- `400` — Bad request
- `401` — Authentication required

---

[API](https://skmtc.net/oneloop-hq/apis/feather-api.md) · [All operations](https://skmtc.net/oneloop-hq/apis/feather-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/oneloop-hq/feather-api/revisions/5a5597ebb2d6/schema)
