Construct a list of request objects, each containing a unique custom_id string and a params object with model, max_tokens, and messages fields matching the Messages API schema.
Submit the batch by calling POST /v1/messages/batches with the requests list in the body and x-api-key: YOUR_KEY and anthropic-version headers.
Record the batch ID from the response; the initial processing_status will be 'in_progress'.
Poll GET /v1/messages/batches/{BATCH_ID} periodically until processing_status is 'ended'; avoid polling more frequently than once per minute to respect rate limits.
Retrieve results by fetching the results_url provided in the ended batch object; the response is a JSONL stream where each line is a result keyed by custom_id.
Parse each result line to extract the individual message response or error for each custom_id.
Known gotchas
Batch results are available for a limited retention window after the batch ends; download the JSONL results promptly as they will eventually expire.
Each individual request within a batch is subject to the same content and token limits as a direct Messages API call; oversized requests within the batch will fail at the per-request level, not the batch level.
The Message Batches API is priced differently from synchronous requests; verify current pricing before assuming cost equivalence.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp