OpenRouter routes requests to the best available providers for your model. By default, requests are load balanced across the top providers to maximize uptime.
You can customize how your requests are routed using the provider object in the request body for Chat Completions.
The provider object can contain the following fields:
OpenRouter supports EU in-region routing for enterprise customers. When enabled, prompts and completions are processed entirely within the EU. Learn more in our Privacy docs here. To contact our enterprise team, fill out this form.
For each model in your request, OpenRouter’s default behavior is to load balance requests across providers, prioritizing price.
If you are more sensitive to throughput than price, you can use the sort field to explicitly prioritize throughput.
When you send a request with tools or tool_choice, OpenRouter will only
route to providers that support tool use. Similarly, if you set a
max_tokens, then OpenRouter will only route to providers that support a
response of that length.
Here is OpenRouter’s default load balancing strategy:
If Provider A costs $1 per million tokens, Provider B costs $2, and Provider C costs $3, and Provider B recently saw a few outages.
If you have sort or order set in your provider preferences, load balancing will be disabled.
As described above, OpenRouter load balances based on price, while taking uptime into account.
If you instead want to explicitly prioritize a particular provider attribute, you can include the sort field in the provider preferences. Load balancing will be disabled, and the router will try providers in order.
The three sort options are:
"price": prioritize lowest price"throughput": prioritize highest throughput"latency": prioritize lowest latencyTo always prioritize low prices, and not apply any load balancing, set sort to "price".
To always prioritize low latency, and not apply any load balancing, set sort to "latency".
You can append :nitro to any model slug as a shortcut to sort by throughput. This is exactly equivalent to setting provider.sort to "throughput".
You can append :floor to any model slug as a shortcut to sort by price. This is exactly equivalent to setting provider.sort to "price".
When using model fallbacks, the sort field can be specified as an object with additional options to control how endpoints are sorted across multiple models.
By default, when you specify multiple models (fallbacks), OpenRouter groups endpoints by model before sorting. This means the primary model’s endpoints are always tried first, regardless of their performance characteristics. Setting partition to "none" removes this grouping, allowing endpoints to be sorted globally across all models.
To explicitly use the default behavior, set partition: "model". For more details on how model fallbacks work, see Model Fallbacks.
preferred_max_latency and preferred_min_throughput do not guarantee you will get a provider or model with this performance level. However, providers and models that hit your thresholds will be preferred. Specifying these preferences should therefore never prevent your request from being executed. This is different than max_price, which will prevent your request from running if the price is not available.
When you have multiple acceptable models and want to use whichever has the best performance right now, use partition: "none" with throughput or latency sorting. This is useful when you care more about speed than using a specific model.
In this example, OpenRouter will route to whichever endpoint across all three models currently has the highest throughput, rather than always trying Claude first.
You can set minimum throughput or maximum latency thresholds to filter endpoints. Endpoints that don’t meet these thresholds are deprioritized (moved to the end of the list) rather than excluded entirely.
OpenRouter tracks latency and throughput metrics for each model and provider using percentile statistics calculated over a rolling 5-minute window. The available percentiles are:
Higher percentiles (like p90 or p99) give you more confidence about worst-case performance, while lower percentiles (like p50) reflect typical performance. For example, if a model and provider has a p90 latency of 2 seconds, that means 90% of requests complete in under 2 seconds.
When you specify multiple percentile cutoffs, all specified cutoffs must be met for a model and provider to be in the preferred group. This allows you to set both typical and worst-case performance requirements.
Percentile-based routing is useful when you need predictable performance characteristics:
sort: "price" to get the cheapest provider that still meets your performance requirementsCombine partition: "none" with performance thresholds to find the cheapest option across multiple models that meets your performance requirements. This is useful when you have a performance floor but want to minimize costs.
In this example, OpenRouter will find the cheapest model and provider across all three models that has at least 50 tokens/second throughput at the p90 level (meaning 90% of requests achieve this throughput or better). Models and providers below this threshold are still available as fallbacks if all preferred options fail.
You can also use preferred_max_latency to set a maximum acceptable latency:
You can specify multiple percentile cutoffs to set both typical and worst-case performance requirements. All specified cutoffs must be met for a model and provider to be in the preferred group.
If you use Bring Your Own Key (BYOK) and want to maximize usage of your own API keys, partition: "none" can help. When your primary model doesn’t have a BYOK provider available, OpenRouter can route to a fallback model that does support BYOK.
In this example, if you have a BYOK key configured for OpenAI but not for Anthropic, OpenRouter can route to the GPT-4o endpoint using your own key even though Claude is listed first. Without partition: "none", the router would always try Claude’s endpoints first before falling back to GPT-4o.
BYOK endpoints are automatically prioritized when you have API keys configured for a provider. The partition: "none" setting allows this prioritization to work across model boundaries.
You can set the providers that OpenRouter will prioritize for your request using the order field.
The router will prioritize providers in this list, and in this order, for the model you’re using. If you don’t set this field, the router will load balance across the top providers to maximize uptime.
You can use the copy button next to provider names on model pages to get the exact provider slug, including any variants like “/turbo”. See Targeting Specific Provider Endpoints for details.
OpenRouter will try them one at a time and proceed to other providers if none are operational. If you don’t want to allow any other providers, you should disable fallbacks as well.
This example skips over OpenAI (which doesn’t host Mixtral), tries Together, and then falls back to the normal list of providers on OpenRouter:
Here’s an example with allow_fallbacks set to false that skips over OpenAI (which doesn’t host Mixtral), tries Together, and then fails if Together fails:
Each provider on OpenRouter may host multiple endpoints for the same model, such as a default endpoint and a specialized “turbo” endpoint, or region-specific endpoints like google-vertex/us-east5. To target a specific endpoint, you can use the copy button next to the provider name on the model detail page to obtain the exact provider slug.
When you use a base provider slug (e.g. "google-vertex") in any provider routing field (order, only, or ignore), it matches all endpoints for that provider, including any variants or regions. For example, "google-vertex" matches google-vertex, google-vertex/us-east5, google-vertex/us-central1, and so on.
To target a specific variant or region, use the full slug including the suffix (e.g. "google-vertex/us-east5" or "deepinfra/turbo").
For example, DeepInfra offers DeepSeek R1 through multiple endpoints:
deepinfradeepinfra/turboBy copying the exact provider slug and using it in your request’s order array, you can ensure your request is routed to the specific endpoint you want:
This approach is especially useful when you want to consistently use a specific variant of a model from a particular provider.
To route to all endpoints of a provider (across all regions and variants), just use the base slug without a suffix. For example, "google-vertex" will route across all Vertex AI regions.
You can restrict requests only to providers that support all parameters in your request using the require_parameters field.
With the default routing strategy, providers that don’t support all the LLM parameters specified in your request can still receive the request, but will ignore unknown parameters. When you set require_parameters to true, the request won’t even be routed to that provider.
For example, to only use providers that support JSON formatting:
You can restrict requests only to providers that comply with your data policies using the data_collection field.
allow: (default) allow providers which store user data non-transiently and may train on itdeny: use only providers which do not collect user dataSome model providers may log prompts, so we display them with a Data Policy tag on model pages. This is not a definitive source of third party data policies, but represents our best knowledge.
This is also available as an account-wide setting in your privacy settings. You can disable third party model providers that store inputs for training.
To exclude providers that don’t comply with your data policies, set data_collection to deny:
You can enforce Zero Data Retention (ZDR) on a per-request basis using the zdr parameter, ensuring your request only routes to endpoints that do not retain prompts.
When zdr is set to true, the request will only be routed to endpoints that have a Zero Data Retention policy. When zdr is false or not provided, it has no effect on routing.
ZDR can also be enforced per model group (Anthropic, OpenAI, Google, and non-frontier) in your privacy settings or via guardrails. The per-request zdr parameter
operates as an “OR” with your account-wide and guardrail ZDR settings — if any of them is enabled, ZDR enforcement is applied. The request-level parameter can only ensure ZDR is enabled, not override account-wide or guardrail enforcement. See Zero Data Retention for details.
To ensure a request only uses ZDR endpoints, set zdr to true:
This is useful for customers who don’t want to globally enforce ZDR but need to ensure specific requests only route to ZDR endpoints.
You can enforce distillable text filtering on a per-request basis using the enforce_distillable_text parameter, ensuring your request only routes to models where the author has allowed text distillation.
When enforce_distillable_text is set to true, the request will only be routed to models where the author has explicitly enabled text distillation. When enforce_distillable_text is false or not provided, it has no effect on routing.
This parameter is useful for applications that need to ensure their requests only use models that allow text distillation for training purposes, such as when building datasets for model fine-tuning or distillation workflows.
To ensure a request only uses models that allow text distillation, set enforce_distillable_text to true:
To guarantee that your request is only served by the top (lowest-cost) provider, you can disable fallbacks.
This is combined with the order field from Ordering Specific Providers to restrict the providers that OpenRouter will prioritize to just your chosen list.
You can allow only specific providers for a request by setting the only field in the provider object.
Only allowing some providers may significantly reduce fallback options and limit request recovery.
You can allow providers for all account requests in your privacy settings. This configuration applies to all API requests and chatroom messages.
Note that when you allow providers for a specific request, the list of allowed providers is merged with your account-wide allowed providers.
Here’s an example that will only use Azure for a request calling GPT-4 Omni:
You can ignore providers for a request by setting the ignore field in the provider object.
Ignoring multiple providers may significantly reduce fallback options and limit request recovery.
You can ignore providers for all account requests in your privacy settings. This configuration applies to all API requests and chatroom messages.
Note that when you ignore providers for a specific request, the list of ignored providers is merged with your account-wide ignored providers.
Here’s an example that will ignore DeepInfra for a request calling Llama 3.3 70b:
Quantization reduces model size and computational requirements while aiming to preserve performance. Most LLMs today use FP16 or BF16 for training and inference, cutting memory requirements in half compared to FP32. Some optimizations use FP8 or quantization to reduce size further (e.g., INT8, INT4).
Quantized models may exhibit degraded performance for certain prompts, depending on the method used.
Providers can support various quantization levels for open-weight models.
By default, requests are load-balanced across all available providers, ordered by price. To filter providers by quantization level, specify the quantizations field in the provider parameter with the following values:
int4: Integer (4 bit)int8: Integer (8 bit)fp4: Floating point (4 bit)fp6: Floating point (6 bit)fp8: Floating point (8 bit)fp16: Floating point (16 bit)bf16: Brain floating point (16 bit)fp32: Floating point (32 bit)unknown: UnknownHere’s an example that will only use providers that support FP8 quantization:
To filter providers by price, specify the max_price field in the provider parameter with a JSON object specifying the highest provider pricing you will accept.
For example, the value {"prompt": 1, "completion": 2} will route to any provider with a price of <= $1/m prompt tokens, and <= $2/m completion tokens or less.
Some providers support per request pricing, in which case you can use the request attribute of max_price. Lastly, image is also available, which specifies the max price per image you will accept.
Practically, this field is often combined with a provider sort to express, for example, “Use the provider with the highest throughput, as long as it doesn’t cost more than $x/m tokens.”
Some providers support beta features that can be enabled through special headers. OpenRouter allows you to pass through certain provider-specific beta headers when making requests.
When using Anthropic models (Claude), you can request specific beta features by including the x-anthropic-beta header in your request. OpenRouter will pass through supported beta features to Anthropic.
OpenRouter manages some Anthropic beta features automatically:
response_format.type: "json_schema") - the header is automatically appliedFor strict tool use (strict: true on tools), you must explicitly pass the structured-outputs-2025-11-13 header. Without this header, OpenRouter will strip the strict field and route normally.
You can enable multiple beta features by separating them with commas:
Beta features are experimental and may change or be deprecated by Anthropic. Check Anthropic’s documentation for the latest information on available beta features.
You can view the terms of service for each provider below. You may not violate the terms of service or policies of third-party providers that power the models on OpenRouter.