Claude Messages API
Claude Messages API reference for /v1/messages: multi-turn chat, system prompts, tool use, vision and streaming, with parameters and code examples.
- Fully compatible with the Claude Messages API format
- Supports multi-turn conversations and single-shot queries
- Supports multimodal content such as text and images
curl https://anyrouter.win/v1/messages \
-H "x-api-key: $API_KEY" \
-H "anthropic-version: 2025-10-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-5-20250929",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, world"}
]
}'import anthropic
client = anthropic.Anthropic(
api_key="YOUR_API_KEY",
base_url="https://anyrouter.win"
)
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[
{"role": "user", "content": "Hello, world"}
]
)
print(message.content)import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: process.env.API_KEY,
baseURL: "https://anyrouter.win",
});
const message = await client.messages.create({
model: "claude-sonnet-4-5-20250929",
max_tokens: 1024,
messages: [{ role: "user", content: "Hello, world" }],
});
console.log(message.content);package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
)
func main() {
url := "https://anyrouter.win/v1/messages"
payload := map[string]interface{}{
"model": "claude-sonnet-4-5-20250929",
"max_tokens": 1024,
"messages": []map[string]string{
{
"role": "user",
"content": "Hello, world",
},
},
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("x-api-key", os.Getenv("API_KEY"))
req.Header.Set("anthropic-version", "2025-10-01")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
public class Main {
public static void main(String[] args) throws Exception {
String url = "https://anyrouter.win/v1/messages";
String apiKey = System.getenv("API_KEY");
String payload = """
{
"model": "claude-sonnet-4-5-20250929",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Hello, world"
}
]
}
""";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("x-api-key", apiKey)
.header("anthropic-version", "2025-10-01")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}<?php
$url = "https://anyrouter.win/v1/messages";
$apiKey = getenv('API_KEY');
$payload = [
"model" => "claude-sonnet-4-5-20250929",
"max_tokens" => 1024,
"messages" => [
[
"role" => "user",
"content" => "Hello, world"
]
]
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"x-api-key: " . $apiKey,
"anthropic-version: 2025-10-01",
"Content-Type: application/json"
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>require 'net/http'
require 'json'
require 'uri'
url = URI("https://anyrouter.win/v1/messages")
api_key = ENV['API_KEY']
payload = {
model: "claude-sonnet-4-5-20250929",
max_tokens: 1024,
messages: [
{
role: "user",
content: "Hello, world"
}
]
}
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = api_key
request["anthropic-version"] = "2025-10-01"
request["Content-Type"] = "application/json"
request.body = payload.to_json
response = http.request(request)
puts response.bodyimport Foundation
let url = URL(string: "https://anyrouter.win/v1/messages")!
let apiKey = ProcessInfo.processInfo.environment["API_KEY"] ?? ""
let payload: [String: Any] = [
"model": "claude-sonnet-4-5-20250929",
"max_tokens": 1024,
"messages": [
[
"role": "user",
"content": "Hello, world"
]
]
]
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue(apiKey, forHTTPHeaderField: "x-api-key")
request.setValue("2025-10-01", forHTTPHeaderField: "anthropic-version")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONSerialization.data(withJSONObject: payload)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Error: \(error)")
return
}
if let data = data, let responseString = String(data: data, encoding: .utf8) {
print(responseString)
}
}
task.resume()using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var url = "https://anyrouter.win/v1/messages";
var apiKey = Environment.GetEnvironmentVariable("API_KEY");
var payload = @"{
""model"": ""claude-sonnet-4-5-20250929"",
""max_tokens"": 1024,
""messages"": [
{
""role"": ""user"",
""content"": ""Hello, world""
}
]
}";
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", apiKey);
client.DefaultRequestHeaders.Add("anthropic-version", "2025-10-01");
var content = new StringContent(payload, Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
}#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
int main(void) {
CURL *curl;
CURLcode res;
const char *api_key = getenv("API_KEY");
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
const char *url = "https://anyrouter.win/v1/messages";
const char *payload = "{"
"\"model\":\"claude-sonnet-4-5-20250929\","
"\"max_tokens\":1024,"
"\"messages\":[{\"role\":\"user\",\"content\":\"Hello, world\"}]"
"}";
char auth_header[256];
snprintf(auth_header, sizeof(auth_header), "x-api-key: %s", api_key);
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, auth_header);
headers = curl_slist_append(headers, "anthropic-version: 2025-10-01");
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, payload);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSURL *url = [NSURL URLWithString:@"https://anyrouter.win/v1/messages"];
NSString *apiKey = [NSProcessInfo processInfo].environment[@"API_KEY"];
NSDictionary *payload = @{
@"model": @"claude-sonnet-4-5-20250929",
@"max_tokens": @1024,
@"messages": @[
@{
@"role": @"user",
@"content": @"Hello, world"
}
]
};
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payload
options:0
error:&error];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:apiKey forHTTPHeaderField:@"x-api-key"];
[request setValue:@"2025-10-01" forHTTPHeaderField:@"anthropic-version"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:jsonData];
NSURLSessionDataTask *task = [[NSURLSession sharedSession]
dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
return;
}
NSString *result = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"%@", result);
}];
[task resume];
[[NSRunLoop mainRunLoop] run];
}
return 0;
}(* Requires cohttp and yojson libraries *)
open Lwt
open Cohttp
open Cohttp_lwt_unix
let url = "https://anyrouter.win/v1/messages"
let api_key = Sys.getenv "API_KEY"
let payload = {|{
"model": "claude-sonnet-4-5-20250929",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Hello, world"
}
]
}|}
let () =
let headers = Header.init ()
|> fun h -> Header.add h "x-api-key" api_key
|> fun h -> Header.add h "anthropic-version" "2025-10-01"
|> fun h -> Header.add h "Content-Type" "application/json"
in
let body = Cohttp_lwt.Body.of_string payload in
let response = Client.post ~headers ~body (Uri.of_string url) >>= fun (resp, body) ->
body |> Cohttp_lwt.Body.to_string >|= fun body_str ->
print_endline body_str
in
Lwt_main.run responseimport 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
void main() async {
final url = Uri.parse('https://anyrouter.win/v1/messages');
final apiKey = Platform.environment['API_KEY'];
final payload = {
'model': 'claude-sonnet-4-5-20250929',
'max_tokens': 1024,
'messages': [
{
'role': 'user',
'content': 'Hello, world'
}
]
};
final response = await http.post(
url,
headers: {
'x-api-key': apiKey!,
'anthropic-version': '2025-10-01',
'Content-Type': 'application/json',
},
body: jsonEncode(payload),
);
print(response.body);
}library(httr)
library(jsonlite)
url <- "https://anyrouter.win/v1/messages"
api_key <- Sys.getenv("API_KEY")
payload <- list(
model = "claude-sonnet-4-5-20250929",
max_tokens = 1024,
messages = list(
list(
role = "user",
content = "Hello, world"
)
)
)
response <- POST(
url,
add_headers(
`x-api-key` = api_key,
`anthropic-version` = "2025-10-01",
`Content-Type` = "application/json"
),
body = toJSON(payload, auto_unbox = TRUE),
encode = "raw"
)
cat(content(response, "text")){
"code": 200,
"data": {
"id": "msg_013Zva2CMHLNnXjNJJKqJ2EF",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Hello! I'm Claude. Nice to meet you."
}
],
"model": "claude-sonnet-4-5-20250929",
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 12,
"output_tokens": 18
}
}
}{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "Invalid request parameters"
}
}{
"type": "error",
"error": {
"type": "authentication_error",
"message": "Invalid API key"
}
}{
"type": "error",
"error": {
"type": "rate_limit_error",
"message": "Too many requests"
}
}{
"type": "error",
"error": {
"type": "api_error",
"message": "Internal server error"
}
}Authorizations
API key used for authentication
Visit the API key management page to get your API key
Add it to the request headers:
x-api-key: YOUR_API_KEYAPI version
Specifies the version of the Claude API to use
Example: 2025-10-01
Body
Model name
claude-haiku-4-5-20251001- Claude 4.5 fast-response modelclaude-sonnet-4-5-20250929- Claude 4.5 balanced modelclaude-opus-4-1-20250805- The most powerful Claude 4.1 flagship modelclaude-opus-4-1-20250805-thinking- Claude 4.1 Opus extended thinking editionclaude-sonnet-4-5-20250929-thinking- Claude 4.5 Sonnet extended thinking edition
Message list
An array of messages; the model generates the next reply based on them. Each message contains a role and a content field.
Field details
Role type
Allowed values: user (user message), assistant (AI reply, used for multi-turn conversations and prefilling)
Note: the Claude API takes the system prompt via a separate system parameter, not inside messages
Message content
The text content of the message
Single user message example:
[{ "role": "user", "content": "Hello, Claude" }]Multi-turn conversation example:
[
{ "role": "user", "content": "Hello" },
{ "role": "assistant", "content": "Hello! I'm Claude." },
{ "role": "user", "content": "Can you explain AI?" }
]Prefilling the assistant reply:
[
{ "role": "user", "content": "What is the Greek name for the Sun? (A) Sol (B) Helios (C) Sun" },
{ "role": "assistant", "content": "The answer is (" }
]Maximum number of tokens to generate
The maximum number of tokens to generate before stopping. The model may stop before reaching this limit.
Different models have different maximums; see the model documentation. Minimum: 1
System prompt
The system prompt sets Claude's role, personality, goals, and instructions.
String format:
{
"system": "You are a professional Python programming tutor"
}Structured format:
{
"system": [
{
"type": "text",
"text": "You are a professional Python programming tutor"
}
]
}Temperature, range 0-1
Controls output randomness:
- Lower values (e.g. 0.2): more deterministic and conservative
- Higher values (e.g. 0.8): more random and creative
Default: 1.0
Nucleus sampling parameter, range 0-1
Uses nucleus sampling. Use either temperature or top_p, not both at the same time.
Default: 1.0
Top-K sampling
Samples only from the K highest-probability options, used to remove "long tail" low-probability responses.
Recommended for advanced use cases only.
Whether to enable streaming output
When set to true, the response is streamed back using server-sent events (SSE).
Default: false
Stop sequences
Custom text sequences that cause the model to stop generating when encountered.
Up to 4 sequences.
Example: ["\n\nHuman:", "\n\nAssistant:"]
Metadata
A metadata object for the request.
Contains:
user_id: user identifier
Tool definitions
A list of tools the model may call to complete tasks.
Function tool example:
{
"tools": [
{
"name": "get_weather",
"description": "Get the current weather for a given location",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "City and province, e.g. Beijing"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "Temperature unit"
}
},
"required": ["location"]
}
}
]
}Supported tool types:
- Custom function tools
- Computer use tool (computer_20241022)
- Text editor tool (text_editor_20241022)
- Bash tool (bash_20241022)
Tool choice strategy
Controls how the model uses tools:
{"type": "auto"}: decide automatically (default){"type": "any"}: must use a tool{"type": "tool", "name": "tool_name"}: use the specified tool
Response
idstringUnique message identifier
Example: "msg_013Zva2CMHLNnXjNJJKqJ2EF"
typestringObject type
Always "message"
rolestringRole
Always "assistant"
contentarrayArray of content blocks
The content generated by the model, as an array of content blocks.
Text content:
[{ "type": "text", "text": "Hello! I'm Claude." }]Tool use:
[
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": { "location": "Beijing", "unit": "celsius" }
}
]Content types:
text: text contenttool_use: tool invocation
modelstringThe model that handled the request
Example: "claude-sonnet-4-5-20250929"
stop_reasonstringStop reason
Possible values:
end_turn: natural end of turnmax_tokens: reached the maximum token limitstop_sequence: hit a stop sequencetool_use: invoked a tool
stop_sequencestring | nullThe stop sequence that was triggered
If generation stopped because of a stop sequence, this contains that sequence; otherwise null
usageobjectToken usage statistics
Properties
input_tokensintegerNumber of input tokens
output_tokensintegerNumber of output tokens
Usage Examples
Basic Conversation
import anthropic
client = anthropic.Anthropic(
api_key="YOUR_API_KEY",
base_url="https://anyrouter.win"
)
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[
{"role": "user", "content": "Explain the basic principles of quantum computing"}
]
)
print(message.content[0].text)Multi-turn Conversation
messages = [
{"role": "user", "content": "What is machine learning?"},
{"role": "assistant", "content": "Machine learning is a branch of artificial intelligence..."},
{"role": "user", "content": "Can you give a real-world example?"}
]
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=messages
)Using a System Prompt
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
system="You are a senior Python development expert, skilled at code review and optimization advice.",
messages=[
{"role": "user", "content": "How can I optimize this code?\n\n[code]"}
]
)Streaming Responses
with client.messages.stream(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[
{"role": "user", "content": "Write a short essay about AI"}
]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)Tool Use
tools = [
{
"name": "get_stock_price",
"description": "Get the real-time price of a stock",
"input_schema": {
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "Stock ticker symbol, e.g. AAPL"
}
},
"required": ["ticker"]
}
}
]
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
tools=tools,
messages=[
{"role": "user", "content": "What is Tesla's stock price?"}
]
)
# Handle the tool call
if message.stop_reason == "tool_use":
tool_use = next(block for block in message.content if block.type == "tool_use")
print(f"Tool called: {tool_use.name}")
print(f"Input: {tool_use.input}")Vision
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/image.jpg"
}
},
{
"type": "text",
"text": "Describe this image"
}
]
}
]
)Base64 Images
import base64
with open("image.jpg", "rb") as image_file:
image_data = base64.b64encode(image_file.read()).decode("utf-8")
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": image_data
}
},
{
"type": "text",
"text": "Analyze this image"
}
]
}
]
)Best Practices
1. Prompt Engineering
Clear role definition:
system = """You are an experienced chief data scientist. Your expertise includes:
- In-depth statistical analysis and interactive data visualization
- Full-lifecycle machine learning model development, with deep mastery of Python and R
- All output must strictly follow scientific accuracy and professional engineering standards
Please provide professional, accurate advice."""Structured output:
message = "Return the analysis results in JSON format, including summary, key_findings, and recommendations fields."2. Error Handling
from anthropic import APIError, RateLimitError
try:
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}]
)
except RateLimitError:
print("Rate limited, please retry later")
except APIError as e:
print(f"API error: {e}")3. Token Optimization
# Use shorter prompts
messages = [
{"role": "user", "content": "Summarize the key points:\n\n[long text]"}
]
# Limit output length
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=500, # limit the output
messages=messages
)4. Prefilled Responses
# Guide the model to reply in a specific format
messages = [
{"role": "user", "content": "List 5 Python best practices"},
{"role": "assistant", "content": "Here are 5 Python best practices:\n\n1."}
]
message = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=messages
)Handling Streaming Responses
Python Streaming Example
import anthropic
client = anthropic.Anthropic(
api_key="YOUR_API_KEY",
base_url="https://anyrouter.win"
)
with client.messages.stream(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
messages=[
{"role": "user", "content": "Write a Python decorator example"}
]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)JavaScript Streaming Example
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: process.env.API_KEY,
baseURL: "https://anyrouter.win",
});
const stream = await client.messages.stream({
model: "claude-sonnet-4-5-20250929",
max_tokens: 1024,
messages: [{ role: "user", content: "Write a React component example" }],
});
for await (const chunk of stream) {
if (
chunk.type === "content_block_delta" &&
chunk.delta.type === "text_delta"
) {
process.stdout.write(chunk.delta.text);
}
}Notes
-
API key security:
- Store API keys in environment variables
- Do not hardcode keys in your code
- Rotate keys regularly
-
Rate limits:
- Be aware of API rate limits
- Implement retry logic
- Use an exponential backoff strategy
-
Token management:
- Monitor token usage
- Optimize prompt length
- Use an appropriate max_tokens value
-
Model selection:
- Opus: complex tasks that need deep reasoning
- Sonnet: balanced performance and cost
- Haiku: fast responses for simple tasks
-
Content filtering:
- Validate user input
- Filter sensitive information
- Implement content moderation
Chat Completions API
OpenAI-compatible chat completions API: call GPT, Claude, Gemini and more via /v1/chat/completions, with request samples, parameters and response fields.
HTTP Status Code Reference
HTTP status code reference for the AnyRouter API: 503, 429, 403, 401 and 400 errors with messages and causes, to debug rate limits, quota and auth issues.