---
title: "List model endpoints"
description: "Who serves one model, one entry per cloud platform."
canonical: "https://pirouter.ai/docs/api/list-model-endpoints"
last-updated: "2026-10-13"
lang: "en"
---

# List model endpoints

Who serves one model, one entry per cloud platform.

`GET https://api.pirouter.ai/v1/models/{vendor}/{model}/endpoints`

The upstream view of one catalog model. A platform serves the model when one of its deployments does by `contracts.Serves` — model, deployment and resource active, upstream key sealed: the router's candidate set. The site catalog's `pi.providers` and the routing page's providers use the same rule, so all three name the same platforms; health is not part of it. Entries are ONE per platform: the facts of its best deployment — not `down` before `down`, then highest weight, ties broken by id. Entries are ordered by that deployment's weight, highest first, then platform id.

Only publishable facts are rendered: protocols and endpoints, token limits, the channel's base price, effective capabilities and the upstream's data policy. Regions, accounts, resources and deployment names never appear, and every object here is closed.

A model that is absent or not listable is the same `404 model_not_found` as `GET /v1/models/{vendor}/{model}`. A listable model with nothing able to serve it right now is `200` with an empty `endpoints` list.

Public: no API key is required and none is read.

## Authorization

This endpoint is public: no API key is required and none is read.

## Path parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `vendor` | string | Yes | The left half of the model slug, matched exactly. |
| `model` | string | Yes | The right half of the model slug, matched exactly. |

## Response

`200` `application/json`

The model's upstream view.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | object | Yes | One model's upstream view. |
| `data.id` | string | Yes | The model slug, as in the catalog. |
| `data.aliases` | string[] | Yes | Other names the model is accepted under in the `model` field, sorted. |
| `data.openness` | string | Yes | How open the model is (contracts `openness_levels`) — open_source, open_weights or proprietary. |
| `data.model_page_url` | string \| null | Yes | The model's page, meaning set by `openness` — the source repo, the weights page, or the vendor's model page. Passed through verbatim; null when not recorded. |
| `data.capabilities` | string[] | Yes | The model's capabilities (contracts `model_capabilities` ids, `supports_*`), in vocabulary order; only those it has. |
| `data.protocols` | string[] | Yes | Inbound protocols at least one entry accepts (contracts `protocols` ids), in vocabulary order. |
| `data.supported_endpoints` | string[] | Yes | API endpoints at least one entry serves (contracts `endpoints` ids), in vocabulary order. |
| `data.endpoints` | object[] | Yes | One entry per cloud platform able to serve the model; empty when none can right now. |
| `data.endpoints[].provider` | string | Yes | The cloud platform id (contracts `platforms`). The site maps it to a display name. |
| `data.endpoints[].provider_type` | string | Yes | The supply relation (contracts `resource_types`) — first_party, cloud_infra, reseller or private. |
| `data.endpoints[].headquarters` | string \| null | Yes | The upstream operator's headquarters, ISO 3166-1 alpha-2; null when undeclared. |
| `data.endpoints[].protocols` | string[] | Yes | Inbound protocols this platform accepts for the model (contracts `protocols` ids). |
| `data.endpoints[].supported_endpoints` | string[] | Yes | API endpoints this platform serves for the model (contracts `endpoints` ids). |
| `data.endpoints[].context_length` | integer \| null | Yes | Context window in tokens on this platform; null when undeclared. |
| `data.endpoints[].max_prompt_tokens` | integer \| null | Yes | Prompt-token ceiling on this platform; null when undeclared. |
| `data.endpoints[].max_completion_tokens` | integer \| null | Yes | Completion-token ceiling on this platform; null when undeclared. |
| `data.endpoints[].quantization` | string \| null | Yes | Precision this platform runs (contracts `quantizations`); null when undeclared. |
| `data.endpoints[].supports_stream_cancellation` | boolean | Yes | Whether aborting a stream stops billing on this platform. |
| `data.endpoints[].capabilities` | string[] | Yes | Effective capabilities on this platform — the model's, narrowed by the channel (contracts `model_capabilities` ids), in vocabulary order. |
| `data.endpoints[].pricing` | object | Yes | Effective prices now on this channel — what a request routed here is billed. Context brackets under `overrides` are at this channel's effective price too. |
| `data.endpoints[].pricing.prompt` | string | Yes | Input text, USD per token. Always present; "0" when the model has no input-text price (an image or audio model, say). |
| `data.endpoints[].pricing.completion` | string | Yes | Output text, USD per token. Always present; "0" when the model has no output-text price (an embedding model, say). |
| `data.endpoints[].pricing.request` | string | No | Flat charge per request, USD. |
| `data.endpoints[].pricing.image` | string | No | Input image, USD per image. |
| `data.endpoints[].pricing.image_output` | string | No | Output image, USD per token. |
| `data.endpoints[].pricing.audio` | string | No | Input audio, USD per token. |
| `data.endpoints[].pricing.audio_output` | string | No | Output audio, USD per token. |
| `data.endpoints[].pricing.input_audio_cache` | string | No | Cached input audio read, USD per token. |
| `data.endpoints[].pricing.web_search` | string | No | Built-in web search, USD per call. |
| `data.endpoints[].pricing.internal_reasoning` | string | No | Reasoning output tokens, USD per token. |
| `data.endpoints[].pricing.input_cache_read` | string | No | Cached input text read, USD per token. |
| `data.endpoints[].pricing.input_cache_write` | string | No | Cached input text write, USD per token (the vendor's default cache TTL). |
| `data.endpoints[].pricing.input_cache_write_1h` | string | No | Cached input text write at the one-hour TTL, USD per token; present only when the vendor prices that tier separately. |
| `data.endpoints[].pricing.image_token` | string | No | Input image, USD per token — the per-token tier, distinct from `image`, which is priced per whole image. |
| `data.endpoints[].pricing.overrides` | object[] | No | Context brackets above the base one, ascending by min_prompt_tokens (an INCLUSIVE lower bound on the prompt context length in tokens). A request is billed at the bracket with the largest min_prompt_tokens at or below its prompt context length; the base prices above cover everything below the first bracket. Absent when the model is single-priced. Each bracket renders exactly the classes IT declares — brackets replace, never merge — so a class missing from a bracket is a class that bracket does not restate, not one it prices at zero. |
| `data.endpoints[].pricing.overrides[].min_prompt_tokens` | integer | Yes | Inclusive lower bound on the prompt context length (tokens) from which this bracket applies. |
| `data.endpoints[].pricing.overrides[].prompt` | string | No |  |
| `data.endpoints[].pricing.overrides[].completion` | string | No |  |
| `data.endpoints[].pricing.overrides[].request` | string | No |  |
| `data.endpoints[].pricing.overrides[].image` | string | No |  |
| `data.endpoints[].pricing.overrides[].image_output` | string | No |  |
| `data.endpoints[].pricing.overrides[].audio` | string | No |  |
| `data.endpoints[].pricing.overrides[].audio_output` | string | No |  |
| `data.endpoints[].pricing.overrides[].input_audio_cache` | string | No |  |
| `data.endpoints[].pricing.overrides[].web_search` | string | No |  |
| `data.endpoints[].pricing.overrides[].internal_reasoning` | string | No |  |
| `data.endpoints[].pricing.overrides[].input_cache_read` | string | No |  |
| `data.endpoints[].pricing.overrides[].input_cache_write` | string | No |  |
| `data.endpoints[].pricing.overrides[].input_cache_write_1h` | string | No |  |
| `data.endpoints[].pricing.overrides[].image_token` | string | No |  |
| `data.endpoints[].list_pricing` | object | Yes | The model's list prices, the same object as the catalog Model's `pricing`. Equal to `pricing` unless a discount or channel price applies. |
| `data.endpoints[].list_pricing.prompt` | string | Yes | Input text, USD per token. Always present; "0" when the model has no input-text price (an image or audio model, say). |
| `data.endpoints[].list_pricing.completion` | string | Yes | Output text, USD per token. Always present; "0" when the model has no output-text price (an embedding model, say). |
| `data.endpoints[].list_pricing.request` | string | No | Flat charge per request, USD. |
| `data.endpoints[].list_pricing.image` | string | No | Input image, USD per image. |
| `data.endpoints[].list_pricing.image_output` | string | No | Output image, USD per token. |
| `data.endpoints[].list_pricing.audio` | string | No | Input audio, USD per token. |
| `data.endpoints[].list_pricing.audio_output` | string | No | Output audio, USD per token. |
| `data.endpoints[].list_pricing.input_audio_cache` | string | No | Cached input audio read, USD per token. |
| `data.endpoints[].list_pricing.web_search` | string | No | Built-in web search, USD per call. |
| `data.endpoints[].list_pricing.internal_reasoning` | string | No | Reasoning output tokens, USD per token. |
| `data.endpoints[].list_pricing.input_cache_read` | string | No | Cached input text read, USD per token. |
| `data.endpoints[].list_pricing.input_cache_write` | string | No | Cached input text write, USD per token (the vendor's default cache TTL). |
| `data.endpoints[].list_pricing.input_cache_write_1h` | string | No | Cached input text write at the one-hour TTL, USD per token; present only when the vendor prices that tier separately. |
| `data.endpoints[].list_pricing.image_token` | string | No | Input image, USD per token — the per-token tier, distinct from `image`, which is priced per whole image. |
| `data.endpoints[].list_pricing.overrides` | object[] | No | Context brackets above the base one, ascending by min_prompt_tokens (an INCLUSIVE lower bound on the prompt context length in tokens). A request is billed at the bracket with the largest min_prompt_tokens at or below its prompt context length; the base prices above cover everything below the first bracket. Absent when the model is single-priced. Each bracket renders exactly the classes IT declares — brackets replace, never merge — so a class missing from a bracket is a class that bracket does not restate, not one it prices at zero. |
| `data.endpoints[].list_pricing.overrides[].min_prompt_tokens` | integer | Yes | Inclusive lower bound on the prompt context length (tokens) from which this bracket applies. |
| `data.endpoints[].list_pricing.overrides[].prompt` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].completion` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].request` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].image` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].image_output` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].audio` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].audio_output` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].input_audio_cache` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].web_search` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].internal_reasoning` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].input_cache_read` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].input_cache_write` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].input_cache_write_1h` | string | No |  |
| `data.endpoints[].list_pricing.overrides[].image_token` | string | No |  |
| `data.endpoints[].discount` | object \| null | Yes | Non-null while the bracket billing settles against on this channel is a discount below list. |
| `data.endpoints[].discount.percent_off` | integer | Yes | Percent off this channel's list price, rounded, computed as in CatalogDiscount. |
| `data.endpoints[].discount.ends_at` | string \| null | Yes | When the discount ends, UTC, exclusive; null for no end. |
| `data.endpoints[].data_policy` | object | Yes | The upstream's data policy as recorded in the registry. |
| `data.endpoints[].data_policy.prompt_training` | boolean \| null | Yes | Whether the upstream trains on prompts; null = unknown. |
| `data.endpoints[].data_policy.data_retention` | string | Yes | Contracts `data_retention_levels` id; `unknown` when not recorded. |
| `data.endpoints[].data_policy.moderation` | string | Yes | Who moderates (contracts `moderation_responsibilities`). |
| `data.endpoints[].data_policy.reviewed` | boolean | Yes | True once an operator has reviewed these fields against the upstream's published terms. |

## Errors

| Status | Code | Description |
| --- | --- | --- |
| `404` | `model_not_found` | No such listable model (`model_not_found`). |
| `default` | `internal_error` | Unexpected platform-side failure (`internal_error`). |

Error body

```json
{
  "error": {
    "code": "model_not_found",
    "message": "string"
  }
}
```

## Request samples

cURL

```bash
curl https://api.pirouter.ai/v1/models/anthropic/claude-sonnet-5.5/endpoints
```

Python

```python
import requests

response = requests.get("https://api.pirouter.ai/v1/models/anthropic/claude-sonnet-5.5/endpoints")
print(response.json())
```

TypeScript

```ts
const response = await fetch('https://api.pirouter.ai/v1/models/anthropic/claude-sonnet-5.5/endpoints')
console.log(await response.json())
```

## Response sample

`200` `application/json`

```json
{
  "data": {
    "id": "anthropic/claude-opus-5.5",
    "aliases": [
      "string"
    ],
    "openness": "open_weights",
    "model_page_url": null,
    "capabilities": [
      "string"
    ],
    "protocols": [
      "string"
    ],
    "supported_endpoints": [
      "string"
    ],
    "endpoints": [
      {
        "provider": "azure",
        "provider_type": "string",
        "headquarters": "US",
        "protocols": [
          "string"
        ],
        "supported_endpoints": [
          "string"
        ],
        "context_length": null,
        "max_prompt_tokens": null,
        "max_completion_tokens": null,
        "quantization": null,
        "supports_stream_cancellation": false,
        "capabilities": [
          "string"
        ],
        "pricing": {
          "prompt": "0.000003",
          "completion": "0.000015"
        },
        "list_pricing": {
          "prompt": "0.000003",
          "completion": "0.000015"
        },
        "discount": {
          "percent_off": 30,
          "ends_at": "2026-10-31T15:59:59Z"
        },
        "data_policy": {
          "prompt_training": null,
          "data_retention": "string",
          "moderation": "string",
          "reviewed": false
        }
      }
    ]
  }
}
```
