Skip to main content
A default-model rule picks the model for calls that don’t pass model. Set it once for an organization or project, then change it without touching code. A typical use: your app runs on openai/gpt-5-mini everywhere, then you move a single high-stakes project to anthropic/claude-opus-5 by editing one rule.

Set a default model

Default-model rules are managed through the Management API with a management key that has the controls:write scope. The Rules page in the platform does not edit them. Create a route rule whose config holds the model in default_model. Send default_model without a type field:
The most specific rule wins: a project default overrides the organization default. Setting "default_model": null on a project rule records an explicit “no default” for that project. To change the model later, send the new config with PATCH /management/v1/controls/rules/{uuid}. List existing rules with GET /management/v1/controls/rules. See the rules reference for every field. Rules are a Control Plane feature. On the Gateway plan, creating the rule answers 402 with plan_required.

The default must be allowed at its scope

A default model has to pass model access at the same scope. If it doesn’t, the API refuses the rule with 400:
The reverse is checked too: saving a model-access change that would exclude an existing default model is refused with 400 until you change or remove that default.

Callers can still pick a model

Passing an explicit model always takes precedence over the default, as long as model access allows it. Use this for per-call trade-offs: cheaper models for background jobs, higher-quality ones for user-facing replies. If the requested model isn’t allowed, the call fails with 403 and says which condition failed; it doesn’t fall back to the default. See what a blocked call returns. A call with no model and no default-model rule in its scope is refused; the Messages endpoint, for example, answers 400 with model is required. Opper does not pick a model for you.
Keep model names out of application code. Set a default per scope and switch models by editing the rule. To choose between several models per request, use a dynamic route instead.
Last modified on September 29, 2026