There is no conversation. There is one input, rebuilt.
The common read: The conversation lives on their server and I am adding to it, so my twelfth message costs about what my first one did.
Nothing is stored. The Messages API reference says the endpoint serves "either single queries or stateless multi-turn conversations", and stateless is the operative word: there is no session on the other side, no thread id, and nothing to append to. What creates the appearance of a conversation is that your client re-sends the entire history as an array on every request, and the reference says so in the same paragraph.
Read the shape rather than the product. You specify the prior conversational turns with the messages parameter, and the model generates the next message from that array, together with the tools and system text this lesson accounts for later. The array is your data structure, held by your process, serialised and posted whole each time. Twelve turns is twelve requests, and the twelfth one carries every byte of the previous eleven along with the new question.
Loop has been talking to the model for an hour and feels understood. Loop has been paying, every single turn, to re-explain everything Loop has ever said. Loop is not understood. Loop is subscribed.
That arrives as a bill nobody can account for, filed against the model as "it got more expensive this month", on a team whose usage in requests is flat and whose usage in tokens tripled. The requests were long threads, and long threads are quadratic. Price a thread before you open it: cost is the sum of every prefix, so a fifty-turn session is not fifty times a one-turn session, it is roughly thirteen hundred times one turn.
