Skip to content

Anthropic Chat Format (Messages)

Official Documentation

Anthropic Messages

📝 Introduction

All Claude models on the gateway can be called natively via the Anthropic Messages API format. This is the recommended format when using the official Anthropic SDKs or tools like Claude Code.

📮 Endpoint

POST /v1/messages

Authentication

Anthropic-style headers are used:

x-api-key: $WS_API_KEY
anthropic-version: 2023-06-01

The Authorization: Bearer $WS_API_KEY header is also accepted.

💡 Request Examples

Basic Chat ✅

curl http://baseurl/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: $WS_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "claude-sonnet-4-6",
    "max_tokens": 1024,
    "messages": [
      {"role": "user", "content": "Hello, Claude!"}
    ]
  }'

Response Example:

{
  "id": "msg_01XFDUDYJgAACzvnptvVoYEL",
  "type": "message",
  "role": "assistant",
  "model": "claude-sonnet-4-6",
  "content": [
    {"type": "text", "text": "Hello! How can I help you today?"}
  ],
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 10,
    "output_tokens": 12
  }
}

System Prompt ✅

curl http://baseurl/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: $WS_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "claude-haiku-4-5-20251001",
    "max_tokens": 1024,
    "system": "You are a professional translator. Translate everything to Arabic.",
    "messages": [
      {"role": "user", "content": "Good morning!"}
    ]
  }'

Streaming Response ✅

curl http://baseurl/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: $WS_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "claude-sonnet-4-6",
    "max_tokens": 1024,
    "stream": true,
    "messages": [
      {"role": "user", "content": "Hello!"}
    ]
  }'

Streaming events:

event: message_start
data: {"type":"message_start","message":{"id":"msg_...","type":"message","role":"assistant","content":[],"model":"claude-sonnet-4-6","usage":{"input_tokens":10}}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Hello"}}

event: message_stop
data: {"type":"message_stop"}

Image Input ✅

curl http://baseurl/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: $WS_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "claude-sonnet-4-6",
    "max_tokens": 1024,
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "image",
            "source": {"type": "url", "url": "https://example.com/photo.jpg"}
          },
          {"type": "text", "text": "Describe this image."}
        ]
      }
    ]
  }'

Base64 is also supported: "source": {"type": "base64", "media_type": "image/jpeg", "data": "..."}.

Tool Use ✅

curl http://baseurl/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: $WS_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "claude-opus-4-8",
    "max_tokens": 1024,
    "tools": [
      {
        "name": "get_weather",
        "description": "Get the current weather for a given location",
        "input_schema": {
          "type": "object",
          "properties": {
            "location": {"type": "string", "description": "City name"}
          },
          "required": ["location"]
        }
      }
    ],
    "messages": [
      {"role": "user", "content": "What is the weather in Riyadh?"}
    ]
  }'

Response Example:

{
  "id": "msg_01Aq9w938a90dw8q",
  "type": "message",
  "role": "assistant",
  "model": "claude-opus-4-8",
  "content": [
    {
      "type": "tool_use",
      "id": "toolu_01A09q90qw90lq917835lq9",
      "name": "get_weather",
      "input": {"location": "Riyadh"}
    }
  ],
  "stop_reason": "tool_use"
}

Using the Official SDK

import anthropic

client = anthropic.Anthropic(
    api_key="sk-...",                     # your WS API key
    base_url="http://baseurl",
)

message = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello, Claude!"}],
)
print(message.content[0].text)

📋 Request Body Parameters

Parameter Type Required Description
model string Yes Claude model ID, see Model Catalog
max_tokens integer Yes Maximum number of tokens to generate
messages array Yes Alternating user / assistant messages. Content is a string or an array of content blocks (text, image, tool_use, tool_result)
system string / array No System prompt
stream boolean No Stream the response via server-sent events
temperature number No 01. Default 1
top_p number No Nucleus sampling
top_k integer No Only sample from the top K options
stop_sequences array No Custom stop sequences
tools array No Tool definitions (name, description, input_schema)
tool_choice object No {"type":"auto"} / {"type":"any"} / {"type":"tool","name":"..."}
thinking object No Extended thinking, e.g. {"type":"enabled","budget_tokens":10000}
metadata object No e.g. {"user_id": "..."}

📥 Response Fields

Field Type Description
id string Unique message identifier
type string Always message
role string Always assistant
model string Model used
content array Content blocks: text, tool_use, thinking
stop_reason string end_turn, max_tokens, stop_sequence, tool_use
usage object input_tokens, output_tokens, cache read/write token counts