Models
GET /v1/models
List available models with their capabilities.
Response
Returns available models grouped by provider. Each entry includes a capabilities object describing what the model supports end-to-end through PickLayer’s request pipeline.
{
"data": {
"providers": {
"openai": [{
"provider": "openai",
"model": "gpt-4o-2024-11-20",
"modelString": "openai/gpt-4o-2024-11-20",
"canonical_slug": "gpt-4o-2024-11-20",
"model_kind": "chat",
"capabilities": {
"token_unit": "tokens",
"supports_text": true,
"supports_tools": true,
"supports_vision": true,
"supports_web_search": true,
"supports_web_search_native": false,
"web_search": { "mode": "platform_tool", "source": "derived", "supported": true },
"supports_file_upload": true,
"supports_json_mode": true,
"supports_reasoning": false,
"supports_system_prompt": true,
"max_output_tokens": 16384,
"context_window_tokens": 128000,
"tokenization_hint": "openrouter:openai/gpt-4o-2024-11-20",
"accepted_extensions": ["txt","md","csv","tsv","json","yaml","yml","xml","html","pdf","docx","xlsx","jpg","jpeg","png","gif","webp"],
"accepted_mime_prefixes": ["text/","application/pdf","application/json","application/vnd.openxmlformats-officedocument.","image/"]
}
}]
}
}
}Capabilities
| Field | Type | Description |
|---|---|---|
supports_text | boolean | Model accepts and returns text content. |
supports_vision | boolean | Model accepts image inputs (image_url/input_image). |
supports_tools | boolean | Model supports function/tool calling. |
supports_json_mode | boolean | Model honors response_format: { type: "json" }. |
supports_reasoning | boolean | Model produces reasoning traces (e.g., o1/o3, Claude extended thinking). |
supports_system_prompt | boolean | Model accepts a system role / system instruction. |
supports_web_search | boolean | Web search is available — either via PickLayer’s platform-tool implementation (any tool-capable model) or a provider-native search backend. Frontends should read this field directly to decide whether to surface a “Web Search” toggle. |
supports_web_search_native | boolean | Provider exposes a native web-search tool (Anthropic Brave, Gemini Google Search, xAI Live Search, OpenAI native). |
web_search | object | Detailed web-search metadata: { "mode": "native" | "platform_tool", "source": "openrouter_api" | "provider_table" | "derived", "supported": true }. |
supports_file_upload | boolean | Model accepts file attachments (input_file, image_url, input_audio). |
accepted_extensions | string[] | File extensions (no leading dot) the request pipeline can route end-to-end. Derived from runtime capability — not aspirational. |
accepted_mime_prefixes | string[] | MIME prefixes the request pipeline can route end-to-end. |
context_window_tokens | number | Maximum input context size. |
max_output_tokens | number | Maximum output length the gateway will accept (capped against provider limits). |
tokenization_hint | string | Hint for token counting (e.g., "openrouter:openai/gpt-4o-2024-11-20"); used by /v1/messages/count_tokens and the embedded tokenizer. |
token_unit | string | "tokens" for chat models; "seconds" for STT/TTS. |
supports_web_search derivation
Canonical-additive change.
supports_web_searchand the 11 sibling capability fields described here live on PickLayer’s extendedcapabilitiesobject. The OpenAI-compatible flat-shapeOpenAIModelObjectSchemaexposed at the canonical OpenAI catalog surface is untouched — clients reading the canonical OpenAI shape see no change.
PickLayer’s platform web search works via tool-calling on any tool-capable model. The synthesis rule is:
// Explicit value wins; only derive when the field is undefined.
if (capabilities.supports_web_search === undefined) {
capabilities.supports_web_search = canUsePlatformWebSearch(capabilities);
// canUsePlatformWebSearch returns supports_tools === true
}If a per-provider capability table sets supports_web_search: false explicitly for cost or policy reasons, that value is preserved. If a provider’s enrichment (e.g., OpenRouter’s API) reports supports_web_search: true directly, that wins. Only when the field is otherwise undefined does the gateway fall back to deriving from supports_tools.
This means native-vendor entries that don’t pass through OpenRouter enrichment (e.g., openai/gpt-4o-2024-11-20) now correctly advertise supports_web_search: true instead of leaving the field undefined.
Truthfulness invariant
accepted_extensions and accepted_mime_prefixes are derived from the runtime capability — i.e., the advertised list reflects what the request pipeline can actually process end-to-end. A request with an input_file whose MIME is not in the model’s advertised list returns 400 with a precise param path; no aspirational entries appear in the public list.
Backwards-compatibility note
Until clients ship a supports_web_search read path, they may infer it from supports_tools. Once they pick up the new field, prefer reading it directly: it preserves explicit per-model overrides that a supports_tools-only inference would miss.
Query parameters
| Parameter | Description |
|---|---|
provider | Comma-separated filter (e.g., provider=openai,anthropic). |
/v1/models/available is an alias for the same response.