Deployments
How your Bash is set up, in versions: apply a whole vestra.yaml, promote, roll back, and the interview that drafts the file.
RoutesOpen one for every field it takes and answers.
GET/v1/deploymentsYour deployments.
Request2 fields
Query
limitintegerHow many items per page, 1 to 100. Default 20.
- Type
integer
cursorstringWhere to go on from: the next_cursor of the page before, unchanged. Absent: the first page.
- Type
string
Answers 2002 fields
dataobject[]The items on this page.
idstringThe deployment's id.
- Example
dep_8f2k
object"deployment"Always deployment.
- Type
"deployment"
namestringIts name, as people read it.
- Type
string
slugstringIts name in URLs and refs: send it where a route takes {deployment_id}.
- Example
trip-rescue
descriptionstringWhat it is for; empty when none was given.
- Type
string
base"bash"What it is built on: always bash.
- Type
"bash"
status"active" | "archived"active, or archived (put away: no new conversation or version reaches it).
- Type
"active" | "archived"
draft_versionintegerThe version test keys run. A new save moves it there; a promote with a test key moves it to the version named, older ones included.
- Type
integer
live_versioninteger | nullThe version live keys run; null until one is promoted.
- Type
integer | null
created_atstringWhen it was made, as an ISO 8601 date and time in UTC.
- Type
string
updated_atstringWhen it last changed, as an ISO 8601 date and time in UTC.
- Type
string
next_cursorstring | nullSend it as cursor for the next page; null on the last page.
- Type
string | null
No sample in your language for this route, so here it is over HTTP.
curl "$VESTRA_BASE_URL/v1/deployments" \ -H "Authorization: Bearer $VESTRA_API_KEY"POST/v1/deploymentsCreate one on base 'bash'.
It starts with a draft version.
GET/v1/deployments/{deployment_id}One deployment, by its id or its name: the live version and the draft.
With format=yaml, its latest version as vestra.yaml.
PUT/v1/deployments/{deployment_id}Apply a whole vestra.yaml, sent as JSON, by the deployment's name: the first call makes it, and a file that changes nothing makes no version (changed: []).
MCP servers are registered by URL, and the tool policy the file gives each one is this version's own, on top of the server's floor, from the moment the version runs. Tests become scenarios, and the routines and webhooks the file declares are its own. ?promote=after_tests (the default), now or no promotes in the key's mode. 400 secret_missing names the secrets to store first; 409 mcp_server_shared names the other deployments that run an MCP server whose headers the file would change.
PATCH/v1/deployments/{deployment_id}Rename, describe or archive it.
POST/v1/deployments/{deployment_id}/versionsSave a new version: instructions, language, MCP servers and this version's own tool policy for them (mcp_tool_policy, on top of each server's floor), allowed apps, approval rules, model, memory mode, notebooks, limits per task.
GET/v1/deployments/{deployment_id}/versionsEvery version.
GET/v1/deployments/{deployment_id}/versions/{version}One version, in full.
GET/v1/deployments/{deployment_id}/diffWhat changed between two versions (?from=&to=).
POST/v1/deployments/{deployment_id}/versions/{version}/promoteMake it live.
Refused unless its latest test run passed.