We use cookies. Cookies and browser storage keep you signed in and remember your preferences. With your permission we also measure how the site is used. You can any time. See our cookie policy.

Provider routing & fallbacks

Endpoints

Provider routing & fallbacks

Choose, order and filter upstream providers with api14 provider routing, and set fallbacks across models so requests keep working when one fails.

Try it in the playground

Many models are served by several upstream providers, each with its own price, speed and data policy. By default, requests are load-balanced across providers by price and uptime, and fall back to another provider when one fails. Use the provider object to change this, and models to fall back across different models.

The provider object

FieldTypeDescription
orderstring[]Providers to try first, in order, e.g. ["Anthropic", "Amazon Bedrock"].
allow_fallbacksbooleanfalse stops the request from going to providers outside order or only (default true).
onlystring[]Allow only these providers.
ignorestring[]Never use these providers.
sortstring"price", "throughput" or "latency" instead of load balancing.
data_collectionstring"deny" excludes providers that may store or train on prompts. "allow" is the default.
require_parametersbooleanOnly use providers that support every parameter in your request (e.g. tools, response_format).
quantizationsstring[]Allowed precisions, e.g. ["fp8", "bf16"].
max_priceobjectUpper price limits in USD per million tokens, e.g. { "prompt": 1, "completion": 3 }.
{
  "model": "meta-llama/llama-3.3-70b-instruct",
  "messages": [{ "role": "user", "content": "Hello" }],
  "provider": {
    "order": ["Groq", "Fireworks"],
    "allow_fallbacks": true,
    "data_collection": "deny",
    "sort": "throughput"
  }
}

The :nitro variant is a shortcut for sort: "throughput", and :floor is a shortcut for sort: "price". See Model ids.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api14.com/api/v1",
  apiKey: process.env.API14_API_KEY,
});

const result = await client.chat.completions.create({
  "model": "openai/gpt-5-mini",
  "messages": [
    {
      "role": "user",
      "content": "Explain vector databases in two sentences."
    }
  ]
});
console.log(result.choices[0].message.content);

Model fallbacks with models

Pass a list of models. If the first one fails (an outage, rate limit, moderation or context length error), the next one is tried:

{
  "models": ["anthropic/claude-sonnet-4.5", "openai/gpt-5-mini", "google/gemini-2.5-flash"],
  "messages": [{ "role": "user", "content": "Summarize this ticket." }]
}
  • model is optional when models is set. If you send both, model is tried first.
  • Every model in the list must pass the gateway checks before the request is sent: it must exist and be enabled, be on your key's model allowlist, and be included in your plan. One model that fails the checks rejects the whole request (403 model_not_allowed, 403 plan_required or 404 model_not_found).
  • You are billed only for the model that answered, at its own price. The response's model field tells you which one it was.

Response

{
  "id": "gen-1760000000-route",
  "model": "openai/gpt-5-mini",
  "provider": "OpenAI",
  "choices": [{ "index": 0, "finish_reason": "stop", "message": { "role": "assistant", "content": "..." } }],
  "usage": { "prompt_tokens": 140, "completion_tokens": 60, "total_tokens": 200, "cost": 0.000155 }
}

provider shows which upstream provider served the request. Generation lookup shows the full routing details.

Errors

If no provider matches your filters (e.g. only together with require_parameters), the upstream returns 404 "No endpoints found". Other errors are the same as for Chat completions. See Errors.