# LLM Gateway — Full Documentation > LLM Gateway is an open-source, OpenAI-compatible API gateway for routing, managing, and analyzing requests across LLM providers. Use one API key, track usage and cost, configure caching and guardrails, and self-host or use the managed cloud. Current models and pricing: https://llmgateway.io/models API base URL: https://api.llmgateway.io/v1 · Docs: https://docs.llmgateway.io · Site: https://llmgateway.io This file concatenates the full text of every documentation page below. ## Contents Start with https://docs.llmgateway.io/llms.txt for the full page index. Read a linked Markdown page when you need one topic; this complete file may exceed an agent context window. - [Airside](https://docs.llmgateway.io/llms.mdx/airside) - [DevPass](https://docs.llmgateway.io/llms.mdx/devpass) - [Lounge](https://docs.llmgateway.io/llms.mdx/lounge) - [Introduction to LLM Gateway](https://docs.llmgateway.io/llms.mdx/index) - [Overview](https://docs.llmgateway.io/llms.mdx/overview) - [Quickstart](https://docs.llmgateway.io/llms.mdx/quick-start) - [Coding tool guides](https://docs.llmgateway.io/llms.mdx/guides) - [Health check](https://docs.llmgateway.io/llms.mdx/health) - [Create speech](https://docs.llmgateway.io/llms.mdx/v1_audio_speech) - [Create transcription](https://docs.llmgateway.io/llms.mdx/v1_audio_transcriptions) - [Chat Completions](https://docs.llmgateway.io/llms.mdx/v1_chat_completions) - [Decisions](https://docs.llmgateway.io/llms.mdx/v1_decisions) - [Embeddings](https://docs.llmgateway.io/llms.mdx/v1_embeddings) - [Edit image](https://docs.llmgateway.io/llms.mdx/v1_images_edits) - [Create image](https://docs.llmgateway.io/llms.mdx/v1_images_generations) - [Retrieve key status](https://docs.llmgateway.io/llms.mdx/v1_key_retrieve) - [Anthropic Messages](https://docs.llmgateway.io/llms.mdx/v1_messages) - [Models](https://docs.llmgateway.io/llms.mdx/v1_models) - [Moderations](https://docs.llmgateway.io/llms.mdx/v1_moderations) - [OCR](https://docs.llmgateway.io/llms.mdx/v1_ocr) - [Create a realtime client secret](https://docs.llmgateway.io/llms.mdx/v1_realtime_client_secrets) - [Rerank](https://docs.llmgateway.io/llms.mdx/v1_rerank) - [Search](https://docs.llmgateway.io/llms.mdx/v1_search) - [System One](https://docs.llmgateway.io/llms.mdx/v1_systemone) - [Video content](https://docs.llmgateway.io/llms.mdx/v1_videos_content) - [Create video](https://docs.llmgateway.io/llms.mdx/v1_videos_create) - [Video log content](https://docs.llmgateway.io/llms.mdx/v1_videos_log_content) - [Retrieve video](https://docs.llmgateway.io/llms.mdx/v1_videos_retrieve) - [LLM Gateway Developer Resources](https://docs.llmgateway.io/llms.mdx/developers) - [Introduction](https://docs.llmgateway.io/llms.mdx/learn) - [Self Host LLM Gateway](https://docs.llmgateway.io/llms.mdx/self-host) # Airside URL: https://docs.llmgateway.io/airside Airside is where the companies behind the models run their listing on LLM Gateway. It uses an airport metaphor: LLM Gateway is the airport, developers are passengers, and providers are **carriers**. As a carrier you claim your provider, register your fleet of models, file your fares, and see the traffic that reaches you. ## Quick start [#quick-start] ### Sign up with your company email [#sign-up-with-your-company-email] Create an account at [airside.llmgateway.io](https://airside.llmgateway.io). The domain of your verified email must match your provider's API endpoint or website to claim it. ### Claim or register your carrier [#claim-or-register-your-carrier] Claim an existing catalogue provider, or register a new one. The LLM Gateway team reviews every claim before the carrier goes live. ### Register your fleet and file fares [#register-your-fleet-and-file-fares] Add each model with its context size and capabilities, and file its per-token prices. Every model must pass preflight, which runs on your **testing key**. A newly registered carrier also files its **provider key** with its first model: the separate key we serve your traffic with, so test traffic bills apart from live traffic. It is smoke-tested against that model when you file and goes live once the model is approved; replacing it later under **Settings** is smoke-tested the same way and reviewed by the LLM Gateway team. Once a filing is approved, the model is routable as `/`. ### Watch your traffic [#watch-your-traffic] The **Traffic** page shows requests, errors, tokens, and billed traffic per model. Invite teammates under **Crew** so your whole team can manage the listing. ## Take the tour [#take-the-tour] ## Explore Airside [#explore-airside] ## Other products [#other-products] # DevPass URL: https://docs.llmgateway.io/devpass DevPass is a monthly subscription for developers who code with AI agents. Instead of topping up credits per request, you pay one flat price and get a monthly allowance that covers the models your tools call. Your DevPass key works anywhere an OpenAI- or Anthropic-compatible key does, so you keep the tools you already use. ## Quick start [#quick-start] ### Pick a plan [#pick-a-plan] Choose a plan on the [DevPass pricing page](https://devpass.llmgateway.io/pricing). Plans come in three tiers, **Lite**, **Pro**, and **Max**. Higher tiers raise the monthly allowance and the weekly cap on [premium models](https://docs.llmgateway.io/learn/model-categories). ### Copy your key [#copy-your-key] Open the [DevPass dashboard](https://devpass.llmgateway.io/dashboard). Rotate the key under **API Key** to reveal it once. The **Quick start** panel next to it then shows the exact setup for each supported tool. ### Point your tool at DevPass [#point-your-tool-at-devpass] For Claude Code, set two environment variables and run `claude` as usual: ```bash export ANTHROPIC_BASE_URL=https://api.llmgateway.io export ANTHROPIC_AUTH_TOKEN=your_devpass_key claude ``` OpenAI-compatible tools use `OPENAI_BASE_URL=https://api.llmgateway.io/v1` and `OPENAI_API_KEY` instead. Every other tool has its own [setup guide](https://docs.llmgateway.io/guides). ### Watch your usage [#watch-your-usage] Requests appear in [Coding Agents](https://docs.llmgateway.io/learn/coding-agents), broken down by tool. Allowance meters on the dashboard show what is left this month and this week. ## Automatic cache duration [#automatic-cache-duration] Under **Settings → Automatic cache duration**, choose **5 minutes** (default) or **1 hour**. Available in Automatic cache-write mode, this controls automatically added markers only when your request contains no cache markers of its own. One hour applies only to supported models and providers; otherwise the default duration is used. Longer durations can increase cache-write costs. Your tool's own markers take precedence, including markers without a TTL. Client-managed and Disabled modes ignore this preference. See [Provider Cache Control](https://docs.llmgateway.io/features/caching/provider-cache-control) for details. ## Cancel your subscription [#cancel-your-subscription] Cancel from **Billing** in the DevPass dashboard. A paid plan stays active through its current billing period. If a renewal is unpaid or still pending, cancellation ends the plan immediately and attempts to void its pending invoices. Immediate cancellation stops automatic collection, even if invoice cleanup needs to be retried. If Stripe's invoice lookup is unavailable, cancellation also ends the plan immediately to prevent further renewal attempts. The confirmation tells you whether the plan ended now or remains active until the period ends. ## Take the tour [#take-the-tour] ## Explore DevPass [#explore-devpass] ## Other products [#other-products] # Lounge URL: https://docs.llmgateway.io/lounge Lounge is the chat app built on LLM Gateway. Pick any model from the catalogue, switch mid-conversation, and compare answers side by side. The same app includes studios for images, video, and speech, plus live voice calls, on the web at [lounge.llmgateway.io](https://lounge.llmgateway.io) and on iPhone and iPad. ## Quick start [#quick-start] ### Sign in [#sign-in] Open [lounge.llmgateway.io](https://lounge.llmgateway.io) and sign in with your LLM Gateway account. ### Choose a model [#choose-a-model] Use the model picker above the composer. **Auto Route** picks a provider for you based on availability and cost. ### Chat, compare, or create [#chat-compare-or-create] Send a message, turn on **Comparison mode** to ask several models at once, or pick **Group**, **Image**, **Video**, **Audio**, or **Voice** in the sidebar. ### Get more with a membership [#get-more-with-a-membership] A [Lounge membership](https://docs.llmgateway.io/learn/chat-plans) gives you monthly credits worth more than you pay, so heavy chat usage costs less than pay-as-you-go. ## Take the tour [#take-the-tour] ## Explore Lounge [#explore-lounge] ## Other products [#other-products] # Introduction to LLM Gateway URL: https://docs.llmgateway.io/ LLM Gateway is an open-source API gateway that sits between your applications and LLM providers like OpenAI, Anthropic, Google AI Studio, and more. It provides a unified, OpenAI-compatible API interface with built-in cost tracking, caching, and intelligent routing. ## Products [#products] These docs cover four products. Pick one from the menu at the top of the sidebar, or start here: ## How it works [#how-it-works] Point your existing SDK at `https://api.llmgateway.io/v1` (or your self-hosted instance) and authenticate with an LLM Gateway API key — no code rewrites. The gateway routes each request to the right provider, tracks tokens and cost per model, provider, project, and API key, and fails over to a healthy provider when one errors. Pay per-token with prepaid credits at provider list rates, or bring your own provider keys (BYOK) for free. ## Why use a gateway? [#why-use-a-gateway] * **One integration** — switch models or providers by changing a model string, not your code. * **Cost visibility** — usage analytics and cost breakdowns across every provider in one dashboard. * **Reliability** — automatic provider failover when a provider fails, plus opt-in response caching per project. * **No lock-in** — open source (AGPLv3), self-hostable, and OpenAI-compatible end to end. ## Take the tour [#take-the-tour] ## Features [#features] All features are documented under https://docs.llmgateway.io/features; each feature page is included in full in this file. ## AI Tooling [#ai-tooling] LLM Gateway is built to work seamlessly with AI agents and development tools. AI tooling: https://docs.llmgateway.io/llms.txt (docs index for LLMs), https://docs.llmgateway.io/llms-full.txt (this file), https://docs.llmgateway.io/developers/mcp (MCP server), https://docs.llmgateway.io/guides/agent-skills (agent skills), and https://llmgateway.io/templates (templates and agents). ## Next Steps [#next-steps] * [**Quickstart**](https://docs.llmgateway.io/quick-start) — Get up and running in minutes * [**Overview**](https://docs.llmgateway.io/overview) — Learn more about what LLM Gateway offers * [**Self-Host**](https://docs.llmgateway.io/self-host) — Deploy on your own infrastructure # Overview URL: https://docs.llmgateway.io/overview LLM Gateway is an open-source API gateway for Large Language Models (LLMs). It acts as a middleware between your applications and various LLM providers, allowing you to: * Route requests to multiple LLM providers (OpenAI, Anthropic, Google AI Studio, and others) * Manage API keys for different providers in one place * Track token usage and costs across all your LLM interactions * Analyze performance metrics to optimize your LLM usage ## Analyzing Your LLM Requests [#analyzing-your-llm-requests] LLM Gateway provides detailed insights into your LLM usage: * **Usage Metrics**: Track the number of requests, tokens used, and response times * **Cost Analysis**: Monitor spending across different models and providers * **Performance Tracking**: Identify patterns and optimize your prompts based on actual usage data * **Breakdown by Model**: Compare different models' performance and cost-effectiveness All this data is automatically collected and presented in an intuitive dashboard, helping you make informed decisions about your LLM strategy. ## Getting Started [#getting-started] Using LLM Gateway is simple. Just swap out your current LLM provider URL with the LLM Gateway API endpoint: ```bash curl -X POST https://api.llmgateway.io/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $LLM_GATEWAY_API_KEY" \ -d '{ "model": "gpt-4o", "messages": [ {"role": "user", "content": "Hello, how are you?"} ] }' ``` LLM Gateway maintains compatibility with the OpenAI API format, making migration seamless. Note that unknown or unsupported request parameters (for example `stop`, `seed`, `logprobs`, or `logit_bias`) are accepted and silently ignored rather than rejected, so a request carrying them still succeeds — the parameter just has no effect. ## Hosted vs. Self-Hosted [#hosted-vs-self-hosted] You can use LLM Gateway in two ways: * **Hosted Version**: For immediate use without setup, visit [llmgateway.io](https://llmgateway.io) to create an account and get an API key. * **Self-Hosted**: Deploy LLM Gateway on your own infrastructure for complete control over your data and configuration. The self-hosted version offers additional customization options and ensures your LLM traffic never leaves your infrastructure if desired. # Quickstart URL: https://docs.llmgateway.io/quick-start Welcome to **LLM Gateway**—a single drop‑in endpoint that lets you call today’s best large‑language models while keeping **your existing code** and development workflow intact. > **TL;DR** — Point your HTTP requests to `https://api.llmgateway.io/v1/…`, supply your `LLM_GATEWAY_API_KEY`, and you’re done. *** ## 1 · Get an API key [#1--get-an-api-key] 1. Sign in to the dashboard. 2. Create a new Project → *Copy the key*. 3. Export it in your shell (or a `.env` file): ```bash export LLM_GATEWAY_API_KEY="llmgtwy_XXXXXXXXXXXXXXXX" ``` *** ## 2 · Pick your language [#2--pick-your-language] ```bash curl -X POST https://api.llmgateway.io/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $LLM_GATEWAY_API_KEY" \ -d '{ "model": "gpt-4o", "messages": [ {"role": "user", "content": "Hello, how are you?"} ] }' ``` ```typescript const response = await fetch("https://api.llmgateway.io/v1/chat/completions", { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${process.env.LLM_GATEWAY_API_KEY}`, }, body: JSON.stringify({ model: "gpt-4o", messages: [{ role: "user", content: "Hello, how are you?" }], }), }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); console.log(data.choices[0].message.content); ``` ```tsx import { useState } from "react"; function ChatComponent() { const [response, setResponse] = useState(""); const [loading, setLoading] = useState(false); const sendMessage = async () => { setLoading(true); try { const res = await fetch("https://api.llmgateway.io/v1/chat/completions", { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${process.env.REACT_APP_LLM_GATEWAY_API_KEY}`, }, body: JSON.stringify({ model: "gpt-4o", messages: [{ role: "user", content: "Hello, how are you?" }], }), }); if (!res.ok) { throw new Error(`HTTP error! status: ${res.status}`); } const data = await res.json(); setResponse(data.choices[0].message.content); } catch (error) { console.error("Error:", error); } finally { setLoading(false); } }; return (
{response &&

{response}

}
); } export default ChatComponent; ```
```typescript // app/api/chat/route.ts import { NextRequest, NextResponse } from "next/server"; export async function POST(request: NextRequest) { const { message } = await request.json(); const response = await fetch( "https://api.llmgateway.io/v1/chat/completions", { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${process.env.LLM_GATEWAY_API_KEY}`, }, body: JSON.stringify({ model: "gpt-4o", messages: [{ role: "user", content: message }], }), }, ); if (!response.ok) { return NextResponse.json( { error: "Failed to get response" }, { status: response.status }, ); } const data = await response.json(); return NextResponse.json({ message: data.choices[0].message.content, }); } // Usage in component: // const response = await fetch('/api/chat', { // method: 'POST', // headers: { 'Content-Type': 'application/json' }, // body: JSON.stringify({ message: 'Hello, how are you?' }) // }); ``` ```python import requests import os response = requests.post( 'https://api.llmgateway.io/v1/chat/completions', headers={ 'Content-Type': 'application/json', 'Authorization': f'Bearer {os.getenv("LLM_GATEWAY_API_KEY")}' }, json={ 'model': 'gpt-4o', 'messages': [ {'role': 'user', 'content': 'Hello, how are you?'} ] } ) response.raise_for_status() print(response.json()['choices'][0]['message']['content']) ``` ```java import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.URI; String apiKey = System.getenv("LLM_GATEWAY_API_KEY"); String requestBody = """ { "model": "gpt-4o", "messages": [ {"role": "user", "content": "Hello, how are you?"} ] } """; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.llmgateway.io/v1/chat/completions")) .header("Content-Type", "application/json") .header("Authorization", "Bearer " + apiKey) .POST(HttpRequest.BodyPublishers.ofString(requestBody)) .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); ``` ```rust use reqwest::Client; use serde_json::json; use std::env; #[tokio::main] async fn main() -> Result<(), Box> { let client = Client::new(); let api_key = env::var("LLM_GATEWAY_API_KEY")?; let response = client .post("https://api.llmgateway.io/v1/chat/completions") .header("Content-Type", "application/json") .header("Authorization", format!("Bearer {}", api_key)) .json(&json!({ "model": "gpt-4o", "messages": [ {"role": "user", "content": "Hello, how are you?"} ] })) .send() .await?; let result: serde_json::Value = response.json().await?; println!("{}", result["choices"][0]["message"]["content"]); Ok(()) } ``` ```go package main import ( "bytes" "encoding/json" "fmt" "net/http" "os" ) type ChatRequest struct { Model string `json:"model"` Messages []Message `json:"messages"` } type Message struct { Role string `json:"role"` Content string `json:"content"` } func main() { apiKey := os.Getenv("LLM_GATEWAY_API_KEY") requestBody := ChatRequest{ Model: "gpt-4o", Messages: []Message{{Role: "user", Content: "Hello, how are you?"}}, } jsonData, _ := json.Marshal(requestBody) req, _ := http.NewRequest("POST", "https://api.llmgateway.io/v1/chat/completions", bytes.NewBuffer(jsonData)) req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer "+apiKey) client := &http.Client{} resp, _ := client.Do(req) defer resp.Body.Close() fmt.Println("Response received") } ``` ```php 'gpt-4o', 'messages' => [ ['role' => 'user', 'content' => 'Hello, how are you?'] ] ]; $options = [ 'http' => [ 'header' => [ 'Content-Type: application/json', 'Authorization: Bearer ' . $apiKey ], 'method' => 'POST', 'content' => json_encode($data) ] ]; $context = stream_context_create($options); $response = file_get_contents( 'https://api.llmgateway.io/v1/chat/completions', false, $context ); if ($response === FALSE) { throw new Exception('Request failed'); } $result = json_decode($response, true); echo $result['choices'][0]['message']['content']; ?> ``` ```ruby require 'net/http' require 'json' require 'uri' uri = URI('https://api.llmgateway.io/v1/chat/completions') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true request = Net::HTTP::Post.new(uri) request['Content-Type'] = 'application/json' request['Authorization'] = "Bearer #{ENV['LLM_GATEWAY_API_KEY']}" request.body = { model: 'gpt-4o', messages: [ { role: 'user', content: 'Hello, how are you?' } ] }.to_json response = http.request(request) if response.code != '200' raise "HTTP Error: #{response.code}" end result = JSON.parse(response.body) puts result['choices'][0]['message']['content'] ```
*** ## 3 · SDK integrations [#3--sdk-integrations] ```ts title="ai-sdk.ts" import { llmgateway } from "@llmgateway/ai-sdk-provider"; import { generateText } from "ai"; const { text } = await generateText({ model: llmgateway("gpt-4o"), prompt: "Write a vegetarian lasagna recipe for 4 people.", }); ``` ```ts title="vercel-ai-sdk.ts" import { createOpenAI } from "@ai-sdk/openai"; const llmgateway = createOpenAI({ baseURL: "https://api.llmgateway.io/v1", apiKey: process.env.LLM_GATEWAY_API_KEY!, }); const completion = await llmgateway.chat({ model: "gpt-4o", messages: [{ role: "user", content: "Hello, how are you?" }], }); console.log(completion.choices[0].message.content); ``` ```ts title="openai-sdk.ts" import OpenAI from "openai"; const openai = new OpenAI({ baseURL: "https://api.llmgateway.io/v1", apiKey: process.env.LLM_GATEWAY_API_KEY, }); const completion = await openai.chat.completions.create({ model: "gpt-4o", messages: [{ role: "user", content: "Hello, how are you?" }], }); console.log(completion.choices[0].message.content); ``` *** ## 4 · Going further [#4--going-further] * **Streaming**: pass `stream: true` to any request—the gateway normalizes every provider's stream into OpenAI-format SSE chunks, with a final chunk carrying `usage` and routing metadata before `data: [DONE]`. * **Monitoring**: Every call appears in the dashboard with latency, cost & provider breakdown. *** ## 5 · FAQ [#5--faq] See the [Models page](https://llmgateway.io/models).

Unlike OpenRouter, we offer:

Our pricing structure is designed to be flexible and cost-effective: See the [Pricing section](https://llmgateway.io#pricing).
*** ## 6 · Next steps [#6--next-steps] * Read [Self host docs](https://docs.llmgateway.io/self-host) guide. * Drop into our [GitHub](https://github.com/theopenco/llmgateway) for help or feature requests. Happy building! ✨ # Airside for Providers URL: https://docs.llmgateway.io/features/airside [Airside](https://airside.llmgateway.io) is the self-serve console for the companies behind the models — the [providers](https://llmgateway.io/providers) LLM Gateway routes to. It runs on an airport metaphor: LLM Gateway is the airport, developers are passengers, and providers are **carriers**. As a carrier you claim your provider, register your fleet of models, file your fares, and watch traffic arrive. ## Claiming your carrier [#claiming-your-carrier] Sign up at [airside.llmgateway.io](https://airside.llmgateway.io) with your **company email** and verify it. A catalogue provider is claimable when the registrable domain of your verified email matches the registrable domain of the provider's API endpoint (or its website) — if your API is served from `api.example.ai`, an `@example.ai` address can claim it. Subdomains collapse to the registrable domain, so `ops@mail.example.ai` works too. If your email is on a different domain than your API, prove the API's domain over DNS instead. On the onboarding page, add each domain under your company and publish the shown TXT record on `_llmgateway-airside.`. Every domain verified this way counts like your email domain for claiming, registering a carrier, and crew invites. The onboarding page lists each domain with how it was proven: over DNS, or by a verified email when a claim was matched on your email domain. An email proof belongs to the person who filed the claim, so only DNS-verified domains carry over to the rest of your crew. Every claim is reviewed by the LLM Gateway team before the carrier goes live; a rejected claim shows the review note so you can follow up. One company can operate several carriers — regional deployments or separate brands all live under one console. Listing on llmgateway.io carries a one-time **$2,500 listing fee** per provider company, paid during onboarding. Providers we already work with receive an **invite code** that waives it — entered in the same onboarding step instead of paying. See the [pricing summary](https://airside.llmgateway.io/pricing.md) for the full economics. ## Crew [#crew] A listing covers your whole team. Under **Crew**, company owners invite teammates by email — up to **10 members** per company, pending invites included. Invites are limited to your team's domains (the ones that prove your claims); a teammate with an existing account joins instantly, anyone else joins the first time they sign in with the invited address. ## Registering a new carrier [#registering-a-new-carrier] Not in the [provider catalogue](https://llmgateway.io/providers) yet? Register your provider as a **new carrier** from the onboarding page: pick a carrier id, display name, and the base URL of your **OpenAI-compatible API** (the gateway calls `/v1/chat/completions`, unless a listing picks a different [upstream API](#upstream-api-and-preflight)). Enter the base URL only: a URL whose path contains `/v1` or `/chat/completions` is rejected, because the gateway appends the endpoint path itself and the doubled path would fail every request. The endpoint must live on your verified email's domain or a domain your company verified over DNS — the same anti-squatting rule as claiming — and registrations go through the same review. Once approved, your carrier appears on the public providers and models pages and its listings route like any other provider's. ## Listing your fleet [#listing-your-fleet] Once your claim is active, register models under **Fleet**: model name, display name, description, family, context size, max output, capability flags (streaming, vision, audio input, tools, JSON output, reasoning), the supported `reasoning_effort` tiers, the `tool_choice` modes your endpoint accepts, and optionally the weight **quantization** you serve (`int4`, `int8`, `fp4`, `fp6`, `fp8`, `fp16`, `bf16`, or `fp32`). Approved quantization shows on the Fleet card and the public model card. If your API expects a different id than the one developers use, set the **upstream model ID**; like the upstream API, it is fixed once the model is listed. A listing can also carry optional **rate limits** in requests per minute and per day. Choose whether the cap is shared **across all organizations** (the total traffic sent to your deployment stays under it) or applies **per organization** (each organization gets its own counter, so total load grows with the number of customers). Platform-set limits always take precedence. A new listing is created as a draft together with an **initial price filing**; when the LLM Gateway team approves that filing, the model goes active. Registering a model that already exists in the catalogue reuses its identity: display name, description, and family come from the catalogue model, and **Use catalog price** copies another provider's flat prices into your initial tariff as a starting point. For a new model, the family field suggests existing catalogue families. Draft listings save immediately. On a live listing, a metadata change (description, context size, capabilities, quantization, and so on) is filed for review and applies once approved. Saving again while that change is pending replaces it in place, and saving the live values withdraws it. A pending price filing blocks metadata edits until it is reviewed. Carriers claiming a catalogue provider can also **import their catalogue models** in one click: each active catalogue model becomes a managed listing with its current price as an approved filing. Once approved, the listing serves the model at its filed fares and keeps the catalogue entry's request handling. Pausing or delisting an imported model takes it out of service instead of falling back to the catalogue entry; relisting or resuming puts it back. The LLM Gateway team can then remove the provider's static definition and mappings; only its active Airside listings remain available. ### Catalogue removal [#catalogue-removal] While the static provider definition exists, routing and BYOK key validation use its endpoint configuration. An Airside base URL configured in advance takes effect after that definition is removed; a BYOK key's explicit base URL still overrides it. When a provider's static catalogue definition is removed, its existing active Airside claim serves from its configured base URL, managed credentials, and active listings. Models without an active Airside listing are no longer offered by that provider. The carrier's declared profile then drives compliance routing. Later profile edits apply directly; missing facts do not satisfy compliance requirements. Provider IDs, BYOK keys, approved prices, and historical usage retain their existing identity. Configure the carrier endpoint before adding managed serving credentials. Revoking the claim stops its listings from serving while preserving the catalogue provider record and platform-owned credentials. ### Upstream API and preflight [#upstream-api-and-preflight] Each listing also picks the **upstream API** the gateway speaks to it: the carrier default, OpenAI Chat Completions, OpenAI Responses, or Google Vertex `generateContent`. The choice is independent of the capabilities you declare — tool calls, JSON output, vision, reasoning, and web search are all probed and served through whichever API you picked, so pick the one your endpoint actually implements. It is fixed once the model is listed. Before a listing can be filed, Airside runs a **preflight** against your endpoint through that API: one check per declared capability, plus one for each declared limit. The **context size** check sends a prompt filling about 70% of the declared window, up to 2 million tokens, and fails if your endpoint refuses it or reports far fewer input tokens than were sent; the **max output** check requests the full declared output budget and fails if your endpoint refuses it. A refusal is reported with the probe that was sent followed by your endpoint's own answer. A request that times out is retried up to twice; a check that passes on a retry still passes, with a warning that your endpoint may be slow or overloaded. Some checks are **optional** for now: a response that misses one still passes its check, with the miss shown as a warning marked **Optional**. Optional checks may become required later. These are currently optional: * **Basic completion** requires `usage` with positive input and output token counts, cached tokens counted within the input, and, on Chat Completions, a response `id`. * **Streaming** requires a usage report (on Chat Completions, honour `stream_options.include_usage` with a final usage chunk). The streamed input token count must match the non-streaming request for the same prompt; usage sent as per-chunk increments is flagged, because the last reported value is what gets billed. * **Reasoning** requires evidence that the model reasoned: reasoning text, a reasoning block or reasoning tokens in `usage`. An endpoint that accepts `reasoning_effort` but ignores it is flagged. A stream must already contain assistant text and a finish reason, or the **streaming** check fails. The **tool calls** check is required too: on Chat Completions, a response with `tool_calls` must finish with `finish_reason: "tool_calls"` (a named `tool_choice` may finish with `stop`), or the check fails, because clients stop instead of running the tool. Since no other `tool_choice` mode fixes this, it never narrows your modes. The context check is billed like any other large prompt. You supply a provider API key that can call the model, saved as this carrier's **test key** under Settings so later runs — yours and ours — reuse it. Use a key separate from the one behind your live integration: preflight traffic is billed by your own platform and is not tracked in LLMGateway usage or billing. You can replace or remove it at any time. Editing the model, its limits included, invalidates the run, so a listing never ships with checks made against different settings. Re-verifying a live listing reports, it does not rewrite: a failed check names the capability your endpoint refused and leaves the listing exactly as you declared it, because one refused request is as easily a transient fault as a missing capability. Fix the endpoint and verify again, or switch the capability off yourself if the deployment genuinely does not do it. Fleet marks the listing **In service · unverified** until a run passes again. A capability you have edited on a live listing lives in a filing until we approve it, and preflight verifies **that** shape rather than the one currently serving — otherwise a run would pass without ever exercising the capability you are trying to prove. A failed check is reported next to the filing rather than removed from it; the reviewer decides. Each check lists the upstream requests it actually sent. A check can be more than one request: the tool check walks the `tool_choice` modes and the reasoning check sweeps the effort tiers, so every attempt appears nested under its check with its own pass or fail and the upstream message on failure. The breakdown fills in while the run is still going. A check fails only when every one of its requests failed. Where a check can tell the difference between a capability and a dialect, it narrows the listing itself. A `tool_choice` mode your endpoint mishandles is dropped while tool calls stay on, and a `reasoning_effort` tier your endpoint rejects outright is retried at another tier — reasoning stays on and only the rejected tiers come off your declared set. If one tier is rejected the check goes on to try the others, since a tier left declared is one the gateway will forward verbatim. So a deployment implementing only a subset of the tiers verifies without losing reasoning, and you do not have to know which subset in advance. ## Price filings [#price-filings] Listed prices are what developers are billed, so pricing never changes silently: it only changes through a reviewed **price filing**. * The **initial** filing sets the launch pricing and activates the model on approval. * Every later price change is an **update** filing — drafted by you, approved by the LLM Gateway team, and only then in effect. A filing covers input, output, optional cached-input, and optional per-request prices (USD per token, decimal or exponent notation), plus a note for the reviewer. It can also carry **regional fares** — per-region price overrides developers reach with `/:`, while all other traffic pays the default fares. Each approved filing's regional set fully replaces the previous one, and while no filing is pending a region can be dropped from the Fleet page — removing an offering changes no price, so it applies immediately without review. The latest approved filing is the model's effective price; pending and rejected filings are tracked under **Filings**. ## Routing and billing [#routing-and-billing] Approved listings are genuinely routable. A request for `/` that does not match the static catalogue resolves against active Airside listings with an approved price filing, and is billed at the filed prices — no extra configuration on the developer side. ## Traffic [#traffic] The **Traffic** page shows usage of your claimed providers: requests, errors, input/output/total tokens, and billed traffic in USD, as a daily series and broken down per model. Chart axes and compact counts use `k`, `M`, `B`, or `T` for thousands through trillions, so large traffic volumes fit within the chart. ## Incidents [#incidents] The **Incidents** page lists every mapping of your claimed providers that failed requests in the selected window (1 hour to 3 days), with its error rate, error count, upstream/gateway split, and total requests. Only upstream and gateway errors count: both are retried on another key or provider, and upstream errors count against your uptime. Client errors, canceled requests, and content-filtered requests are excluded. By default the page counts only traffic served by the gateway's own credentials. Turn on **Bring your own key traffic** to also include requests customers sent with their own provider keys. Expand a row to see the top error shapes behind it: HTTP status, status text, a response excerpt, the cause, the gateway's classification, and whether the request was streamed. The shapes cover every error in the window, including responses that started successfully and failed midway, up to the latest 100,000 per mapping. Counts always include retried attempts; the **Retried errors in details** switch drops retried attempts from the error shapes only. Switch to **By error type** to group the same errors across mappings instead: each error shows its total, its streaming and non-streaming counts, and every model it hit with per-model counts. Use it to spot failures such as timeouts that are not specific to one model. The same per-mapping limit applies. To focus on one mapping, pick it from the mapping filter or open `/dashboard/incidents?mapping=/[:]`. The **Errors** column on Traffic and the **Incidents** link on each active Fleet listing open the page pre-filtered. ## Fares and routing [#fares-and-routing] Under **Fares** each claimed provider has two knobs: * **Traffic discount** (0–50%) — a discount you offer on routed traffic. * **Landing fee** (5–50%) — the gateway margin you accept; the baseline is **20%**. Accepting more than the baseline margin or offering a discount makes your traffic effectively cheaper, which boosts you in the [smart routing election](https://docs.llmgateway.io/features/routing); accepting less prices you up. Like price changes, fare changes are filed for review and only reach routing once the LLM Gateway team approves them. The election scores every candidate provider on weighted factors — expected token cost after your discount and margin (`0.6`), availability/uptime (`0.5`), throughput (`0.3`), and latency (`0.075`) — and the lowest score wins. Cache-read savings count toward token cost; cache support alone receives no additional preference by default. Routing reacts to live metrics: reliability and speed still matter. A cheap but flaky deployment loses the election to a slightly pricier, stable one. ## Settings [#settings] **Settings** holds the preflight **test key** for each claimed carrier, shown masked. Replace or remove it at any time; without one, preflight asks for a key on every run. Settings also shows each carrier's **billing mode**, which the LLM Gateway team sets and you can only view: * **Pay-as-you-go** (default) — LLM Gateway prepays usage on its own account with you. * **Post-billing** — you invoice LLM Gateway after each month's usage, paid by wire. * **Payout** — you supply the API key and cover upstream costs; LLM Gateway pays you after each month. Contact the LLM Gateway team to change it. ## Provider resources [#provider-resources] The [Airside resources](https://airside.llmgateway.io/resources) hub collects provider guides ([how to list your LLM API](https://airside.llmgateway.io/guides/list-your-llm-api), [LLM inference pricing](https://airside.llmgateway.io/guides/llm-inference-pricing)) and free calculators for [token costs](https://airside.llmgateway.io/tools/token-cost-calculator) and [rate limits](https://airside.llmgateway.io/tools/rate-limit-calculator). They run in the browser and need no account. ## Carrier Slack channel [#carrier-slack-channel] Every new carrier is invited to a shared cross-team Slack Connect channel with the LLM Gateway team — the fastest way to reach us about claims, filings, or routing. # Airside Fleet URL: https://docs.llmgateway.io/learn/airside-fleet The Fleet page is where a claimed carrier manages its model listings on [Airside](https://docs.llmgateway.io/features/airside), the self-serve provider console. Each listing is a "flight strip" showing its status, its currently approved pricing, and any tariff filing still awaiting review. ## Listing statuses [#listing-statuses] | Status | Meaning | | ----------------------------------- | ------------------------------------------------------------------------- | | **Filed** | Drafted — waiting for the initial price filing to be approved | | **In service** | Approved and routable as `/`; billed at the filed prices | | **Paused** | In service but taken out of routing by you until resumed | | **Rejected** | The initial filing was rejected; fix the price and file again | | **Delisted** | Out of service — kept in history; relist it to route traffic again | | **Awaiting clearance / Fare filed** | A filing (initial or price update) is pending review | ## Registering an aircraft [#registering-an-aircraft] Click **Register aircraft**, pick the carrier (when your company holds more than one), and fill in the model id, display name, family, context size, capabilities, accepted `tool_choice` modes, optional quantization, and the initial tariff. For a model already in the catalogue, **Use catalog price** copies another provider's flat prices as a starting point. Prices are per token and accept exponent notation — `2e-6` reads as $2 per million tokens. New listings and every later price change are reviewed by the LLM Gateway team before taking effect. Drafts save immediately; on a live listing, metadata changes such as description, context size, capabilities, or quantization are filed for review too. Every new listing must pass preflight before it is filed. So must an edit that adds a capability, raises the context size or output limit, or adds accepted modes or reasoning tiers: run **Run preflight** in the edit dialog and save once it passes. Narrowing a capability or editing descriptive fields needs no new run. ## Changing a price [#changing-a-price] Pricing is never edited in place. **File fare** opens a tariff filing with the new input/output prices; the model keeps serving at its current approved pricing until the filing is approved. Only one filing per model can be pending at a time, and every filing — with its review outcome and notes — is listed in the console's filings history. ## Pausing a model [#pausing-a-model] **Pause** takes an in-service model out of routing without review: it stops receiving new requests within about a minute and keeps its approved pricing, pending filings, and history. **Resume** puts it back in service the same way. Filings approved while paused apply without resuming the model. A paused model is hidden from the public model pages and `/v1/models` until you resume it. This also holds for a model imported from the built-in catalogue: requests do not fall back to the catalogue entry. ## Removing a model [#removing-a-model] Deleting a drafted or rejected listing removes it outright. An in-service model is **delisted** instead: it stops routing immediately and leaves the public model pages, but stays in your history and analytics. A model imported from the built-in catalogue is delisted the same way, without falling back to its catalogue entry. Delisting takes effect within about a minute — in-flight requests finish, but new requests for the model are rejected. ## Relisting a model [#relisting-a-model] A delisted row shows who took it out of service and when: **Delisted by your crew** or **Delisted · claim revoked**. Run **Verify** first: **Relist** needs a preflight that passed after the model was delisted, then puts it back in service immediately at its last approved fare, without review. Relisting also needs an active claim on the carrier, and fails while another listing uses the same model id. Filings that were pending at delisting stay rejected, and model-level dispatch settings restart from the carrier default. # DevPass Usage API URL: https://docs.llmgateway.io/developers/devpass-usage DevPass subscription prices stay the same, but included usage decreases. Daily and premium weekly caps and Reset Pass benefits change on October 15; existing monthly allowances change at the first renewal on or after that date. New subscriptions from that date start with the new allowance. Review the [dated plan-change notice](https://devpass.llmgateway.io/legal/terms#october-2026-plan-changes) before subscribing. Use `GET /v1/key` to show DevPass allowance meters in a coding tool or other trusted application. The endpoint uses the application's existing gateway API key, so it does not require a dashboard session. A regular gateway API key is a secret. Do not embed it in public browser code or distribute it with an application. Read it from the user's secure local configuration or call the endpoint from a trusted backend. ## Request [#request] ```bash curl https://api.llmgateway.io/v1/key \ -H "Authorization: Bearer llmgtwy_your_api_key_here" ``` Only regular gateway API keys can use this endpoint. Platform publishable keys and end-user sessions receive `403 Forbidden` because they cannot read organization-level plan state. ## Response [#response] ```json { "data": { "label": "My coding tool", "usage": "31.42", "limit": null, "devPlan": "pro", "devPlanCreditsUsed": "25", "devPlanCreditsLimit": "237", "devPlanCreditsRemaining": "212.00", "devPlanPremiumWeeklyLimit": "35.55", "devPlanPremiumCreditsUsed": "5.00", "devPlanPremiumWeekResetsAt": "2026-08-28T12:00:00.000Z" } } ``` | Field | Meaning | | ---------------------------- | -------------------------------------------------------------- | | `label` | Description of the key | | `usage` | All-time usage attributed to the key, in USD | | `limit` | All-time key usage limit in USD, or `null` | | `devPlan` | `lite`, `pro`, `max`, or `none` | | `devPlanCreditsUsed` | Plan credits used in the current billing cycle | | `devPlanCreditsLimit` | Plan credit allowance for the current billing cycle | | `devPlanCreditsRemaining` | Remaining plan credits, clamped to zero | | `devPlanPremiumWeeklyLimit` | Weekly premium-model allowance | | `devPlanPremiumCreditsUsed` | Premium-model credits used in the current weekly window | | `devPlanPremiumWeekResetsAt` | ISO 8601 reset time, or `null` when no weekly window is active | All USD values are decimal strings. Parse them before calculating percentages or remaining premium allowance. ## Weekly window behavior [#weekly-window-behavior] The premium window starts with the first premium-model request and lasts seven days. When it expires, the endpoint returns `"0.00"` for `devPlanPremiumCreditsUsed` and `null` for `devPlanPremiumWeekResetsAt`; the full weekly allowance is already available, and the next premium request starts a new window. Pay-as-you-go keys return `"none"` for `devPlan` and zero for every DevPass field. This lets one integration support both key types without a separate account lookup. The endpoint remains readable when the key has exceeded its own usage limit, so an integration can explain why requests stopped. Invalid or inactive keys receive `401 Unauthorized`. See [Retrieve key status](https://docs.llmgateway.io/v1_key_retrieve) for the generated API reference and complete response schema. ## Recovering a failed renewal [#recovering-a-failed-renewal] If your renewal fails, DevPass shows **Payment overdue** with a **Complete payment** link to the outstanding invoice. Follow the link to pay and complete any bank verification. Your allowance refreshes after payment succeeds. Updating your card in **Billing** also retries the failed renewal. Saving a card alone does not mean the invoice is paid: if payment remains outstanding, the invoice link stays visible above the card details. Return to DevPass after paying to refresh the payment status. # Agent Skills URL: https://docs.llmgateway.io/guides/agent-skills **Agent Skills** are structured guidelines for AI coding agents, optimized for use with LLM Gateway and the AI SDK. They provide best practices and reusable instructions that help AI agents generate higher-quality code. ## Video walkthrough [#video-walkthrough]