POST /v1/threads/:id/messages { "message": "Summarise this account's usage risk" }
The stream returns text deltas for typing effects, a chart event with the structured spec (send it to /v1/render/chart for a presentation-ready SVG), and a files list with the CSV Aira produced. One API, whole answer.
- AnsweredText, a chart spec and the produced files, on one streaming response
- ActedRow filters compiled into every query as mandatory conditions
- HeldA token cannot widen its own scope, and a denied metric never appears
Metered per tenant, so you can rebill it without reconciling anything.
And then it keeps running
“Answer inside the row filters compiled into the token, return text, chart spec and files on one stream, and attribute the cost to the calling tenant.”