waiting, and nothing else
happens until somebody responds — through the app, or through this API.
Two endpoints matter: list what is pending, and answer it.
Where they come from
An agent raises one by callingsplox_ui, the interactive-UI tool on the
system:splox tool server. What it draws decides the interaction’s type:
The API also carries
approval and confirmation types, which are the
yes-or-no shapes of the same idea.
An agent whose tools do not include system:splox cannot ask anything, and its
runs never wait.
The object
string
int_...string
The run that is waiting.
string
approval, text, choice or confirmation.string
pending, answered, expired or cancelled.string
The question, as the agent wrote it.
object
Type-specific data safe to render: the options of a choice, the fields of a form.
object | null
The answer once given, with
submitted_at merged into it. Null while pending.string | null
When it stops being answerable, if it has a deadline.
string
Timestamps;
answered_at is null until somebody answers.Finding one
List, newest first, filtered bystatus and run_id, cursor-paged like every
other collection:
GET /v2/interactions/{interaction_id}.
If you are already watching the event stream, you do not have
to poll: an interaction.created event arrives the moment a run stops to ask,
and interaction.answered when it is resolved.
Answering
The answer is applied atomically and the answered interaction comes back with
status: "answered", answered_at set, and response carrying what you sent
plus submitted_at. The waiting run picks the answer up and continues.
Idempotency-Key is required here, not optional — answering is a decision, and a
retried request must not be able to answer twice.
When it goes wrong
An id that is not yours, or not an id at all, is a 404 before anything else is looked at — including a missing idempotency key:
Who may answer: the account the interaction belongs to, or the account being
billed for the run. Anybody else gets the 404.

