# Discover authorized models and run capabilities

Service accounts use organization entitlements. A creator's personal model subscription is never inherited.

`GET /api/model-providers`

Required permission: `modelKey:read`.

## Example request

```bash
curl --request GET \
  --url https://api.hoplite.sh/api/model-providers \
  --header "X-Api-Key: $HOPLITE_API_KEY"
```

## 200 response

Successful response

Content type: `application/json`. Response type: `object`.

| Field | Type | Required | Constraints | Description |
| --- | --- | --- | --- | --- |
| `ok` | `boolean` | Yes | constant true | — |
| `modelConfigurationRevision` | `string` | Yes | — | — |
| `providers` | `object[]` | Yes | — | — |
| `providers.provider` | `string` | Yes | openai · anthropic · google · xai · deepseek · openrouter | — |
| `providers.label` | `string` | Yes | — | — |
| `providers.defaultModelId` | `string` | Yes | — | — |
| `runConfig` | `object` | Yes | — | — |
| `runConfig.defaultModelId` | `string` | Yes | min length 1 | — |
| `runConfig.defaultReasoning` | `string` | Yes | off · none · minimal · low · medium · high · xhigh · max | — |
| `runConfig.defaultSpeed` | `string` | Yes | standard · fast | — |
| `runConfig.defaultsVersion` | `integer` | Yes | max 9007199254740991 | — |
| `runConfig.modelFallbackIds` | `string[]` | Yes | — | — |
| `runConfig.modelFallbackIds.[item]` | `string` | No | min length 1 | — |
| `runConfig.providerMappingsVersion` | `integer` | Yes | max 9007199254740991 | — |
| `runConfig.reasoningOptions` | `string[]` | Yes | — | — |
| `runConfig.reasoningOptions.[item]` | `string` | No | off · none · minimal · low · medium · high · xhigh · max | — |
| `runConfig.speedOptions` | `string[]` | Yes | — | — |
| `runConfig.speedOptions.[item]` | `string` | No | standard · fast | — |
| `models` | `object[]` | Yes | — | — |
| `models.id` | `string` | Yes | — | — |
| `models.name` | `string` | Yes | — | — |
| `models.provider` | `string` | Yes | — | — |
| `models.contextVariantOf` | `string` | No | — | — |
| `models.compatibleModelIds` | `string[]` | No | — | — |
| `models.compatibleModelIds.[item]` | `string` | No | — | — |
| `models.requiredPlan` | `string` | No | constant "pro" | — |
| `models.usageMultiplier` | `number` | No | — | — |
| `models.pricing` | `object` | No | — | — |
| `models.pricing.inputMicrosPerMTok` | `number` | Yes | — | — |
| `models.pricing.outputMicrosPerMTok` | `number` | Yes | — | — |
| `models.capabilities` | `object` | No | — | — |
| `models.capabilities.contextWindowTokens` | `number` | No | — | — |
| `models.capabilities.reasoningLevels` | `string[]` | Yes | — | — |
| `models.capabilities.reasoningLevels.[item]` | `string` | No | — | — |
| `models.capabilities.supportsFast` | `boolean` | Yes | — | — |
| `models.capabilities.supportsImages` | `boolean` | No | — | — |

```json

```

## Response headers

| Header | Type | Statuses | Description |

| --- | --- | --- | --- |

| `RateLimit` | `string` | `200`, `400`, `401`, `402`, `403`, `404`, `409`, `410`, `429`, `500`, `501`, `503` | Current ingress policy, remaining requests, and seconds until reset, for example `"ingress";r=599;t=60`. |

| `RateLimit-Policy` | `string` | `200`, `400`, `401`, `402`, `403`, `404`, `409`, `410`, `429`, `500`, `501`, `503` | Ingress quota and window, for example `"ingress";q=600;qu="requests";w=60`. |

| `X-RateLimit-Limit` | `integer` | `200`, `400`, `401`, `402`, `403`, `404`, `409`, `410`, `429`, `500`, `501`, `503` | Maximum requests allowed in the current rolling window. |

| `X-RateLimit-Remaining` | `integer` | `200`, `400`, `401`, `402`, `403`, `404`, `409`, `410`, `429`, `500`, `501`, `503` | Requests remaining in the current rolling window. |

| `X-RateLimit-Reset` | `integer` | `200`, `400`, `401`, `402`, `403`, `404`, `409`, `410`, `429`, `500`, `501`, `503` | Unix timestamp when the current rolling window resets. |

| `x-request-id` | `string` | `200`, `400`, `401`, `402`, `403`, `404`, `409`, `410`, `429`, `500`, `501`, `503` | Request correlation ID. |

| `Retry-After` | `integer` | `429`, `503` | Seconds until another request should be attempted. |

| `X-Retry-After` | `integer` | `429`, `503` | Legacy retry delay in seconds. |

## Status codes

- `200` — Successful response

- `400` — Invalid request. Validation responses include field paths.

- `401` — The API key is missing, invalid, or lacks the operation's permission.

- `402` — The organization does not have access to the requested product capability.

- `403` — The key's current user no longer has the required organization membership or role.

- `404` — The resource is not available in the authenticated scope.

- `409` — The request conflicts with a retry receipt or current resource state.

- `410` — The event cursor has expired; capture a fresh head and resource snapshot.

- `429` — The API-key rate limit has been exceeded.

- `500` — The API encountered an unexpected failure.

- `501` — The deployment has not configured the requested capability.

- `503` — A required API dependency, including the rate limiter, is unavailable.