A vendor holding an install key proposes a replacement document for it.
const url = 'https://api.canopyhq.dev/installs/example/proposals';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"appdoc":1,"description":"example","name":"example","tools":[{"description":"example","input_schema":"example","name":"example","output_schema":"example","result_limit":"example","timeout":"example"}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.canopyhq.dev/installs/example/proposals \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "appdoc": 1, "description": "example", "name": "example", "tools": [ { "description": "example", "input_schema": "example", "name": "example", "output_schema": "example", "result_limit": "example", "timeout": "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 the current key must name.
Request Bodyrequired
Section titled “Request Bodyrequired”A proposed document with bounds checked before it is stored.
object
The vendor document version, read through the same shape chain as storage.
Examplegenerated
{ "appdoc": 1, "description": "example", "name": "example", "tools": [ { "description": "example", "input_schema": "example", "name": "example", "output_schema": "example", "result_limit": "example", "timeout": "example" } ]}Responses
Section titled “Responses”The update proposal, consent URL, and poll secret. Grant keeps this install and its key; its committed poll receipt remains for the proposal’s ten-minute lifetime.
What a vendor gets back: the proposal plus where to send the human.
object
What the vendor polls with. Issued once with the proposal; stored hashed.
One proposal. Minted per POST, so two proposals of one document are two requests, each with its own secret and its own key.
The vendor config’s content hash: 64 hex chars.
Examplegenerated
{ "expires": 1, "interval": 1, "poll_secret": "example", "request": "example", "vendor": "example", "consent_url": "example"}The response body names the invalid field and reason in the proposed vendor config.
The key does not name this install.