How to Use the Message Batches API for Bulk Processing with the Anthropic Python SDK
The Message Batches API enables asynchronous processing of up to 10,000 Claude requests in a single batch job using the client.messages.batches resource, which exposes methods to create, monitor, cancel, and stream results via JSONL.
The Message Batches API in the anthropic/anthropic-sdk-python repository provides a scalable solution for high-throughput workloads that do not require immediate responses. By submitting requests as a batch rather than individual synchronous calls, you reduce overhead and allow Anthropic to process your workload asynchronously within a 24-hour window.
Core Architecture of the Batches API
In src/anthropic/resources/messages/batches.py, the SDK implements batch operations through the Batches class, which extends SyncAPIResource and AsyncAPIResource. This class serves as the primary interface for all batch-related HTTP operations, internally routing calls through _post, _get, and _delete helpers.
The architecture relies on several key components:
BatchCreateParams: Defined insrc/anthropic/types/messages/batch_create_params.py, this TypedDict validates the payload for thecreatemethod, requiring an iterable ofRequestobjects.MessageBatch: A Pydantic model insrc/anthropic/types/messages/message_batch.pyrepresenting the API response containing batch metadata andprocessing_status.JSONLDecoder: Used by theresults()method to lazily stream the.jsonlresult file without loading the entire dataset into memory.- Pagination: The
list()method returnsSyncPage[MessageBatch]orAsyncPage[MessageBatch], supporting cursor-based traversal viaafter_id,before_id, andlimitparameters.
Creating a Message Batch
To initiate bulk processing, construct a list of Request objects and pass them to client.messages.batches.create(). Each request must include a unique custom_id and standard message parameters.
from anthropic import Anthropic
from anthropic.types.messages.batch_create_params import Request
client = Anthropic()
batch = client.messages.batches.create(
requests=[
Request(
custom_id="req-1",
params={
"model": "claude-3-5-sonnet-20240620",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Explain quantum tunnelling"}],
},
),
Request(
custom_id="req-2",
params={
"model": "claude-3-opus-20240229",
"max_tokens": 512,
"messages": [{"role": "user", "content": "Generate a haiku about AI"}],
},
),
]
)
print(f"Batch ID: {batch.id}")
print(f"Processing status: {batch.processing_status}")
The create method validates the payload against BatchCreateParams in src/anthropic/types/messages/batch_create_params.py and submits the batch via a POST request to the underlying API.
Monitoring Batch Status
After creation, poll the batch status using the retrieve() method until the processing_status indicates completion. According to the implementation in src/anthropic/resources/messages/batches.py, valid terminal states include succeeded, errored, and canceled.
import time
batch_id = batch.id
while True:
info = client.messages.batches.retrieve(batch_id)
print(f"Status: {info.processing_status}")
if info.processing_status in {"succeeded", "errored", "canceled"}:
break
time.sleep(10)
Managing Batches
The SDK provides comprehensive lifecycle management through the list(), cancel(), and delete() methods.
Listing Batches
Retrieve paginated batches using cursor-based navigation:
pages = client.messages.batches.list(limit=5)
for batch in pages:
print(batch.id, batch.processing_status)
The list implementation returns a SyncPage[MessageBatch] object defined in the base pagination handlers, allowing traversal through large result sets efficiently.
Canceling and Deleting
To halt processing of an in-progress batch, invoke the cancel() method. For cleanup after completion or failure, use delete():
# Cancel an active batch
canceled = client.messages.batches.cancel(batch_id)
print(f"Cancelled: {canceled.processing_status}")
# Delete a finished batch
deleted = client.messages.batches.delete(batch_id)
print(f"Deleted batch ID: {deleted.id}")
The delete() method returns a DeletedMessageBatch model from src/anthropic/types/messages/deleted_message_batch.py, confirming the removal of the batch metadata.
Retrieving Batch Results
Once a batch reaches the succeeded state, download the results using the results() method. This returns a JSONLDecoder[MessageBatchIndividualResponse] that streams the JSONL file line-by-line, yielding typed response objects without memory exhaustion.
result_stream = client.messages.batches.results(batch_id)
for result in result_stream:
print(result.custom_id, result.result)
Each item in the stream corresponds to one request from your original batch, maintaining the custom_id you assigned for correlation. For a complete working example, reference examples/batch_results.py in the SDK repository.
Summary
- The
Batchesresource inclient.messages.batchesmanages bulk processing through six core methods:create,retrieve,list,cancel,delete, andresults. - Request construction requires the
RequestTypedDict with a uniquecustom_idand standard message parameters, validated byBatchCreateParams. - Status monitoring relies on polling
retrieve()until theprocessing_statusreaches a terminal state (succeeded,errored, orcanceled). - Result retrieval uses JSONL streaming via
JSONLDecoderto handle large result sets efficiently without loading the entire file into memory. - All operations are implemented in
src/anthropic/resources/messages/batches.pywith type definitions insrc/anthropic/types/messages/.
Frequently Asked Questions
How many requests can I include in a single Message Batch?
You can include up to 10,000 requests per batch. Each request must be a Request object containing a unique custom_id and the standard parameters for message creation. The batch processes asynchronously and must complete within 24 hours.
What is the difference between canceling and deleting a batch?
Canceling (client.messages.batches.cancel) stops processing for batches in the in_progress state, transitioning them to canceled. Deleting (client.messages.batches.delete) removes the batch metadata and results from Anthropic's servers after processing completes, returning a DeletedMessageBatch confirmation. You cannot delete a batch while it is still processing.
How do I correlate results with my original requests?
When creating a batch, assign a unique custom_id to each Request object. The results() method returns a stream where each MessageBatchIndividualResponse maintains this custom_id, allowing you to map responses back to your original inputs without relying on array order.
Can I access raw HTTP responses or stream the API response?
Yes. The Batches class provides with_raw_response and with_streaming_response accessors that return the underlying httpx.Response or a streaming wrapper, respectively. These are defined in src/anthropic/resources/messages/batches.py and allow access to headers, status codes, or body streaming without buffering.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →