Conversations
Ask Bash in a conversation, follow its reply as it happens, and stop it.
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.
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
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
for await (const event of vestra.events('conv_8f2k')) { if (event.type === 'message.completed') break;}for event in vestra.events("conv_8f2k"): if event.type == "message.completed": breakvestra events conv_8f2k# 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"{ "method": "tools/call", "params": { "name": "events", "arguments": { "user": "traveller-42", "conversation": "conv_8f2k", "after": 0 } }}