Skip to main content
Self-hosted deployments require Enterprise Gateway v2.6.1+.
Portkey exposes Anthropic’s Message Batches API through the unified OpenAI-compatible /v1/batches endpoints. All five batch operations — create, retrieve, cancel, list, and get output — are supported, so you can run large, asynchronous Claude jobs at 50% lower cost without leaving the Portkey gateway. Use batches when you need to run large jobs offline — e.g. nightly evals, bulk summarization, or dataset grading.

Supported Endpoints

Gateway EndpointAnthropic UpstreamOperation
POST /v1/batchesPOST /v1/messages/batchesCreate a batch
GET /v1/batches/{batch_id}GET /v1/messages/batches/{batch_id}Retrieve a batch
POST /v1/batches/{batch_id}/cancelPOST /v1/messages/batches/{batch_id}/cancelCancel a batch
GET /v1/batchesGET /v1/messages/batchesList batches
GET /v1/batches/{batch_id}/outputStreams from results_urlGet batch output

Request Format

Unlike OpenAI’s file-based batches, Anthropic batch creation uses an inline requests[] array — there is no input_file_id. Each item carries a custom_id and a params object containing the standard Messages API payload.
{
  "requests": [
    {
      "custom_id": "req-1",
      "params": {
        "model": "claude-sonnet-4-20250514",
        "max_tokens": 1024,
        "messages": [
          { "role": "user", "content": "Hello" }
        ]
      }
    }
  ]
}

Create a Batch

from portkey_ai import Portkey

portkey = Portkey(
    api_key="PORTKEY_API_KEY",
    provider="@anthropic"
)

batch = portkey.post(
    "/batches",
    requests=[
        {
            "custom_id": "req-1",
            "params": {
                "model": "claude-sonnet-4-20250514",
                "max_tokens": 1024,
                "messages": [{"role": "user", "content": "Hello"}]
            }
        }
    ]
)

print(batch)

Retrieve a Batch

Retrieving a batch returns the OpenAI-compatible Batch object. Once processing completes, the response additionally includes results_url pulled from Anthropic so you can stream outputs.
from portkey_ai import Portkey

portkey = Portkey(
    api_key="PORTKEY_API_KEY",
    provider="@anthropic"
)

batch = portkey.batches.retrieve(batch_id="<batch_id>")

print(batch)

List Batches

from portkey_ai import Portkey

portkey = Portkey(
    api_key="PORTKEY_API_KEY",
    provider="@anthropic"
)

batches = portkey.batches.list()

print(batches)

Cancel a Batch

from portkey_ai import Portkey

portkey = Portkey(
    api_key="PORTKEY_API_KEY",
    provider="@anthropic"
)

cancelled = portkey.batches.cancel(batch_id="<batch_id>")

print(cancelled)

Get Batch Output

Before streaming results, Portkey retrieves the batch metadata and verifies that processing_status === 'ended'. It then fetches from Anthropic’s results_url, falling back to /messages/batches/{batch_id}/results if the URL is unavailable. The response body is streamed back as JSONL in Anthropic’s native format by default.
curl https://api.portkey.ai/v1/batches/<batch_id>/output \
  -H "x-portkey-api-key: $PORTKEY_API_KEY" \
  -H "x-portkey-provider: @anthropic"
A typical output line looks like:
{
  "custom_id": "req-1",
  "result": {
    "type": "succeeded",
    "message": {
      "id": "msg_01XYZ...",
      "type": "message",
      "role": "assistant",
      "content": [{ "type": "text", "text": "Hello! How can I help?" }],
      "model": "claude-sonnet-4-20250514",
      "stop_reason": "end_turn",
      "usage": { "input_tokens": 10, "output_tokens": 12 }
    }
  }
}

Response Format

createBatch, retrieveBatch, cancelBatch, and listBatches always return the OpenAI Batch shape so existing OpenAI tooling works unchanged:
  • object: "batch" and endpoint: "/v1/batches" on every batch record.
  • status values normalized to OpenAI-compatible strings (validating, in_progress, finalizing, completed, failed, cancelling, cancelled, expired).
  • Timestamps converted from Anthropic’s ISO 8601 format to Unix epoch seconds.
  • Request counts mapped: succeeded → completed, errored → failed.
  • retrieveBatch additionally surfaces results_url from the Anthropic response when the batch has finished processing.
getBatchOutput is the exception — it streams the raw Anthropic-native JSONL so you get per-request message objects with full Claude response fidelity (content blocks, tool use, stop reasons, usage).

See Also

Last modified on April 24, 2026