azure:se (Microsoft Azure in Sweden) or openai/api-us. The lock records
each route with the facts Opper’s catalog holds for it that day: the company
that runs it, where inference runs, and how the route handles content for
training, logging, moderation, and caching.
Use a lock when a data processing agreement or an internal policy names the
providers and locations a workload may use, and that list must not change when
someone edits the rules. Once a project is locked, no rule change can widen
what it reaches, and neither can a provider, location, or route that Opper
adds to the catalog later. Only replacing or releasing the lock changes it.
Locks are listed under Settings: open Data processing under Access &
security, then Model access locks. The page is at
platform.opper.ai/<your-org>/settings/data-processing/locks. Taking a lock
needs the Control Plane or Enterprise plan.
How a lock works with your rules
A lock is a ceiling on top of the project’s Model access rules. A call from a locked project goes through only when both of these hold:- The rules that apply to the project, the organization rule and any project override, allow the model.
- The model’s service route is one of the locked routes.
A lock is taken from the saved rules and the restricted routes your
organization has an agreement for. Changes not yet saved on the Rules page are
not part of it.
Like rules, a lock applies to every model type on the Opper v3 API, including
the compatibility gateway and the playground.
Deprecated APIs are not supported with locks.
Who can lock a project
With the built-in roles, Owners and Admins can lock, replace, and release.
Developers can see locks but not change them. Viewers do not see them. See
Roles and permissions.
Seeing and releasing locks work on every plan, so an organization can always
see and remove a lock it holds. On another plan, a member who may configure
rules is told which plans can lock and offered Upgrade to Control Plane.
Locks are taken on Data processing, or from a project rule on the Rules page.
The Management API does not take, replace,
or release them.
Lock a project
1
Open Model access locks
In the Opper platform, open Settings, then Data processing, then
Model access locks, and select Lock a project.
2
Pick the project
The dialog reads the project’s saved rules and shows the lock it would
take, for example “4 routes at 2 companies, 37 models.”
3
Review the preview
The readiness review lists what to know before
you lock, each item with the action that changes it where there is one.
Routes in the lock lists each route under the company that runs it,
with where it runs, how many models it serves, and its handling facts.
4
Take the lock
Optionally add a Label, such as the agreement the lock is for, then
select Lock project.
Lock from the Rules page
A project rule’s panel on the Rules page has a Lock group for each project the rule names. For a project with no lock, the group reads Not locked, with Lock this project: “A lock holds this project to the routes its saved rules allow now. Rules can narrow that later, not add to it.” The button opens the same lock dialog. Lock this project shows only to a member who may lock, on a plan that can. It is unavailable while the panel has unsaved changes: “Save or discard your changes first. A lock is taken from the saved rules.”The readiness review
The preview sorts what to know before you lock into three groups. Each item is part of what you confirm.Activating and in force
Each Opper server enforces its own copy of your locks and confirms every few seconds which version it enforces. A new lock, or a new version from a replacement, reads Activating while the servers confirm it: “Every Opper server confirms a new lock before it is in force. This usually takes under a minute.” Servers enforce the lock as soon as they load it, so calls outside it can already be refused while it is activating. Once every server has confirmed it, the lock reads In force. Its Technical details give the moment it came into force: In force since, “Every Opper server enforces it.” A lock can stay Activating for up to about 45 minutes after an Opper server stops unexpectedly. Every server that has loaded it enforces it meanwhile. If it is still Activating after an hour, contact support. A server that cannot confirm its locks stops calling providers until it can. See If a server cannot confirm its locks.What the Data processing page shows
Model access locks has one row per lock version, newest first, with the project, status, version, label, number of routes, who took the lock, and when. Replaced and released versions stay listed, so the list is also the history. Search by project or label, filter by status, and sort by date, project, status, or version.
When an active lock and the project’s saved rules differ, a chip beside its
status says how:
Select a row to open its details:
- The lock. The project, the status, the version and its label, who took the lock and when, and for a version that has ended, how, when, and by whom. While the lock is activating, it says what it waits for.
- How the lock and the rules differ. When the saved rules allow routes outside the lock: “The project’s saved rules allow 1 route, but the lock blocks it.” When the lock holds routes the rules no longer allow: “The rules already block 5 routes listed in this lock. Updating the lock removes them.” Each lists the route IDs, with Update lock and See rules, which opens the project’s Model access on the Rules page.
- Locked routes. The number of routes, then each route under its company and legal entity, with its location, route ID, and how many of its models are available now. Each row shows the recorded training and logging facts and flags anything else to know, such as Residency not enforced or Some handling facts unknown. Open a route for every recorded fact: training, logging, moderation, caching, residency, third-party access, and sub-processors. A fact the catalog had not researched reads Unknown.
- Source rules. The organization rule and the project rule as they stood when the lock was taken, in the words the Rules page uses, each with View current rule. Entitlements lists the restricted routes your organization had an agreement for.
- Version history. When the project has had more than one version, every version, with who took it and how it ended. Select Open on one to view it.
- Technical details. The lock ID, the snapshot hash, the catalog version, and for a lock in force, In force since. Use them to refer to this exact lock.
Update a lock after a rule change
A lock and the project’s saved rules can come apart in two ways:- The rules were widened. They allow routes the lock does not hold. The lock blocks calls to those routes until you replace it.
- The rules were narrowed. The lock holds routes the rules no longer allow. Nothing is blocked, since the rules refuse those routes. But a later rule change that allows them again needs no new lock, so replace the lock to bring it down to what the rules allow now.
- Above the Model access card on the Rules page, a notice lists each locked project whose lock and saved rules differ, for example “1 lock differs from the saved rules”. Projects whose lock blocks routes the rules allow come first, in amber: “The rules allow 1 route, but the lock blocks it.” Narrowed locks follow in neutral text: “The rules already block 5 routes listed in this lock.” Each line has Update lock, or View lock ↗ for a member who cannot update it, and the notice ends “Update lock creates a new lock version from the saved rules.” The notice is amber while the lock blocks any route the rules allow, and neutral when every difference is a narrowing.
- When you save on the Rules page, Rules saved names the projects the save moved, for example “support-bot’s rules now allow 2 routes, but the lock blocks them.” or “default’s rules already block 5 routes listed in its lock. Updating the lock removes them.”, with Update lock.
- In the Rules page, the project’s Model access row says how many routes the lock blocks, for example 1 route blocked by the lock, and the Lock group in its panel shows how the lock and the rules differ.
- On Data processing, the lock reads N blocked or N outside rules, and its details list the routes.
If nothing differs, the dialog says the routes and facts are the same as the
current version’s. The label starts as the current version’s. Select
Replace lock to confirm.
Replacing creates the next version and marks the previous one Replaced in
the same step, so the project is never unlocked in between. The new version
reads Activating until every Opper server has confirmed it. If another
member changed the lock while the dialog was open, the dialog compares with
the lock as it is now and asks you to confirm again.
Release a lock
Open the lock’s details and select Manage lock, then Release lock. The dialog names the project, the version, and how many routes the lock holds. Select Release lock to confirm. Once released, the project’s saved rules alone decide which models it can reach, including any route they allow that the lock blocked. Every Opper server picks up the release on its own, usually within a minute. The version stays in the list as Released. Releasing works on every plan.Change rules on a locked project
Under Model access, the Rules page lists every locked project, whether or not a rule names it:- The project’s row shows locked v1 beside its name and the number of models it can call, such as 37 models. When its saved rules allow routes the lock does not hold, the row says how many in amber, such as 1 route blocked by the lock.
- The project’s panel has a Lock group: “A lock holds this project to the routes it records. Rules can narrow that, not add to it.” It shows the version and label, who took the lock and when (“Locked by … on …”), the locked routes, and Can call with the number of models, followed by how many the saved rules allow when that is more. View lock ↗ opens the lock on Data processing.
- A locked project with no rule of its own has a row and a panel too. The panel says “No project rule. The organization rule applies, within the lock.” and offers Narrow model access for this project.
- While you edit a project rule, the model count says how many of the matching models are inside the lock. In the route picker, a route the lock does not hold is marked outside lock: “The rules allow this route, but the lock blocks it. Updating the lock allows it.” You can still pick it.
- The organization rule’s panel has a Locked projects group: “Locks hold these projects to their routes. This rule can narrow them, not widen them.” Each project shows the models your draft leaves it within its lock, and in amber any routes outside the lock.
- Blocked calls. In the organization rule’s panel, beside the rules’ own count, lock blocked N calls · 24h counts calls the lock refused that the rules allowed.
Checks on a locked project
A check that uses a model is held to the lock like any other call: it runs only on models whose routes are in the lock.- When you lock. The preview names each check that applies to the project and has no model inside the lock.
- While the project is locked. Such a check does not run in the project, and the request follows the check’s On error setting: allow, the default, lets the request through unchecked, and block refuses it. Rules marks the check couldn’t run. Open it to read that a project’s Model access lock admitted none of its models, with a link to Data processing.
- When you save a check. The check’s model picker offers only models the lock admits. Saving a check that could run on none of its models in a locked project it applies to is refused, with a message that names the lock and its version.
What a refused call returns
A call to a model outside the lock is refused with HTTP403 before anything
reaches a provider. That includes streaming requests: the error comes back
before the stream opens. The message opens with
model "<model>" is blocked by the project's Model access lock, says why,
names the project and the lock’s version, and ends with a link that opens the
lock in the platform:
Each reason is followed by the project and the lock’s version, such as
(project "support-bot", lock version 1), or only the version when the
project’s name is not known, then View the lock: and the link.
A bare model name served by a pool, such as claude-sonnet-5, and a models
fallback list skip what the lock excludes, the way
Model access
skips what the rules exclude. They are refused only when nothing inside the
lock is left. Opper does not switch a call to another model for you.
Each endpoint returns the body it returns for a rule refusal, so a client that
handles one handles the other:
On
/v3/compat/chat/completions, /v3/compat/v1/messages,
/v3/compat/responses, /v3/compat/openresponses and
/v3/compat/v1beta/interactions, error.details also carries the links:
docs_url, this page, and lock_url, the link the message ends with. The
other endpoints carry the link in the message only.
A dynamic route that the lock stops fails with
the code route_compliance_blocked, as it does for a rule.
If Opper cannot read a project’s lock, it refuses every call from that project
rather than letting one through unchecked, with a message that ends
the lock could not be read, so every model is refused until it can be,
followed by the project and the lock’s version.
See refusals in the platform
- Logs shows a refused call as Blocked by project lock, under the Blocked status filter.
- A call’s trace reads Blocked by the project’s Model access lock.
- The model catalog and the playground’s model picker mark models outside the lock Blocked by project lock, and link to Data processing.
Check before you call
List models with the locked project’s API key andGET https://api.opper.ai/v3/models?include=policy. Each model outside the
lock has "blocked_by": "lock" and the same reason as the 403:
If a server cannot confirm its locks
Every Opper server confirms the locks it enforces every few seconds. A server that cannot confirm them for several minutes stops calling providers until it can, so that it never serves an out-of-date copy of a lock. This applies to every call that server receives, whether or not the project is locked. Such a call is answered with HTTP503 and Retry-After: 5, and the message:
model_access_lock_unconfirmed, in
place of its usual refusal code. For example, a chat completion returns:
error, with no
code. A dynamic route stops with the same code.
Retry the request after the Retry-After delay. Another server, or the
same one once it confirms, serves it. Treat model_access_lock_unconfirmed as
a temporary error, like a rate limit, and not as a refusal by your rules or
your lock. Model lists keep listing the models you can use. A realtime session
open on such a server is closed, and you can open a new one.
Logs shows such a call as Server could not confirm
locks, under the Error status filter. It names no project and has no
link, because no lock refused it.
If a change has to wait
Some changes wait for any other lock change in progress: saving a rule, taking, replacing or releasing a lock, creating a custom model, deploying or rolling back a dynamic route, and deleting a project, in the platform or through the Management API. A change that waits too long is not made. It is answered with HTTP503,
Retry-After: 2, and the code model_access_lock_busy:
Retry-After delay.
When a lock ends without a release
On Enterprise, the Audit Log records each change as Locked model access,
Replaced model access lock, or Released model access lock, including
the releases a project deletion or a downgrade makes.
What a lock does not cover
- Calls that do not run in a project. A lock belongs to a project. Calls made with an organization key and no project header do not run in a project, so no project’s lock covers them. They are held to the organization’s Model access rule alone. For example, a personal agent credential works at organization scope until you attribute it to a project. To hold calls to a lock, make them with the locked project’s API key, or attribute them to the project.
- Custom models and your own provider credentials. A lock lists Opper’s routes, so a locked project cannot call a custom model or use its own provider credential.
- Processing Opper runs for itself. A lock taken from 2 November 2026 has none: every model call Opper makes for the project is held by the lock. An older lock also records what Opper ran for itself when it was taken, which no rule chooses: script generation, plus Opper’s embedding model before 27 October 2026 and error rewriting before 23 October 2026. Opper runs neither script generation nor an embedding model of its own now, and does not send a locked project’s provider errors to a model to rewrite them.
- Opper’s web tools. A locked project cannot use them. Opper’s
web search and web fetch tools send queries to
search and fetch providers that are not routes in the lock, so a request
that asks for them is refused with
403and a message that says the toolis blocked by the project's Model access lock. A model provider’s own web search is part of the model call and stays inside the lock: withengine: auto, a model that has one uses it. - What Opper stores. A lock does not change trace storage. Configure it under Opper retention.
- Other projects. Each lock holds one project. There is no organization lock: to hold every project, lock each one.
FAQ
Does a lock switch my calls to another model or route?
Does a lock switch my calls to another model or route?
No. A pinned model outside the lock is refused with
403. A bare model
name runs only on providers whose routes are in the lock, and is refused
when there are none.How many projects can I lock?
How many projects can I lock?
Any number. Each project has its own lock, with its own versions.
How do I check that a lock is in effect?
How do I check that a lock is in effect?
On Data processing, the lock reads In force once every Opper server
has confirmed it, usually under a minute after it is taken. To check from
code, list models with the project’s API key and
include=policy: models
outside the lock read "blocked_by": "lock".Why did a call fail with 503 and model_access_lock_unconfirmed?
Why did a call fail with 503 and model_access_lock_unconfirmed?
The server that took the call could not confirm its Model access locks,
so it refused every call for the moment. Retry after the
Retry-After
delay. See If a server cannot confirm its locks.What happens when a locked route's facts change?
What happens when a locked route's facts change?
The lock holds routes by ID and keeps the facts as it recorded them. The
route stays in the lock and calls to it go on. When you open Replace lock,
the comparison lists the
route as Facts changed, so you can review the facts the catalog
records now and create a new lock version.
Does releasing a lock delete it?
Does releasing a lock delete it?
No. Every version stays on Data processing with who took it, when it
ended, and why. Only the project’s access changes.
I widened the rules and the new models still fail. Why?
I widened the rules and the new models still fail. Why?
The lock holds the routes it was taken from. The rules can narrow a locked
project but cannot add routes outside its lock. Select Update lock to
create a new lock version from the saved rules.
Can I take or release a lock from code?
Can I take or release a lock from code?
No. Locks are taken, replaced, and released in the Opper platform. You
can read the effect from code with
GET /v3/models?include=policy.