Anthropic opened a public beta of message threads in the Messages API. Today every turn of an agent loop uploads the whole conversation again, and the API validates and tokenizes all of it again. With a thread, you send the full conversation once (with system and tools) and add "thread": {"type": "create"}. On each later turn you send only the new messages plus "thread": {"type": "continue", "previous_message_id": "msg_..."}, and you leave system and tools out.
Anthropic's own number comes from Claude Code, where threads are on by default for most users: on requests between 500K and 1M tokens, median time to first token fell about 35%. Token usage stays the same, because Claude still reads the full conversation every turn. Only the upload shrinks.
The rules are strict. Every request needs the beta header message-threads-2026-08-12. A thread expires 5 minutes after its last request and is deleted within an hour of its last use. Threads are append-only, each response id can be continued once, and fields like model, thinking and tool_choice have to match the create request or you get a 400 with thread_fingerprint_mismatch. When a continue call returns a 404 (thread_not_found), you replay the full conversation in a new create request, so your app still keeps its own copy. The SDK helper, client.beta.messages.thread(...), does that replay for you.
Threads don't work with Message Batches, token counting or on-demand compaction, and zero data retention doesn't cover them. You can use them on the Claude API, Claude Platform on AWS, Claude on Google Cloud (Anthropic managed) and Microsoft Foundry.

