BashBrainTeammatesPricingDevelopersGet a test key

Interactions

What Bash waits on (approvals, questions, apps to connect, hand-offs, calls to your tools) and the answers.

Send Authorization: Bearer vk_test_... on every call. Every route of Interactions.

POST/v1/interactions/{interaction_id}/cancelWithdraw it.

The task carries on without that action.

Your API key, scope runtime or all. On the card: answer. Over HTTP it is made from the contract: fill in each {…} and every value.

Request3 fields

Path

interaction_idstringrequiredWhat Bash waits on, by its id: int_..., or call_... for a call to your tool.
Type
string

Headers

Idempotency-KeystringSend the same key to retry this call safely for 24 hours.
Type
string

Body, if you send one

reasonstringWhy it was withdrawn, for Bash, in at most 500 characters. Default: Withdrawn by the company.
Default
Withdrawn by the company.
Limits
1 to 500 characters.
Answers 20020 fields
object"interaction"Always interaction.
Type
"interaction"
idstringThe interaction, to answer by its id (int_...; call_... for a call to your tool).
Example
int_3j9
user_idstring | nullYour id for the user it is for; null on your company's own Bash.
Type
string | null
task_idstring | nullThe task that asked (task_...); null for a call to your tool that Bash's reply made.
Type
string | null
conversation_idstring | nullIts conversation (conv_...); null when its task has none.
Type
string | null
kind"ask_question" | "composio_auth" | "tool_permission" | "credit_approval" | "exit_plan" | "custom" | "hands_approval" | "plan_limit"What exactly Bash waits on. ask_question: a question, or a hand-off. composio_auth: connecting an app. tool_permission: a step with a tool. credit_approval: spending on a paid tool. exit_plan: a plan before it starts. hands_approval: an action on a computer, approved in person. plan_limit: a plan's limit ran out (read only). custom: anything else, named by details.renderer.
Type
"ask_question" | "composio_auth" | "tool_permission" | "credit_approval" | "exit_plan" | "custom" | "hands_approval" | "plan_limit"
type"approval" | "question" | "connect" | "handoff" | "tool_call"What kind of answer it takes. approval: yes or no. question: an answer to each question. connect: your user connects an app. handoff: a person does one thing, then says so. tool_call: your tool returns an output or an error.
Type
"approval" | "question" | "connect" | "handoff" | "tool_call"
status"pending" | "resolved" | "cancelled" | "expired"pending: Bash waits on it. resolved: it was answered. cancelled: it was withdrawn before an answer. expired: nobody answered in time.
Type
"pending" | "resolved" | "cancelled" | "expired"
summarystringWhat Bash wants, in a phrase to show your user.
Example
pay, amount $500.00
moves_moneyboolean | nullWhether saying yes spends money, such as a payment. null on the card for one of your own tools (a function of yours, or a tool of your MCP servers): your app knows what your tools cost, and Vestra cannot.
Type
boolean | null
requires_present_userbooleanWhether a yes needs present_user: true, meaning the person who saw it said yes: true for a payment, and for an action approved in person.
Type
boolean
noncestringmay be absentFor an action approved in person (hands_approval) only: send it back with your yes.
Type
string
questionsobject[]may be absentFor a question or a hand-off: what Bash asks, one or more questions.
questionstringThe question, as Bash asks it.
Example
Which flight should I book?
headerstringA short label for it, for a heading or a chip; empty when Bash gave none.
Type
string
optionsobject[]Answers Bash suggests; your user may still answer in their own words. Empty when it suggests none.
labelstringAn answer your user can pick.
Type
string
descriptionstringA line more about that answer; empty when there is none.
Type
string
multi_selectbooleanWhether more than one option may be picked.
Type
boolean
frame_urlstringmay be absentFor a hand-off, on a single read only (never in lists): the page Bash was on when it asked, as a JPEG data URI.
Type
string
browserobjectmay be absentFor a hand-off in the browser: open a session with a screen (POST /v1/sessions) so a person can do it.
suggested_mode"control"Open the screen with control, so the person can take the wheel.
Type
"control"
urlstring | nullThe page Bash's browser is on; null when it did not say.
Type
string | null
detailsmap of anyA few named facts for its kind, safe to show: such as tool_name and rows for a tool step (with server for a tool of an MCP server, and its arguments as rows), or app for a connection. Never the raw request.
Type
map of any
outcomeobject | nullHow it ended; null while it is pending.
decision"approved" | "denied" | "answered" | "cancelled" | "expired"How it ended.
Type
"approved" | "denied" | "answered" | "cancelled" | "expired"
answersstring[]may be absentFor an answered question: the answer to each question, in order.
Type
string[]
reasonstringmay be absentFor a denial: why, when one was recorded.
Type
string
messagestringmay be absentFor a denial: the note that was sent with the no, when there was one.
Type
string
created_atstringWhen Bash asked, as an ISO 8601 time.
Type
string
expires_atstring | nullWhen it expires unanswered, as an ISO 8601 time; null when it never does.
Type
string | null
resolved_atstring | nullWhen it was answered, withdrawn or expired, as an ISO 8601 time; null while pending.
Type
string | null
TypeScript
await vestra.answer.cancel('int_3j9');
Python
vestra.answer.cancel("int_3j9")
HTTP

No sample in your language for this route, so here it is over HTTP.

curl -X POST "$VESTRA_BASE_URL/v1/interactions/{interaction_id}/cancel" \  -H "Authorization: Bearer $VESTRA_API_KEY"