---
title: "List Model Router requests"
method: GET
path: "/v1/routers/{id}/requests"
tags: ["Model Router"]
---

# List Model Router requests

`GET /v1/routers/{id}/requests`

Paginated routing history for live Model Router requests (successful routes and failures). Playground dry runs are not recorded.

## Path parameters

- `id` string, uuid, required

## Query parameters

- `cursor` string
- `limit` integer, required

## Headers

- `X-Runway-Version` '2024-11-06', required

## Response `200`

Paginated routing history for a Model Router.

- object
  - `data` object[], required — The list of items for the current page.
    - `id` string, uuid, required
    - `requestId` string, required
    - `status` 'routed' | 'no_eligible_model' | 'router_config_not_found' | 'invalid_request' | 'error', required — How the routing attempt ended: routed (model selected), no_eligible_model (hard filters emptied the pool), router_config_not_found (same condition as the generate error of that name), invalid_request, or error.
    - `model` string, nullable, required
    - `provider` string, nullable, required
    - `reason` string, nullable, required — Free-text explanation of the pick. Written by the ranker, so treat it as prose for humans and group on reasonCode instead.
    - `reasonCode` 'lowest_cost' | 'best_latency' | 'best_quality' | 'only_eligible_model' | 'filter_order_fallback', nullable, required — Why the model won: lowest_cost, best_latency, best_quality, only_eligible_model, or filter_order_fallback (ranking was unavailable, so hard-filter order stood). Null when the request never reached ranking.
    - `estimatedCredits` number, nullable, required
    - `taskId` string, uuid, nullable, required
    - `createdAt` string, date-time, required
    - `pipeline` union[], required — Ordered routing story: hard-filter stages with surviving model ids, a capacity step when concurrency limits affected the pool, then rank step when selection reached ranking.
      - union
        - object
          - `type` 'filter', required
          - `filter` 'capability' | 'prompt_length' | 'input_support' | 'allow_deny' | 'price', required — Hard-filter stage that ran: capability (modality/feature fit), prompt_length (prompt within model limits), input_support (requested inputs/assets), allow_deny (router model allowlist/denylist), or price (credit ceiling).
          - `models` string[], required — Model IDs of the models that remained eligible after this filter stage.
        - object
          - `type` 'capacity', required
          - `skipped` string[], required — Model IDs that were eligible but passed over because the account was at its concurrency limit for them.
          - `allExhausted` boolean, required — True when every eligible model was at its limit, in which case none was skipped and the selected task queues.
        - object
          - `type` 'rank', required
          - `outcome` 'cost' | 'selected' | 'fallback' | 'single_candidate', required — How the router chose among eligible models: cost (sorted by estimated credits), selected (preference ranking chose a model), fallback (preference ranking failed so the eligible models were left in filter order), or single_candidate (only one model remained).
    - `emptiedBy` string[], required — The filter(s) that reduced the eligible pool to zero.
  - `hasMore` boolean, required — Whether there are more items available after this page.
  - `nextCursor` string, nullable, required — Cursor to use for fetching the next page, or null if there are no more pages.

---

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