BashBrainTeammatesPricingDevelopersGet a test key

Conversations

Ask Bash in a conversation, follow its reply as it happens, and stop it.

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

GET/v1/conversations/{conversation_id}/eventsThe one stream (SSE): replies as they are typed, work started and finished, progress, approvals, tool calls, files.

Resume with Last-Event-ID. Filter to one task's events with task_id.

Your API key, or a session's token, scope runtime or all. On the card: events. Every call here is a checked sample.

Request6 fields

Path

conversation_idstringrequiredThe conversation's id (conv_...).
Type
string

Query

format"sse" | "json"sse follows the events as they happen (text/event-stream); json reads one page of them. Default: sse.
Type
"sse" | "json"
afterintegerOnly events after this seq. On the stream, a Last-Event-ID header does the same. Absent: from the first kept event.
Type
integer
limitintegerWith format json: at most this many events, 1 to 500. Default: 100.
Type
integer
task_idstringOnly this task's events (task_...).
Type
string

Headers

Last-Event-IDstringResume after this event id.
Type
string
Answers 2002 fields

A stream of events; with format=json, a page of them.

dataobject[]The events, oldest first.
seqintegerIts place on the conversation's stream, counting up: send the last one you saw to pick up after it.
Type
integer
typestringWhat happened, from the one catalog of events: the events reference says what each carries and where it is delivered.
Limits
One of 34 values.
Example
message.completed
datamap of anyWhat it says: its fields depend on its type, as the events reference lists them.
Type
map of any
created_atstringWhen it happened, as an ISO 8601 time.
Type
string
next_afterintegerThe seq to send as after for the next page: the last one here, or the after you sent (0 without one) when the page is empty.
Type
integer
TypeScript
for await (const event of vestra.events('conv_8f2k')) {  if (event.type === 'message.completed') break;}
Python
for event in vestra.events("conv_8f2k"):    if event.type == "message.completed":        break
CLI
vestra events conv_8f2k
HTTP
# Stream a conversation live. If the connection drops, reconnect with the last seq you saw.curl -N "$VESTRA_BASE_URL/v1/conversations/conv_8f2k/events" \  -H "Authorization: Bearer $VESTRA_API_KEY" \  -H "Last-Event-ID: 41" # Read the same events as JSON. You get them in pages, after the seq you give.curl "$VESTRA_BASE_URL/v1/conversations/conv_8f2k/events?format=json&after=41" \  -H "Authorization: Bearer $VESTRA_API_KEY" # Read a task afterwards. You get every step of one task, with tokens and cost per turn.curl "$VESTRA_BASE_URL/v1/tasks/task_91d/trace" \  -H "Authorization: Bearer $VESTRA_API_KEY" # Send events to your server. Register a URL and the events it wants. The signing secret is shown only once.curl "$VESTRA_BASE_URL/v1/webhooks" \  -H "Authorization: Bearer $VESTRA_API_KEY" \  -H "Content-Type: application/json" \  -d '{ "url": "https://hooks.example.com/vestra", "events": ["task.completed", "interaction.created", "usage.cap_reached"] }' # Catch up on what you missed. List the events your webhooks were sent, newest first.curl "$VESTRA_BASE_URL/v1/events?type=task.failed" \  -H "Authorization: Bearer $VESTRA_API_KEY"
MCP
{  "method": "tools/call",  "params": {    "name": "events",    "arguments": { "user": "traveller-42", "conversation": "conv_8f2k", "after": 0 }  }}