Anthropic Messages API
Эндпоинт /v1/messages реализует формат Anthropic Messages API. Позволяет отправлять запросы к Claude и другим моделям, поддерживающим этот формат, используя те же структуры данных, что и в оригинальном Anthropic API.
| Адрес эндпоинта | https://api.ru-openrouter.ru/v1/messages |
| Базовый URL для SDK/клиента | https://api.ru-openrouter.ru (без /v1) |
/v1/messages к базовому URL сами. Указывайте базой только домен — https://api.ru-openrouter.ru. Если в базовом URL уже есть /v1, клиент соберёт /v1/v1/messages и получит ответ 404 endpoint_not_found.
Аутентификация
Заголовок с API-ключом принимается в двух формах — достаточно одной из них:
| Заголовок | Кто так присылает |
|---|---|
Authorization: Bearer sk_ваш_api_ключ |
OpenAI-совместимые клиенты |
x-api-key: sk_ваш_api_ключ |
Anthropic-клиенты (SDK, харнессы) |
Authorization: Bearer sk_ваш_api_ключ
x-api-key: sk_ваш_api_ключ
Все запросы требуют API-ключ. Получить ключ можно в личном кабинете.
Создание сообщения
POST /v1/messages
Создаёт сообщение в формате Anthropic Messages API. Поддерживает текст, изображения, PDF, инструменты (tools) и extended thinking.
Тело запроса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
model |
string | ID модели (например, anthropic/claude-sonnet-4) |
|
messages |
array | Массив сообщений в Anthropic-формате | |
max_tokens |
integer | Максимальное количество токенов в ответе | |
stream |
boolean | По умолчанию false. Включить streaming (SSE) |
|
system |
string или array | Системный промпт (строка или массив content-блоков с text) |
|
temperature |
float | 0.0–1.0, по умолчанию 1.0 | |
top_p |
float | 0.0–1.0, по умолчанию 1.0 | |
top_k |
integer | Top-K sampling | |
stop_sequences |
array | Массив стоп-последовательностей | |
tools |
array | Описание инструментов (function calling) | |
tool_choice |
object | Выбор инструмента: auto, any, tool |
|
thinking |
object | Extended thinking (бюджет токенов для размышлений) | |
metadata |
object | Метаданные, включая user_id для идентификации пользователя |
|
user |
string | Идентификатор пользователя (до 256 символов) | |
session_id |
string | Уникальный идентификатор для группировки запросов. Используется для sticky routing — все запросы с одинаковым session_id направляются одному провайдеру для максимизации попадания в промпт-кэш. Максимум 256 символов |
|
cache_control |
object | Автоматическое управление промпт-кэшированием | |
provider |
object | Настройки маршрутизации провайдера | |
fallbacks |
array | Модели для fallback (максимум 3) | |
models |
array | Альтернативные модели | |
plugins |
array | Плагины маршрутизации | |
context_management |
object | Управление контекстом | |
output_config |
object | Конфигурация выходных данных | |
speed |
string | Скорость генерации: standard (по умолчанию) или fast |
|
service_tier |
string | Уровень обслуживания |
Параметр messages
Каждое сообщение должно содержать role и content:
- role:
userилиassistant - content: строка или массив content-блоков
Типы content-блоков:
| Тип блока | Описание |
|---|---|
text |
Текстовое содержимое |
image |
Изображение (base64 или URL) |
document |
PDF-документ (base64 или URL) |
tool_use |
Вызов инструмента (от assistant) |
tool_result |
Результат выполнения инструмента (от user) |
thinking |
Блок размышлений (extended thinking) |
Параметр thinking
{
"type": "enabled",
"budget_tokens": 16000
}
budget_tokens— бюджет токенов для этапа размышленийdisplay— отображение мыслей:summarized,omitted(опционально)
Параметр provider
Настройки маршрутизации запроса к конкретным провайдерам.
| Поле | Тип | Описание |
|---|---|---|
sort |
string | Стратегия сортировки: price, throughput, latency, exacto |
order |
array | Упорядоченный список провайдеров (по приоритету) |
ignore |
array | Список провайдеров для исключения |
only |
array | Список разрешённых провайдеров |
allow_fallbacks |
boolean | Разрешить fallback-провайдеров (по умолчанию true) |
data_collection |
string | allow (по умолчанию) или deny |
zdr |
boolean | Только Zero Data Retention провайдеры |
require_parameters |
boolean | Только провайдеры, поддерживающие все переданные параметры |
max_price |
object | Максимальная цена за миллион токенов |
preferred_max_latency |
number | Предпочтительная максимальная задержка (сек) |
preferred_min_throughput |
number | Предпочтительная минимальная пропускная способность (токен/сек) |
quantizations |
array | Фильтр по квантованию: int4, fp8, fp16, bf16 и др. |
Суффиксы модели
К имени модели можно добавить суффикс для быстрой настройки маршрутизации:
| Суффикс | Описание |
|---|---|
:nitro |
Приоритет скорости (throughput) |
:floor |
Приоритет цены (price) |
Пример: anthropic/claude-sonnet-4:nitro
:online к Anthropic Messages API не применяется. Веб-поиск здесь подключается серверным инструментом в формате Anthropic (результаты приходят блоками web_search_tool_result).
Параметр cache_control
Автоматическое промпт-кэширование. Устанавливается на уровне запроса:
{
"cache_control": {
"type": "ephemeral"
}
}
Также поддерживается на уровне отдельных content-блоков:
{
"type": "text",
"text": "Большой блок текста...",
"cache_control": {
"type": "ephemeral"
}
}
TTL для кэша: 5m (5 минут) или 1h (1 час).
Параметр context_management
Управление контекстом (сжатие при превышении лимита токенов):
{
"edits": [
{
"type": "clear_tool_uses_20250919",
"trigger": { "type": "input_tokens", "value": 100000 },
"keep": { "type": "tool_uses", "value": 5 },
"clear_at_least": { "type": "input_tokens", "value": 50000 },
"clear_tool_inputs": false,
"exclude_tools": ["web_search"]
}
]
}
Параметр output_config
Управление выходными данными:
{
"effort": "medium",
"format": { /* schema structured output */ },
"task_budget": { "type": "tokens", "total": 400000 }
}
effort:low,medium,high,xhigh,maxformat: схема структурированного выводаtask_budget: бюджет для агентного шага (рекомендательный, не жёсткое ограничение)
Параметр fallbacks
Модели для fallback, если основная модель недоступна или отказывает:
{
"fallbacks": [
{ "model": "claude-opus-4.8" }
]
}
Максимум 3 модели. Не сочетается с models.
Заголовки атрибуции
Опциональные заголовки для идентификации вашего приложения в статистике OpenRouter:
| Заголовок | Описание |
|---|---|
HTTP-Referer |
URL вашего сайта/приложения |
X-Title |
Название вашего приложения |
X-OpenRouter-Title |
Альтернативное название |
X-OpenRouter-Metadata |
Включить метаданные маршрутизации в ответ (enabled) |
X-OpenRouter-Experimental-Metadata |
Legacy-версия X-OpenRouter-Metadata |
Параметр stop_server_tools_when
Условия остановки цикла server-tool агента (логика ИЛИ):
{
"stop_server_tools_when": [
{ "type": "step_count_is", "step_count": 5 },
{ "type": "max_cost", "max_cost_in_dollars": 0.5 }
]
}
Пример запроса
Простой запрос:
curl https://api.ru-openrouter.ru/v1/messages \
-H "Authorization: Bearer sk_ваш_api_ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Привет! Как дела?"
}
]
}'
С изображением:
curl https://api.ru-openrouter.ru/v1/messages \
-H "Authorization: Bearer sk_ваш_api_ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Что изображено на этом фото?"
},
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRg..."
}
}
]
}
]
}'
С инструментами (tools):
curl https://api.ru-openrouter.ru/v1/messages \
-H "Authorization: Bearer sk_ваш_api_ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Какая погода в Москве?"
}
],
"tools": [
{
"name": "get_weather",
"description": "Получить погоду в городе",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "Город"
}
},
"required": ["location"]
}
}
]
}'
С extended thinking:
curl https://api.ru-openrouter.ru/v1/messages \
-H "Authorization: Bearer sk_ваш_api_ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"max_tokens": 32000,
"thinking": {
"type": "enabled",
"budget_tokens": 16000
},
"messages": [
{
"role": "user",
"content": "Реши сложную задачу..."
}
]
}'
С потоковым режимом (streaming):
curl https://api.ru-openrouter.ru/v1/messages \
-H "Authorization: Bearer sk_ваш_api_ключ" \
-H "Content-Type: application/json" \
-N \
-d '{
"model": "anthropic/claude-sonnet-4",
"stream": true,
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Напиши короткое стихотворение"
}
]
}'
Ответ
200 OK
{
"id": "msg_abc123",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Всё отлично! Чем могу помочь?",
"citations": null
}
],
"model": "anthropic/claude-sonnet-4",
"stop_reason": "end_turn",
"stop_sequence": null,
"stop_details": null,
"usage": {
"input_tokens": 12,
"output_tokens": 18,
"cache_creation_input_tokens": null,
"cache_read_input_tokens": null,
"total_cost": 0.1234,
"service_tier": "standard",
"inference_geo": null
}
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id |
string | Уникальный идентификатор сообщения |
type |
string | Всегда message |
role |
string | Всегда assistant |
content |
array | Массив content-блоков с ответом модели |
model |
string | ID модели, которая сгенерировала ответ |
stop_reason |
string | Причина остановки: end_turn, max_tokens, stop_sequence, tool_use, refusal и др. |
stop_sequence |
string | Стоп-последовательность, если остановка по ней |
stop_details |
object | Детали остановки (при отказе — refusal с категорией и объяснением) |
usage |
object | Информация об использовании токенов |
Поля usage
| Поле | Тип | Описание |
|---|---|---|
input_tokens |
integer | Количество входных токенов |
output_tokens |
integer | Количество выходных токенов |
total_cost |
float | Стоимость запроса в рублях (с учётом наценки) |
cache_creation_input_tokens |
integer | Токены, записанные в кэш |
cache_read_input_tokens |
integer | Токены, прочитанные из кэша |
service_tier |
string | Уровень обслуживания: standard |
inference_geo |
string | Гео-регион инференса |
Типы content-блоков в ответе
| Тип блока | Описание |
|---|---|
text |
Текстовый ответ (содержит text и опционально citations) |
tool_use |
Вызов инструмента (содержит name, id, input) |
thinking |
Блок размышлений (extended thinking, содержит thinking) |
Content-блок text с цитированием
{
"type": "text",
"text": "Согласно документации, процессор работает на частоте 3.2 ГГц.",
"citations": [
{
"type": "char_location",
"cited_text": "процессор работает на частоте 3.2 ГГц",
"document_index": 0,
"document_title": null,
"file_id": null,
"start_char_index": 0,
"end_char_index": 10
}
]
}
Ошибки
402 Insufficient Balance:
{
"error": {
"message": "Недостаточно средств на балансе. Требуется: 5.00 ₽, Доступно: 1.00 ₽",
"code": "insufficient_balance"
}
}
400 Invalid Request:
{
"error": {
"message": "Missing required parameter: max_tokens",
"code": "missing_max_tokens"
}
}
429 Rate Limit:
{
"error": {
"message": "Too many requests. Please try again in 30 seconds.",
"code": "rate_limit_exceeded",
"retry_after": 30
}
}
Коды ошибок
| HTTP-статус | Код ошибки | Описание |
|---|---|---|
| 400 | missing_model |
Не указана модель |
| 400 | missing_messages |
Не указаны сообщения |
| 400 | missing_max_tokens |
Не указан max_tokens |
| 400 | model_not_found |
Модель не найдена или неактивна |
| 400 | invalid_message_role |
Недопустимая роль сообщения (допустимы: user, assistant) |
| 400 | invalid_message_format |
Некорректный формат сообщения |
| 400 | missing_message_content |
Отсутствует content в сообщении |
| 400 | invalid_session_id |
session_id превышает 256 символов |
| 400 | input_tokens_exceeded |
Входные токены превышают контекст модели |
| 402 | insufficient_balance |
Недостаточно средств |
| 415 | unsupported_media_type |
Неподдерживаемый Content-Type (только JSON) |
| 429 | rate_limit_exceeded |
Превышен лимит запросов |
| 502 | empty_response |
Пустой ответ от провайдера |