All skills
Skillintermediate

Anthropic Passthrough

import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';

Claude Code Knowledge Pack7/10/2026

Overview

Anthropic Passthrough

Pass-through endpoints for Anthropic - call provider-specific endpoint, in native format (no translation).

FeatureSupportedNotes
Cost Trackingsupports all models on /messages, /v1/messages/batches endpoint
Loggingworks across all integrations
End-user Trackingdisable prometheus tracking via litellm.disable_end_user_cost_tracking_prometheus_only
Streaming

Just replace https://api.anthropic.com with LITELLM_PROXY_BASE_URL/anthropic

Example Usage

curl --request POST \\
  --url http://0.0.0.0:4000/anthropic/v1/messages \\
  --header 'accept: application/json' \\
  --header 'content-type: application/json' \\
  --header "Authorization: bearer sk-anything" \\
  --data '{
        "model": "claude-3-5-sonnet-20241022",
        "max_tokens": 1024,
        "messages": [
            {"role": "user", "content": "Hello, world"}
        ]
    }'
from anthropic import Anthropic

# Initialize client with proxy base URL
client = Anthropic(
    base_url="http://0.0.0.0:4000/anthropic", # <proxy-base-url>/anthropic
    api_key="sk-anything" # proxy virtual key
)

# Make a completion request
response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "Hello, world"}
    ]
)

print(response)

Supports ALL Anthropic Endpoints (including streaming).

See All Anthropic Endpoints

Quick Start

Let's call the Anthropic /messages endpoint

  1. Add Anthropic API Key to your environment
  1. Start LiteLLM Proxy
litellm

# RUNNING on http://0.0.0.0:4000
  1. Test it!

Let's call the Anthropic /messages endpoint

curl http://0.0.0.0:4000/anthropic/v1/messages \\
     --header "x-api-key: $LITELLM_API_KEY" \\
     --header "anthropic-version: 2023-06-01" \\
     --header "content-type: application/json" \\
     --data \\
    '{
        "model": "claude-3-5-sonnet-20241022",
        "max_tokens": 1024,
        "messages": [
            {"role": "user", "content": "Hello, world"}
        ]
    }'

Examples

Anything after http://0.0.0.0:4000/anthropic is treated as a provider-specific route, and handled accordingly.

Key Changes:

Original EndpointReplace With
https://api.anthropic.comhttp://0.0.0.0:4000/anthropic (LITELLM_PROXY_BASE_URL="http://0.0.0.0:4000")
bearer $ANTHROPIC_API_KEYbearer anything (use bearer LITELLM_VIRTUAL_KEY if Virtual Keys are setup on proxy)

Example 1: Messages endpoint

LiteLLM Proxy Call

curl --request POST \\
  --url http://0.0.0.0:4000/anthropic/v1/messages \\
  --header "x-api-key: $LITELLM_API_KEY" \\
    --header "anthropic-version: 2023-06-01" \\
    --header "content-type: application/json" \\
  --data '{
    "model": "claude-3-5-sonnet-20241022",
    "max_tokens": 1024,
    "messages": [
        {"role": "user", "content": "Hello, world"}
    ]
  }'

Direct Anthropic API Call

curl https://api.anthropic.com/v1/messages \\
     --header "x-api-key: $ANTHROPIC_API_KEY" \\
     --header "anthropic-version: 2023-06-01" \\
     --header "content-type: application/json" \\
     --data \\
    '{
        "model": "claude-3-5-sonnet-20241022",
        "max_tokens": 1024,
        "messages": [
            {"role": "user", "content": "Hello, world"}
        ]
    }'

Example 2: Token Counting API

LiteLLM Proxy Call

curl --request POST \\
    --url http://0.0.0.0:4000/anthropic/v1/messages/count_tokens \\
    --header "x-api-key: $LITELLM_API_KEY" \\
    --header "anthropic-version: 2023-06-01" \\
    --header "anthropic-beta: token-counting-2024-11-01" \\
    --header "content-type: application/json" \\
    --data \\
    '{
        "model": "claude-3-5-sonnet-20241022",
        "messages": [
            {"role": "user", "content": "Hello, world"}
        ]
    }'

Direct Anthropic API Call

curl https://api.anthropic.com/v1/messages/count_tokens \\
     --header "x-api-key: $ANTHROPIC_API_KEY" \\
     --header "anthropic-version: 2023-06-01" \\
     --header "anthropic-beta: token-counting-2024-11-01" \\
     --header "content-type: application/json" \\
     --data \\
'{
    "model": "claude-3-5-sonnet-20241022",
    "messages": [
        {"role": "user", "content": "Hello, world"}
    ]
}'

Example 3: Batch Messages

LiteLLM Proxy Call

curl --request POST \\
    --url http://0.0.0.0:4000/anthropic/v1/messages/batches \\
    --header "x-api-key: $LITELLM_API_KEY" \\
    --header "anthropic-version: 2023-06-01" \\
    --header "anthropic-beta: message-batches-2024-09-24" \\
    --header "content-type: application/json" \\
    --data \\
'{
    "requests": [
        {
            "custom_id": "my-first-request",
            "params": {
                "model": "claude-3-5-sonnet-20241022",
                "max_tokens": 1024,
                "messages": [
                    {"role": "user", "content": "Hello, world"}
                ]
            }
        },
        {
            "custom_id": "my-second-request",
            "params": {
                "model": "claude-3-5-sonnet-20241022",
                "max_tokens": 1024,
                "messages": [
                    {"role": "user", "content": "Hi again, friend"}
                ]
            }
        }
    ]
}'

Direct Anthropic API Call

curl https://api.anthropic.com/v1/messages/batches \\
     --header "x-api-key: $ANTHROPIC_API_KEY" \\
     --header "anthropic-version: 2023-06-01" \\
     --header "anthropic-beta: message-batches-2024-09-24" \\
     --header "content-type: application/json" \\
     --data \\
'{
    "requests": [
        {
            "custom_id": "my-first-request",
            "params": {
                "model": "claude-3-5-sonnet-20241022",
                "max_tokens": 1024,
                "messages": [
                    {"role": "user", "content": "Hello, world"}
                ]
            }
        },
        {
            "custom_id": "my-second-request",
            "params": {
                "model": "claude-3-5-sonnet-20241022",
                "max_tokens": 1024,
                "messages": [
                    {"role": "user", "content": "Hi again, friend"}
                ]
            }
        }
    ]
}'

:::note Configuration Required for Batch Cost Tracking For batch passthrough cost tracking to work properly, you need to define the Anthropic model in your proxy_config.yaml:

model_list:
  - model_name: claude-sonnet-4-5-20250929  # or any alias
    litellm_params:
      model: anthropic/claude-sonnet-4-5-20250929
      api_key: os.environ/ANTHROPIC_API_KEY

This ensures the polling mechanism can correctly identify the provider and retrieve batch status for cost calculation. :::

Advanced

Pre-requisites

Use this, to avoid giving developers the raw Anthropic API key, but still letting them use Anthropic endpoints.

Use with Virtual Keys

  1. Setup environment
litellm

# RUNNING on http://0.0.0.0:4000
  1. Generate virtual key
curl -X POST 'http://0.0.0.0:4000/key/generate' \\
-H 'Authorization: Bearer sk-1234' \\
-H 'Content-Type: application/json' \\
-d '{}'

Expected Response

{
    ...
    "key": "sk-1234ewknldferwedojwojw"
}
  1. Test it!
curl --request POST \\
  --url http://0.0.0.0:4000/anthropic/v1/messages \\
  --header 'accept: application/json' \\
  --header 'content-type: application/json' \\
  --header "Authorization: bearer sk-1234ewknldferwedojwojw" \\
  --data '{
    "model": "claude-3-5-sonnet-20241022",
    "max_tokens": 1024,
    "messages": [
        {"role": "user", "content": "Hello, world"}
    ]
  }'

Send litellm_metadata (tags, end-user cost tracking)

curl --request POST \\
  --url http://0.0.0.0:4000/anthropic/v1/messages \\
  --header 'accept: application/json' \\
  --header 'content-type: application/json' \\
  --header "Authorization: bearer sk-anything" \\
  --data '{
    "model": "claude-3-5-sonnet-20241022",
    "max_tokens": 1024,
    "messages": [
        {"role": "user", "content": "Hello, world"}
    ],
    "litellm_metadata": {
        "tags": ["test-tag-1", "test-tag-2"], 
        "user": "test-user" # track end-user/customer cost
    }
  }'
from anthropic import Anthropic

client = Anthropic(
    base_url="http://0.0.0.0:4000/anthropic",
    api_key="sk-anything"
)

response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "Hello, world"}
    ],
    extra_body={
        "litellm_metadata": {
            "tags": ["test-tag-1", "test-tag-2"], 
            "user": "test-user" # track end-user/customer cost
        }
    }, 
    ## OR## 
    metadata={ # anthropic native param - https://docs.anthropic.com/en/api/messages
        "user_id": "test-user" # track end-user/customer cost
    }

)

print(response)