Replace the tenant's consent. Open sessions keep their landed config; sessions opened afterward use the updated consent.
const url = 'https://api.canopyhq.dev/installs/example';const options = { method: 'PUT', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"extra_tools":[{"connection":"example","tool":"example"}],"inference":"example","policies":[{"allow":true,"items":[{"arg":"example","effect":"allow","op":"is","operand":{"value":"example"}}],"posture":"permissive","project":["example"],"tool":"example"}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PUT \ --url https://api.canopyhq.dev/installs/example \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "extra_tools": [ { "connection": "example", "tool": "example" } ], "inference": "example", "policies": [ { "allow": true, "items": [ { "arg": "example", "effect": "allow", "op": "is", "operand": { "value": "example" } } ], "posture": "permissive", "project": [ "example" ], "tool": "example" } ] }'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Opaque; never the key, never anything the vendor chose.
The install whose consent changes.
Request Bodyrequired
Section titled “Request Bodyrequired”What the tenant lands at consent. Inference must be selected; an empty policy
list allows every tool and an empty extra-tools list adds nothing. The
policies name tools as the model sees them and compile in policy, against
the surface the resolved connections give, which is not this type’s to know.
object
A tool the tenant brings that the vendor did not state: a pre-registered remote, such as an MCP server the tenant already links to.
object
The name by which an MCP server identifies and invokes a tool.
The tenant’s rules for one tool, named by the name the model sees.
object
The tool enable. Off, nothing else here matters.
What a tool’s allow items do: nothing under Permissive, where only deny
items bind; bind under Restrictive, where a conditioned arg must satisfy
one of them.
Args projected for evidence alone, conditioned or not.
Responses
Section titled “Responses”The updated document. The vendor config is unchanged. Open sessions keep the config they landed at open; sessions opened after the change use the new config.
The composed document served to an install or the console.
object
What the tenant lands at consent. Inference must be selected; an empty policy
list allows every tool and an empty extra-tools list adds nothing. The
policies name tools as the model sees them and compile in policy, against
the surface the resolved connections give, which is not this type’s to know.
object
A tool the tenant brings that the vendor did not state: a pre-registered remote, such as an MCP server the tenant already links to.
object
The name by which an MCP server identifies and invokes a tool.
The tenant’s rules for one tool, named by the name the model sees.
object
The tool enable. Off, nothing else here matters.
What a tool’s allow items do: nothing under Permissive, where only deny
items bind; bind under Restrictive, where a conditioned arg must satisfy
one of them.
Args projected for evidence alone, conditioned or not.
A vendor document with its wire version beside the vendor fields.
object
The vendor document version, read through the same shape chain as storage.
Example
{ "tenant": { "policies": [ { "items": [ { "effect": "allow", "op": "is" } ], "posture": "permissive" } ] }}Parse errors identify the field and reason when available. The tenant config may not fit the vendor’s or resolve under the tenant. An invalid policy returns its reason in the error body.
No console token, or one that did not verify.
Only an owner of the tenant may change consent.
The tenant has no such install.