Using routing policies

How Gateway resolves which policy applies to a request, and how to control it from the request payload

A routing policy isn’t sent in the request body. Gateway resolves it for you on every call based on what you attach to the request and what’s configured on your org. This page covers how that resolution works and what you can do from the request side.

How routing policies are applied

Routing policies are attached to an API key, a project, or a customer, or set as the org default. When Gateway receives a request, it resolves the policy in this order:

  1. A policy named on the request. An explicit routing_policy_id, a model alias, or a routing policy id sent as the model value.
  2. A policy bound to the API key. A key can carry its own policy, which beats everything below it. See Bind a policy to a key.
  3. The customer’s default policy, if you resell Gateway capacity and the request names a customer. See Embedded Routing.
  4. The project’s policy. A request resolves to a project when it’s authenticated with a project API key, or carries the project_id body field or X-Project-Id header.
  5. The org default policy, when nothing above resolved.
  6. No policy, direct model calls. Gateway routes directly to the model named in the request.

A key binding that cannot be used, because the policy was deleted, deactivated, or is scoped to a different project or customer, is skipped rather than treated as an error, and resolution continues down the list. POST /v1/embeddings ignores key bindings entirely.

When a routing policy is active, the model field in your request is optional. The policy selects the provider and model automatically. Omit it for Priority and Intelligent routing. model is only required when no policy resolves for the request.

Switching strategies per request

You cannot pass a routing strategy in the request body, but you can name a policy. Create one policy per strategy (for example, one Cost Optimized and one Quality First) and select between them per request:

  1. Send the policy’s id as routing_policy_id, or as the model value, or send its @alias/<slug> as the model.
  2. Or bind a policy to the API key each workload uses, so no per-request field is needed.

Either way one organization key reaches any policy, which is what you want when different features or user tiers need different cost and quality trade-offs. Setting both routing_policy_id and a policy id in model is rejected with 400 conflicting_routing_policy rather than resolved by guesswork, and a policy scoped to a project or customer that the request does not resolve to returns 400 routing_policy_requires_project or 400 routing_policy_requires_customer.

Using default_routing

Set the request’s model field to the sentinel value "default_routing" to explicitly request policy-based routing without naming a model.

model valueBehavior
Omitted or nullHand off to the configured routing policy
"default_routing"Same as omitted. Hands off to the configured routing policy.
"provider/model" (e.g. "openai/gpt-5.2")Bypass policy selection and route directly to that model
"model-name" bare (e.g. "gpt-5.2")Server-side resolution to a fully-qualified ID; rejected if ambiguous
A routing policy UUID (e.g. "3f0a9c1e-5b7d-4a2f-8c61-9d4e2b7a0f13")Resolves as that policy, on /v1/responses and the SDK-compatible surfaces. An unknown UUID returns 404 naming the interpretation it tried

The sentinel value is case-insensitive and whitespace is stripped, so " Default_Routing " resolves the same as "default_routing".

default_routing is useful when you have a client that always sends a model field, for example the OpenAI SDK or a templated request payload, but you want every request to honor the project or org default policy. Set the value once at the client level and Gateway will pick the model.

1from merge_gateway import MergeGateway
2
3client = MergeGateway(api_key="YOUR_API_KEY")
4
5response = client.responses.create(
6 model="default_routing",
7 input=[
8 {"type": "message", "role": "user", "content": "Draft a response to this support ticket."},
9 ],
10 project_id="4f8b2c6e-9d1a-4e7a-b3f5-2c8d0a6e1b47",
11)
12
13print(response.output[0].content[0].text)

If no routing policy resolves for the request (no project policy and no org default), Gateway rejects requests sent with model: "default_routing" because there’s no policy to hand off to. Either configure an org default policy or send a concrete model ID.

FAQs

No. Routing strategies live on policies, so there is no type, axis, or strategy field on the POST /responses request body. Name the policy you want instead, with routing_policy_id, its alias, or its id as the model value.

Only when no routing policy applies. If a policy is active (via project or org default), omit model or pass "default_routing" and the policy picks the provider and model for you. This works for Priority and Intelligent routing.

Create one policy per strategy and send routing_policy_id per request, so the comparison is a one-field change with no extra keys or projects. Omit the field to hit the default that resolves for the request.

Gateway returns an error after all failover attempts are exhausted. Provider health is tracked automatically so requests skip providers that are currently down.

One org-level default, and one project-scoped policy per project, which serves that project’s unnamed requests. Beyond the defaults you can hold as many policies as you need and select between them per request or per API key.