Replace the tenant's consent for an install
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","inferences":["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", "inferences": [ "example" ], "policies": [ { "allow": true, "items": [ { "arg": "example", "effect": "allow", "op": "is", "operand": { "value": "example" } } ], "posture": "permissive", "project": [ "example" ], "tool": "example" } ] }'Replace the tenant’s consent. Open sessions keep their landed config; sessions opened afterward use the updated consent.
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. The consented presets are a set with a
default a dial that names none runs on; a config written before the set
existed consents to its default alone. 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 default preset: what a session runs on when its dial names none.
Every preset a session may name, the default among them.
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. The install reads it with the presets it may open sessions on.
object
A preset the install may name on dial, as the install reads it: what it runs, never where its secret is.
object
Whether a dial that names no preset runs on this one.
Which kind of provider, without where it is or what it dials with.
What the tenant lands at consent. The consented presets are a set with a
default a dial that names none runs on; a config written before the set
existed consents to its default alone. 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 default preset: what a session runs on when its dial names none.
Every preset a session may name, the default among them.
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
{ "inferences": [ { "provider": "simulated" } ], "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.