Both ride on the same tool-call machinery: the parent tool call waits while the interaction is
open. An interaction ends in one of two states — resolved (someone answered) or canceled (the work it guarded was canceled, superseded, or archived).
Find open interactions
- API
- Dashboard
The examples assume the client, Filter by
$ORG/orgID, and $PROJ/projectID setup from the quickstart, plus the $AGENT/agentID value above. The CLI has no interactions commands — respond from the dashboard or the API.state (open, resolved, canceled) or omit it for everything; results are cursor-paginated, oldest first. Open interactions announce themselves through tool_call_update frames on the event stream and configured webhooks; use this endpoint to fetch the form to render.Full schema and playground: List agent interactions.
Render the form
Every interaction’srequest is the same small form structure, designed to render without special-casing:
title— one line saying what’s being asked.context— optional label/value pairs to display verbatim (the command about to run, the machine it targets). Show all of them; they’re the approver’s evidence.questions— one or more, in order. Each has apromptand at least one option.multiple: truemeans the answer may select several options; an option withallows_text: trueinvites free text alongside the selection (in permission forms, that’s the “Deny” option — the text becomes the reason the model sees).
Allow at index 0 and Deny at index 1. Question forms are composed by the agent, so treat them generically.
Resolve it
- API
- Dashboard
Answer with one entry per question, in order. To deny with a reason, select the Deny option and attach text:
option_indices are zero-based positions into that question’s options. The response is the interaction in its final state:- Resolution is first-writer-wins. Re-sending the same answers replays idempotently —
200with the already-resolved interaction. Sending different answers, or resolving a canceled interaction, returns409with codeidempotency_key_conflict. Whoever answers first, wins; build your approval UI to handle the race gracefully. - Attribution works like inputs. Services relaying human decisions pass
actoralongsideanswerssoresolved_by_input_idtraces to the real person — see actors.
Full schema and playground: Resolve agent interaction.
When interactions cancel
You never delete an interaction; it cancels when the work it guarded goes away:- Sending input with
cancel_open_interactions: true— your new message supersedes the pending prompts; their tool calls complete ascanceled. - Stopping the agent or archiving it — everything in flight, interactions included, is canceled.
request and stay listable, so audit trails show what was asked even when nobody answered.
Present interactions in your own app
Your application decides where to display questions and approvals. Read the interaction’srequest, present the form, and resolve it through the ordinary
project-authorized API. The dashboard remains available if delivery fails.
Reconcile the interaction list on reconnect and periodically while connected;
stream hints alone are insufficient.
For an interaction routed to an integration handler, list and resolve responses include
its captured destination. Its integration_id and integration_target_id
are public IDs; handler_key identifies the handler and conversation contains
the provider fields, using the same format as integration subscriptions.
This snapshot stays fixed when the agent’s current
destination changes. Optional presentation_receipt contains recorded provider
message metadata. These fields describe integration delivery; your application can
present interactions without them. See Integrations for handler
configuration and integration-specific behavior, or
Custom integrations
for presenting interactions through your own service.
Next
Artifacts
Download the files agents produce and reference
Agent configuration
Decide which tools require approval in the first place