API
Every route, by what it is for. Each group's page says what each route does, every field it takes and answers, and shows it in your language. Send Authorization: Bearer vk_test_... on every call.
Your company's account: who is calling, its keys, its caps, what it spent and the models it may use.
GET/v1/meWho is calling: the company, the key, and whether it is test or live. GET/v1/orgThe company account: name, status, the wallet in billed dollars, day and month caps, alert thresholds, allowed return URLs, allowed embed origins, default deployment. PATCH/v1/orgChange the name, allowed return URLs, allowed embed origins, default deployment or default memory mode. GET/v1/limitsThe day and month caps for the company and per user, the alert thresholds and the rate limits. PATCH/v1/limitsSet the day and month caps for the company and per user, and the alert thresholds, within what Vestra allows. GET/v1/usageExact billed spend and real task counts, by day, user, deployment, conversation, task, model or kind of spend, filtered by user, deployment or conversation. GET/v1/usage/line-itemsThe charges behind one task or one conversation, newest first: the receipt you can show your user. GET/v1/audit-logEvery key use, settings change and approval answer, newest first. GET/v1/modelsThe models a deployment may choose from. Your users: set one up, read their spend, change their cap, export or erase them.
POST/v1/usersCreate one of your users, or return the existing one. GET/v1/users/{user_id}One user: status, profile, memory mode, default deployment, and what they spent today and this month against their caps. PATCH/v1/users/{user_id}Change name, language, time zone, metadata, day or month spend cap, default deployment, or status (active or disabled). DELETE/v1/users/{user_id}Erase the user and everything Bash holds for them: computer, files, memory. Ask Bash in a conversation, follow its reply as it happens, and stop it.
GET/v1/conversationsConversations, newest first: one user's with user_id, or every one of the company's without it (the company's own Bash shows user_id null). The work Bash does on its computer: list it, read it, stop it or delete it.
GET/v1/tasksAll work across your users, or one user's with user_id. GET/v1/tasks/{task_id}Status, title, the progress list, the result (text, and data when an output_schema was set), the outcome, cost so far. GET/v1/tasks/{task_id}/traceEvery step: tools called with a summary of inputs and outputs, timings, tokens and cost per turn. What Bash waits on (approvals, questions, apps to connect, hand-offs, calls to your tools) and the answers.
GET/v1/interactionsEverything Bash waits on, across your users: approvals, questions, app connections, hand-offs, and calls to your client tools (type tool_call). GET/v1/interactions/{interaction_id}One item, by its int_ or call_ id: its type (approval, question, connect, handoff, tool_call), what Bash wants to do, the options, when it expires. Files Bash makes, and files you hand it.
POST/v1/filesUpload a file for Bash to use: multipart/form-data with one part named file. GET/v1/filesFiles, each with its task and conversation: one user's (user_id) or the company's own Bash's, one task's outputs (task_id), or one conversation's, its tasks' outputs (conversation_id). The apps each user connects through a sign-in link, and the apps they may choose from.
GET/v1/appsThe apps your users may connect, after your allowlist. POST/v1/connectionsGet a connect link for one app, for one user (user_id) or the company's own Bash. GET/v1/connectionsThe connected apps of one user (user_id), or of the company's own Bash. Your MCP servers and the tools they offer, and the secrets Bash uses but never shows.
POST/v1/mcp-serversRegister one: URL, auth (none, or headers using ${secret:NAME} or ${user_secret:NAME}), and its tool policy floor: tools never run and tools that always need approval, for every deployment in both modes. PUT/v1/secrets/{name}Store a secret, write-only: the company's (refer to it as ${secret:NAME}), or with user_id one user's own (${user_secret:NAME}), for example their travel account token. GET/v1/secretsSecret names, never the values: the company's, or one user's (user_id). Skills your Bash may use: upload one, give it new versions, list them.
GET/v1/skillsYour company skills, plus the skills Bash already has. POST/v1/skillsUpload a skill folder as a zip, or as JSON files. Knowledge Bash reads before it answers: notebooks, and the documents in them.
What Bash remembers about each user: read it, search it, add to it, forget it.
GET/v1/memoryWhat Bash remembers about one user (user_id), or the company's own Bash: the profile and the memories, newest first. POST/v1/memoryTell Bash a fact once, for example 'prefers window seats', for one user (user_id) or the company's own Bash. DELETE/v1/memoryForget everything about one user (user_id), or the company's own Bash. GET/v1/memory/searchAsk the memory a question (q), for one user (user_id) or the company's own Bash. How your Bash is set up, in versions: apply a whole vestra.yaml, promote, roll back, and the interview that drafts the file.
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: []). 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. POST/v1/deployments/interviewBuild a deployment by talking to Bash: describe the job, answer its questions, receive a draft version. The scenarios a version must pass, drafted or written, and the runs that check it before your users see it.
Wake a user's computer before they need it.
POST/v1/users/{user_id}/warmWake the user's computer now (for example when they open your app), so their next task starts without waiting. POST/v1/users/{user_id}/browser/fetchOpen one page in a background tab of the user's own browser, with no model, and get back the bodies of the page's own data calls that match capture. Jobs Bash runs on a schedule in plain words, or whenever your system calls.
POST/v1/routinesCreate one: what to ask, and when: every (plain words such as "weekday at 08:00", read in the user's time zone), a cron schedule, or on "call" (your system posts to its trigger_url). GET/v1/routinesThe routines of one user (user_id), or of the company's own Bash. PATCH/v1/routines/{routine_id}Change what it asks, when it runs (every, schedule or timezone), its filters, or pause and resume it. Many users at once: one ask each, followed together.
POST/v1/batchesStart a batch: a deployment, a list of items (user_id optional, message, context, metadata) and a concurrency. Where events go, how each delivery went, and the record of every event.
GET/v1/eventsThe same events as a list you can pull, for anything you missed. Bash in a browser: its live screen, a voice call, or the whole of Bash inside your app.
POST/v1/sessionsOpen a session for one of your users (user_id), or for the company's own Bash: chat, a screen to watch or drive, a voice call, and what Bash remembers (memory, when your company turned the panel on). POST/v1/sessions/{session_id}/screenWith the session's token, in control mode: the user takes the wheel or gives it back (action), or says they are driving (input), so Bash waits. Bash as an MCP server, for your editor or your own agents.
POST/v1/mcpOne MCP endpoint (streamable HTTP): the card's lines as tools, each with an optional user (with none, your company's own Bash). Each deployment as an agent other agents can call, over the A2A protocol.
The contract itself, as OpenAPI.