> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.beatapi.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.beatapi.io/_mcp/server.

# Claude Messages

POST https://direct.beatapi.io/v1/messages
Content-Type: application/json

Вызывайте Claude Fable 5.1, Opus 5.5, Sonnet 5.5 и Haiku 5.5 через единый метод Anthropic Messages с ключом BeatAPI.- Все актуальные модели Claude доступны через `POST /v1/messages`. Для переключения меняйте `model`.
- Текст и изображения на входе, текст на выходе, потоковая передача, вызовы инструментов, расширенные рассуждения и кэширование промптов.
- Совместимо с Anthropic SDK: задайте базовый URL `https://direct.beatapi.io` (без `/v1`) и используйте ключ BeatAPI.
- Модели Claude доступны только через Anthropic Messages. Вызов `/v1/responses` возвращает `400`.Для текстовых запросов используйте базовый URL `https://direct.beatapi.io`. Этот адрес не ограничен 100-секундным тайм-аутом Cloudflare, который может прервать долгий запрос без потоковой передачи. Если ваша сеть не может подключиться к нему, используйте `https://api.beatapi.io`. Ключи, модели и цены одинаковы. API изображений и видео используют только `https://api.beatapi.io`.POST/v1/messagesПопробоватьОткрывает эндпоинт в API Explorer. Если ввести ключ BeatAPI и отправить запрос, будет выполнен реальный вызов с оплатой из вашего баланса.## МоделиПередайте один из этих ID в `model`. Каждый ID обозначает отдельную модель; не считайте их псевдонимами друг друга.| ID модели           | Контекст (токены) | Максимальный вывод (токены) | Назначение                                                                                                          | Ввод, USD за миллион токенов | Вывод, USD за миллион токенов | Примечания                                                                                                 |
| ------------------- | ----------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------- |
| `claude-opus-5-5`   | 1 000 000         | 128 000                     | Claude Opus для длительного программирования с агентом и работы со знаниями, дешевле Opus 5                         | \$2.00                       | \$10.00                       | Для длительных задач программирования с агентом и работы со знаниями.                                      |
| `claude-sonnet-5-5` | 1 000 000         | 128 000                     | Claude Sonnet 5.5 для программирования, рассуждений и профессиональных задач с контекстом на 1M токенов             | \$1.00                       | \$5.00                        | Для повседневного программирования, рассуждений и профессиональных задач.                                  |
| `claude-haiku-5-5`  | 1 000 000         | 128 000                     | Самая быстрая модель Claude для массовых задач с низкой задержкой: классификации, извлечения данных и маршрутизации | \$0.05                       | \$0.25                        | Самая быстрая модель Claude для массовых задач, например классификации, извлечения данных и маршрутизации. |
| `claude-fable-5-1`  | 1 000 000         | 128 000                     | Модель Claude для сложных рассуждений и длительных задач агентов                                                    | \$5.00                       | \$25.00                       | Для длинных текстов и задач, где особенно важны авторский стиль и структура.                               |- Указаны базовые цены со скидкой. Не включены тарифы для длинного контекста, кэшированного ввода и записи в кэш. См. [страницу цен](https://beatapi.io/pricing).
- `—` означает, что каталог не публикует это значение.Старые ID этого семейства остаются доступны. См. [старые модели](/text-api/legacy-models).## Быстрый стартУстановите пакет `anthropic` на сервере и сохраните ключ в `BEATAPI_API_KEY`. Не помещайте ключ в код браузерного приложения. Ниже показаны примеры запросов, а не записанные ответы модели.Прочитайте ответ в блоках `text` массива `content`, затем проверьте `stop_reason` и `usage`. Сам по себе HTTP 200 не означает, что ответ решает вашу задачу: проверяйте результат в приложении. Текстовые запросы возвращают ответ напрямую; опрашивать `/v1/tasks` для них не нужно.```bash title="cURL"
curl --request POST \
  --url https://direct.beatapi.io/v1/messages \
  --header "x-api-key: $BEATAPI_API_KEY" \
  --header 'anthropic-version: 2023-06-01' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "claude-sonnet-5-5",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": "Design a resilient webhook retry strategy for a payments API."
    }
  ]
}'
``````python title="Python"
import os
from anthropic import Anthropic

client = Anthropic(api_key=os.environ["BEATAPI_API_KEY"], base_url="https://direct.beatapi.io")
message = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=1024,
    messages=[
      {
        "role": "user",
        "content": "Design a resilient webhook retry strategy for a payments API."
      }
    ],
)
print(message.content[0].text)
``````javascript title="JavaScript"
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic({ apiKey: process.env.BEATAPI_API_KEY, baseURL: "https://direct.beatapi.io" });
const message = await client.messages.create({
  "model": "claude-sonnet-5-5",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": "Design a resilient webhook retry strategy for a payments API."
    }
  ]
});
console.log(message.content[0].text);
```## Эндпоинт и аутентификация`POST https://direct.beatapi.io/v1/messages`x-api-key
string
ОбязательноИспользуйте ключ BeatAPI. Также поддерживается `Authorization: Bearer <BEATAPI_API_KEY>`.Передавайте заголовок `anthropic-version`, например `anthropic-version: 2023-06-01`. Ключ можно передать в `x-api-key` или `Authorization: Bearer <key>`: работают оба варианта, поэтому в существующем клиенте Anthropic достаточно изменить базовый URL.Модели Claude доступны только через Anthropic Messages. Их вызов через `/v1/responses` возвращает `400`.## Параметры запросаПоддерживаются стандартные поля Anthropic Messages. Совместимость формата запроса не означает поддержку всех бета-функций и серверных инструментов. Проверьте возможности, от которых зависит ваше приложение.model
string
ОбязательноТочный ID модели.**Допустимые значения**: `claude-fable-5-1`, `claude-opus-5-5`, `claude-sonnet-5-5`, `claude-haiku-5-5`- Прежние рабочие ID (`claude-opus-5`, `claude-sonnet-5`, `claude-haiku-4-5-20251001`) перечислены в разделе [Старые модели](/text-api/legacy-models).
- Вызовите `GET /v1/models` со своим ключом, чтобы проверить, какие модели ему доступны.max_tokens
integer
ОбязательноМаксимальное число генерируемых токенов, включая рассуждения.- Всегда передавайте это поле. Если его нет или оно равно `0`, применяется лимит по умолчанию, который может оказаться ниже ожидаемого.
- Максимально допустимое значение — 1 073 741 823; превышение возвращает `400 bad_request`. При этом не превышайте максимальный объём вывода модели из таблицы выше.
- `max_tokens` также используется для оценки необходимого баланса. Слишком большое значение может привести к `402 insufficient_credits`, даже если фактический ответ был бы коротким. Указывайте столько токенов, сколько требуется задаче.messages
object[]
ОбязательноИстория диалога, от самого раннего сообщения к последнему. У каждого сообщения есть `role` (`user` или `assistant`) и `content`. В `content` передаётся строка либо массив блоков содержимого.- Основные типы блоков: `text`, `image` (источник base64 или URL), `tool_use` (в сообщении assistant) и `tool_result` (в сообщении user).
- Пустой или отсутствующий массив `messages` приводит к `400 bad_request`.**Пример**```json
[
  {
    "role": "user",
    "content": [
      { "type": "text", "text": "What is in this image?" },
      { "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": "<base64>" } }
    ]
  }
]
```system
string | object[]
НеобязательноСистемный промпт: строка либо массив блоков `text`. Добавьте `cache_control` к блоку, чтобы кэшировать длинный неизменяемый префикс.**Пример**```json
[
  {
    "type": "text",
    "text": "<long, stable instructions>",
    "cache_control": { "type": "ephemeral" }
  }
]
```stream
boolean
НеобязательноПо умолчанию: falseПередавать ответ потоком событий SSE. См. раздел о потоковой передаче ниже.**По умолчанию**: `false`stop_sequences
string[]
НеобязательноСтроки, при обнаружении которых генерация прекращается. В ответе будет `stop_reason: "stop_sequence"`.tools
object[]
НеобязательноИнструменты, которые может вызвать модель. У каждого есть `name`, `description` и `input_schema` (JSON Schema). При вызове инструмента модель возвращает `stop_reason: "tool_use"`; выполните инструмент и передайте результат в следующем блоке `tool_result`.**Пример**```json
[
  {
    "name": "get_weather",
    "description": "Get the current weather for a city.",
    "input_schema": {
      "type": "object",
      "properties": { "city": { "type": "string" } },
      "required": ["city"]
    }
  }
]
```tool_choice
object
НеобязательноНужно ли модели использовать `tools` и каким образом.**Допустимые значения**: `{"type":"auto"}`, `{"type":"any"}`, `{"type":"tool","name":"..."}`, `{"type":"none"}`- `auto` оставляет выбор модели, `any` требует вызвать любой инструмент, `tool` — инструмент по имени, `none` запрещает инструменты.**Пример**```json
{ "type": "auto" }
{ "type": "tool", "name": "get_weather" }
```thinking
object
НеобязательноРасширенные рассуждения. Поле `type` включает или отключает их. Токены рассуждений входят в лимит `max_tokens` и оплачиваются как выходные.**Допустимые значения**: `adaptive`, `enabled`, `disabled`- `thinking.type` принимает одно из значений выше. При `enabled` задайте `thinking.budget_tokens`: целое число не меньше 1 024 и меньше `max_tokens`.
- `thinking.display` принимает `summarized` или `omitted`. Новые модели могут не возвращать текст рассуждений, если не запросить `summarized`.
- Глубина адаптивных рассуждений задаётся через `output_config.effort`.**Зависит от модели**- `claude-fable-5-1`: Используйте `{"type":"adaptive"}` и задавайте глубину через `output_config.effort`; `budget_tokens` отклоняется.
- `claude-opus-5-5`: Используйте `{"type":"adaptive"}` и задавайте глубину через `output_config.effort`; `budget_tokens` отклоняется.
- `claude-sonnet-5-5`: Используйте `{"type":"adaptive"}` и задавайте глубину через `output_config.effort`; `budget_tokens` отклоняется.**Пример**```json
{
  "thinking": { "type": "adaptive" },
  "output_config": { "effort": "high" }
}
```output_config.effort
string
НеобязательноИнтенсивность рассуждений модели. Начните с `high`, затем на своих задачах сравните уровень выше и ниже.**Допустимые значения**: `low`, `medium`, `high`, `xhigh`, `max`cache_control
object
НеобязательноКэширование промпта. Добавьте к блоку `system`, `messages` или `tools`, чтобы кэшировать всё до этого блока включительно, либо на верхний уровень запроса. Значение `ttl`: `5m` (по умолчанию) или `1h`.**Допустимые значения**: `{"type":"ephemeral"}`- Чтение кэша, запись на 5 минут и запись на 1 час оплачиваются отдельно. Кэшированный префикс оплачивается как чтение кэша, а не как новый вход.
- Количество токенов при чтении и создании кэша указано в `usage.cache_read_input_tokens` и `usage.cache_creation_input_tokens`.**Пример**```json
{ "type": "ephemeral" }
{ "type": "ephemeral", "ttl": "1h" }
```## Цикл вызова инструментовКогда `stop_reason` равен `tool_use`, добавьте сообщение assistant в историю без изменений, выполните инструмент и передайте результат в блоке `tool_result` следующего сообщения `user`. Повторно передайте тот же список `tools`.```json
{
  "max_tokens": 1024,
  "messages": [
    { "role": "user", "content": "What is the weather in Paris?" },
    {
      "role": "assistant",
      "content": [
        { "type": "tool_use", "id": "toolu_example", "name": "get_weather", "input": { "city": "Paris" } }
      ]
    },
    {
      "role": "user",
      "content": [
        { "type": "tool_result", "tool_use_id": "toolu_example", "content": "18 C, light rain" }
      ]
    }
  ]
}
```## ОтветБез потоковой передачи запрос возвращает один JSON-объект. Ниже приведён сокращённый пример.```json
{
  "id": "msg_example",
  "type": "message",
  "role": "assistant",
  "model": "claude-sonnet-5-5",
  "content": [
    {
      "type": "text",
      "text": "Retry with exponential backoff and jitter, and make every handler idempotent."
    }
  ],
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 19,
    "output_tokens": 16
  }
}
```### Поля ответа| Поле                                | Тип       | Описание                                                                                                                                                                          |
| ----------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                                | `string`  | ID сообщения. Сохраняйте его вместе с ID запроса для обращений в поддержку и сверки расходов.                                                                                     |
| `model`                             | `string`  | Модель, сформировавшая ответ.                                                                                                                                                     |
| `content[].type`                    | `string`  | `text`, `tool_use` либо `thinking`, если возвращается текст рассуждений.                                                                                                          |
| `content[].text`                    | `string`  | Текст ответа из блока `text`.                                                                                                                                                     |
| `stop_reason`                       | `string`  | `end_turn` — ответ завершён; `max_tokens` — достигнут лимит `max_tokens`; `stop_sequence` — сработала останавливающая последовательность; `tool_use` — модель вызвала инструмент. |
| `usage.input_tokens`                | `integer` | Входные токены, полученные не из кэша.                                                                                                                                            |
| `usage.output_tokens`               | `integer` | Выходные токены, включая рассуждения.                                                                                                                                             |
| `usage.cache_read_input_tokens`     | `integer` | Входные токены, прочитанные из кэша промптов.                                                                                                                                     |
| `usage.cache_creation_input_tokens` | `integer` | Входные токены, записанные в кэш промптов.                                                                                                                                        |## Потоковая передачаУстановите `"stream": true`. Ответ поступает потоком серверных событий Anthropic, совместимым с Anthropic SDK.- События потока: `message_start`, `ping`, `content_block_start`, `content_block_delta`, `content_block_stop`, `message_delta` и `message_stop`.
- Текст поступает в `text_delta`, входные данные инструмента — в `input_json_delta` (сначала объедините фрагменты, затем разберите JSON), а текст рассуждений — в `thinking_delta`.
- `stop_reason` и окончательное число выходных токенов поступают в `message_delta`.
- Тип ответа — `text/event-stream`; без потоковой передачи — `application/json`. Ошибка до вызова модели возвращается обычным JSON-ответом с HTTP-кодом, а не событием потока.
- Явно задайте тайм-ауты и предусмотрите безопасное восстановление соединения при потоковой передаче.```text
event: message_start
data: {"type":"message_start","message":{"id":"msg_example","type":"message","role":"assistant","model":"claude-sonnet-5-5","content":[],"stop_reason":null,"usage":{"input_tokens":19,"output_tokens":1}}}

event: ping
data: {"type":"ping"}

event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}

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

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

event: content_block_stop
data: {"type":"content_block_stop","index":0}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"output_tokens":16}}

event: message_stop
data: {"type":"message_stop"}
```## Устранение ошибок| Ошибка или симптом                                                         | Причина                                                                                                              | Решение                                                                                       |
| -------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| `400`: отсутствует `messages` или `model`, либо слишком велик `max_tokens` | Массив `messages` пустой или отсутствует, `model` пустой либо `max_tokens` превышает 1 073 741 823.                  | Передайте оба поля и задайте `max_tokens` в допустимых пределах.                              |
| `400` при вызове `/v1/responses`                                           | Модели Claude не обслуживаются через OpenAI Responses.                                                               | Используйте `POST /v1/messages`.                                                              |
| `400` с упоминанием настройки `thinking`                                   | Модель не принимает эту настройку, например `budget_tokens` у модели с адаптивными рассуждениями.                    | Используйте настройку, указанную для модели в разделе `thinking` выше.                        |
| `402 insufficient_credits`                                                 | Баланс меньше оценочной стоимости запроса, часто из-за слишком большого `max_tokens`.                                | Пополните баланс или уменьшите `max_tokens`.                                                  |
| `403 forbidden`                                                            | На аккаунте только регистрационный бонус, а модель не входит в разрешённый список, либо она недоступна группе ключа. | Пополните баланс, выберите бесплатную модель или используйте ключ с доступом к нужной модели. |
| `404 not_found`                                                            | Неизвестный ID модели либо модель недоступна этому ключу.                                                            | Получите список доступных моделей через `GET /v1/models`.                                     |
| `429 rate_limit_exceeded`                                                  | Достигнут лимит запросов аккаунта или бесплатной модели.                                                             | Подождите время, указанное в `Retry-After`, затем повторите запрос.                           |
| `200` с `stop_reason: "max_tokens"` и коротким или пустым ответом          | Лимит `max_tokens` исчерпан до формирования ответа, часто из-за рассуждений.                                         | Увеличьте `max_tokens` или уменьшите `output_config.effort`.                                  |### Обзор HTTP-ошибокОшибки до вызова модели используют поля BeatAPI `error.code`, `error.message`, `retryable` и `request_id`. Остальные сохраняют формат Anthropic `{"type": "error", "error": {"type", "message"}}`. Код находится в `error.type`, ID запроса — в конце `message`. См. [ошибки](/errors#text-endpoints).| HTTP-статус | Коды                                                       | Что делать                                                                                                         |
| ----------- | ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| 400         | `bad_request`, `content_policy_violation`                  | Исправьте запрос или ввод. Не отправляйте его повторно без изменений.                                              |
| 401         | `missing_api_key`, `invalid_api_key`                       | Проверьте ключ. Не повторяйте запрос без исправления.                                                              |
| 402         | `insufficient_credits`                                     | Пополните баланс или увеличьте лимит ключа. Слишком высокий `max_tokens` может вызвать эту ошибку.                 |
| 403         | `forbidden`                                                | Проверьте группу ключа, список разрешённых IP и доступность модели за бесплатные кредиты.                          |
| 404         | `not_found`                                                | Неизвестная модель. Проверьте активные модели через `GET /v1/models`.                                              |
| 429         | `rate_limit_exceeded`                                      | Подождите согласно `Retry-After` или `retry_after_seconds`, затем повторите запрос с увеличивающимися интервалами. |
| 500         | `internal_error`, `temporary_error`                        | Повторите запрос один-два раза с увеличивающимися интервалами.                                                     |
| 503         | `model_unavailable`, `upstream_timeout`, `temporary_error` | Повторите запрос с увеличивающимися интервалами или выберите другую модель.                                        |Все коды и правила повторных запросов: [ошибки](/errors#text-endpoints).## Примечания- Модели Claude доступны только через Anthropic Messages, но не через [OpenAI Responses](/text-api/gpt/responses).
- Токены рассуждений оплачиваются как выходные и входят в `max_tokens`. Оставляйте достаточно токенов и для рассуждений, и для ответа.
- Храните ключи на доверенных серверах, записывайте ID запроса из ответа и повторяйте запросы только при ошибках `429`, `500` и `503`.

Reference: https://docs.beatapi.io/api-reference/text-api/claude-messages

## Authentication

- `Authorization` header (bearer token, required) — Передавайте API-ключ в виде `Authorization: Bearer <BEATAPI_API_KEY>`.

## Servers

- `https://direct.beatapi.io` (Direct, default)
- `https://api.beatapi.io` (API)

## Request

### Body (application/json)

This endpoint expects an object.

- `model` (enum, required) — Точный ID модели. Прежние рабочие ID (`claude-opus-5`, `claude-sonnet-5`, `claude-haiku-4-5-20251001`) перечислены в разделе [Старые модели](/text-api/legacy-models). Вызовите `GET /v1/models` со своим ключом, чтобы проверить, какие модели ему доступны. `claude-fable-5-1`, `claude-opus-5-5`, `claude-sonnet-5-5`, `claude-haiku-5-5`
  - Allowed values: `claude-opus-5-5`, `claude-sonnet-5-5`, `claude-haiku-5-5`, `claude-fable-5-1`
- `max_tokens` (integer, required) — Максимальное число генерируемых токенов, включая рассуждения. Всегда передавайте это поле. Если его нет или оно равно `0`, применяется лимит по умолчанию, который может оказаться ниже ожидаемого. Максимально допустимое значение — 1 073 741 823; превышение возвращает `400 bad_request`. При этом не превышайте максимальный объём вывода модели из таблицы выше. `max_tokens` также используется для оценки необходимого баланса. Слишком большое значение может привести к `402 insufficient_credits`, даже если фактический ответ был бы коротким. Указывайте столько токенов, сколько требуется задаче.
- `messages` (list of V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItems, required) — История диалога, от самого раннего сообщения к последнему. У каждого сообщения есть `role` (`user` или `assistant`) и `content`. В `content` передаётся строка либо массив блоков содержимого. Основные типы блоков: `text`, `image` (источник base64 или URL), `tool_use` (в сообщении assistant) и `tool_result` (в сообщении user). Пустой или отсутствующий массив `messages` приводит к `400 bad_request`.
- `system` (V1MessagesPostRequestBodyContentApplicationJsonSchemaSystem, optional) — Системный промпт: строка либо массив блоков `text`. Добавьте `cache_control` к блоку, чтобы кэшировать длинный неизменяемый префикс.
- `stream` (boolean, optional, default: false) — Передавать ответ потоком событий SSE. См. раздел о потоковой передаче ниже.
- `stop_sequences` (list of string, optional) — Строки, при обнаружении которых генерация прекращается. В ответе будет `stop_reason: "stop_sequence"`.
- `tools` (list of V1MessagesPostRequestBodyContentApplicationJsonSchemaToolsItems, optional) — Инструменты, которые может вызвать модель. У каждого есть `name`, `description` и `input_schema` (JSON Schema). При вызове инструмента модель возвращает `stop_reason: "tool_use"`; выполните инструмент и передайте результат в следующем блоке `tool_result`.
- `tool_choice` (V1MessagesPostRequestBodyContentApplicationJsonSchemaToolChoice, optional) — Нужно ли модели использовать `tools` и каким образом. `auto` оставляет выбор модели, `any` требует вызвать любой инструмент, `tool` — инструмент по имени, `none` запрещает инструменты. `{"type":"auto"}`, `{"type":"any"}`, `{"type":"tool","name":"..."}`, `{"type":"none"}`
- `thinking` (V1MessagesPostRequestBodyContentApplicationJsonSchemaThinking, optional) — Расширенные рассуждения. Поле `type` включает или отключает их. Токены рассуждений входят в лимит `max_tokens` и оплачиваются как выходные. `thinking.type` принимает одно из значений выше. При `enabled` задайте `thinking.budget_tokens`: целое число не меньше 1 024 и меньше `max_tokens`. `thinking.display` принимает `summarized` или `omitted`. Новые модели могут не возвращать текст рассуждений, если не запросить `summarized`. Глубина адаптивных рассуждений задаётся через `output_config.effort`. `claude-fable-5-1`: Используйте `{"type":"adaptive"}` и задавайте глубину через `output_config.effort`; `budget_tokens` отклоняется. `claude-opus-5-5`: Используйте `{"type":"adaptive"}` и задавайте глубину через `output_config.effort`; `budget_tokens` отклоняется. `claude-sonnet-5-5`: Используйте `{"type":"adaptive"}` и задавайте глубину через `output_config.effort`; `budget_tokens` отклоняется. `adaptive`, `enabled`, `disabled`
- `output_config` (V1MessagesPostRequestBodyContentApplicationJsonSchemaOutputConfig, optional)
- `cache_control` (V1MessagesPostRequestBodyContentApplicationJsonSchemaCacheControl, optional) — Кэширование промпта. Добавьте к блоку `system`, `messages` или `tools`, чтобы кэшировать всё до этого блока включительно, либо на верхний уровень запроса. Значение `ttl`: `5m` (по умолчанию) или `1h`. Чтение кэша, запись на 5 минут и запись на 1 час оплачиваются отдельно. Кэшированный префикс оплачивается как чтение кэша, а не как новый вход. Количество токенов при чтении и создании кэша указано в `usage.cache_read_input_tokens` и `usage.cache_creation_input_tokens`. `{"type":"ephemeral"}`

## Response

### 200

Без потоковой передачи запрос возвращает один JSON-объект. Ниже приведён сокращённый пример.

- `id` (string, optional) — ID сообщения. Сохраняйте его вместе с ID запроса для обращений в поддержку и сверки расходов.
- `model` (string, optional) — Модель, сформировавшая ответ.
- `content` (list of V1MessagesPostResponsesContentApplicationJsonSchemaContentItems, optional)
- `stop_reason` (string, optional) — `end_turn` — ответ завершён; `max_tokens` — достигнут лимит `max_tokens`; `stop_sequence` — сработала останавливающая последовательность; `tool_use` — модель вызвала инструмент.
- `usage` (V1MessagesPostResponsesContentApplicationJsonSchemaUsage, optional)

## Errors

### 400 Bad Request Error

`bad_request`, `content_policy_violation` Исправьте запрос или ввод. Не отправляйте его повторно без изменений. Ошибки до вызова модели используют поля BeatAPI `error.code`, `error.message`, `retryable` и `request_id`. Остальные сохраняют формат Anthropic `{"type": "error", "error": {"type", "message"}}`. Код находится в `error.type`, ID запроса — в конце `message`. См. [ошибки](/errors#text-endpoints).

- `map from string to any`

### 401 Unauthorized Error

`missing_api_key`, `invalid_api_key` Проверьте ключ. Не повторяйте запрос без исправления. Ошибки до вызова модели используют поля BeatAPI `error.code`, `error.message`, `retryable` и `request_id`. Остальные сохраняют формат Anthropic `{"type": "error", "error": {"type", "message"}}`. Код находится в `error.type`, ID запроса — в конце `message`. См. [ошибки](/errors#text-endpoints).

- `map from string to any`

### 402 Payment Required Error

`insufficient_credits` Пополните баланс или увеличьте лимит ключа. Слишком высокий `max_tokens` может вызвать эту ошибку. Ошибки до вызова модели используют поля BeatAPI `error.code`, `error.message`, `retryable` и `request_id`. Остальные сохраняют формат Anthropic `{"type": "error", "error": {"type", "message"}}`. Код находится в `error.type`, ID запроса — в конце `message`. См. [ошибки](/errors#text-endpoints).

- `map from string to any`

### 403 Forbidden Error

`forbidden` Проверьте группу ключа, список разрешённых IP и доступность модели за бесплатные кредиты. Ошибки до вызова модели используют поля BeatAPI `error.code`, `error.message`, `retryable` и `request_id`. Остальные сохраняют формат Anthropic `{"type": "error", "error": {"type", "message"}}`. Код находится в `error.type`, ID запроса — в конце `message`. См. [ошибки](/errors#text-endpoints).

- `map from string to any`

### 404 Not Found Error

`not_found` Неизвестная модель. Проверьте активные модели через `GET /v1/models`. Ошибки до вызова модели используют поля BeatAPI `error.code`, `error.message`, `retryable` и `request_id`. Остальные сохраняют формат Anthropic `{"type": "error", "error": {"type", "message"}}`. Код находится в `error.type`, ID запроса — в конце `message`. См. [ошибки](/errors#text-endpoints).

- `map from string to any`

### 429 Too Many Requests Error

`rate_limit_exceeded` Подождите согласно `Retry-After` или `retry_after_seconds`, затем повторите запрос с увеличивающимися интервалами. Ошибки до вызова модели используют поля BeatAPI `error.code`, `error.message`, `retryable` и `request_id`. Остальные сохраняют формат Anthropic `{"type": "error", "error": {"type", "message"}}`. Код находится в `error.type`, ID запроса — в конце `message`. См. [ошибки](/errors#text-endpoints).

- `map from string to any`

### 500 Internal Server Error

`internal_error`, `temporary_error` Повторите запрос один-два раза с увеличивающимися интервалами. Ошибки до вызова модели используют поля BeatAPI `error.code`, `error.message`, `retryable` и `request_id`. Остальные сохраняют формат Anthropic `{"type": "error", "error": {"type", "message"}}`. Код находится в `error.type`, ID запроса — в конце `message`. См. [ошибки](/errors#text-endpoints).

- `map from string to any`

### 503 Service Unavailable Error

`model_unavailable`, `upstream_timeout`, `temporary_error` Повторите запрос с увеличивающимися интервалами или выберите другую модель. Ошибки до вызова модели используют поля BeatAPI `error.code`, `error.message`, `retryable` и `request_id`. Остальные сохраняют формат Anthropic `{"type": "error", "error": {"type", "message"}}`. Код находится в `error.type`, ID запроса — в конце `message`. См. [ошибки](/errors#text-endpoints).

- `map from string to any`

## Types

### V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItems

- `role` (string, required)
- `content` (V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItemsContent, required)

### V1MessagesPostRequestBodyContentApplicationJsonSchemaSystem

Системный промпт: строка либо массив блоков `text`. Добавьте `cache_control` к блоку, чтобы кэшировать длинный неизменяемый префикс.

- string
- list of V1MessagesPostRequestBodyContentApplicationJsonSchemaSystemOneOf1Items

### V1MessagesPostRequestBodyContentApplicationJsonSchemaToolsItems

### V1MessagesPostRequestBodyContentApplicationJsonSchemaToolChoice

Нужно ли модели использовать `tools` и каким образом. `auto` оставляет выбор модели, `any` требует вызвать любой инструмент, `tool` — инструмент по имени, `none` запрещает инструменты. `{"type":"auto"}`, `{"type":"any"}`, `{"type":"tool","name":"..."}`, `{"type":"none"}`

### V1MessagesPostRequestBodyContentApplicationJsonSchemaThinking

Расширенные рассуждения. Поле `type` включает или отключает их. Токены рассуждений входят в лимит `max_tokens` и оплачиваются как выходные. `thinking.type` принимает одно из значений выше. При `enabled` задайте `thinking.budget_tokens`: целое число не меньше 1 024 и меньше `max_tokens`. `thinking.display` принимает `summarized` или `omitted`. Новые модели могут не возвращать текст рассуждений, если не запросить `summarized`. Глубина адаптивных рассуждений задаётся через `output_config.effort`. `claude-fable-5-1`: Используйте `{"type":"adaptive"}` и задавайте глубину через `output_config.effort`; `budget_tokens` отклоняется. `claude-opus-5-5`: Используйте `{"type":"adaptive"}` и задавайте глубину через `output_config.effort`; `budget_tokens` отклоняется. `claude-sonnet-5-5`: Используйте `{"type":"adaptive"}` и задавайте глубину через `output_config.effort`; `budget_tokens` отклоняется. `adaptive`, `enabled`, `disabled`

- `type` (enum, optional)
  - Allowed values: `adaptive`, `enabled`, `disabled`

### V1MessagesPostRequestBodyContentApplicationJsonSchemaOutputConfig

- `effort` (enum, optional) — Интенсивность рассуждений модели. Начните с `high`, затем на своих задачах сравните уровень выше и ниже. `low`, `medium`, `high`, `xhigh`, `max`
  - Allowed values: `low`, `medium`, `high`, `xhigh`, `max`

### V1MessagesPostRequestBodyContentApplicationJsonSchemaCacheControl

Кэширование промпта. Добавьте к блоку `system`, `messages` или `tools`, чтобы кэшировать всё до этого блока включительно, либо на верхний уровень запроса. Значение `ttl`: `5m` (по умолчанию) или `1h`. Чтение кэша, запись на 5 минут и запись на 1 час оплачиваются отдельно. Кэшированный префикс оплачивается как чтение кэша, а не как новый вход. Количество токенов при чтении и создании кэша указано в `usage.cache_read_input_tokens` и `usage.cache_creation_input_tokens`. `{"type":"ephemeral"}`

### V1MessagesPostResponsesContentApplicationJsonSchemaContentItems

- `type` (string, optional) — `text`, `tool_use` либо `thinking`, если возвращается текст рассуждений.
- `text` (string, optional) — Текст ответа из блока `text`.

### V1MessagesPostResponsesContentApplicationJsonSchemaUsage

- `input_tokens` (integer, optional) — Входные токены, полученные не из кэша.
- `output_tokens` (integer, optional) — Выходные токены, включая рассуждения.
- `cache_read_input_tokens` (integer, optional) — Входные токены, прочитанные из кэша промптов.
- `cache_creation_input_tokens` (integer, optional) — Входные токены, записанные в кэш промптов.

### V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItemsContent

- string
- list of V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItemsContentOneOf1Items

### V1MessagesPostRequestBodyContentApplicationJsonSchemaSystemOneOf1Items

### V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItemsContentOneOf1Items

- `type` (string, optional)
- `text` (string, optional)
- `image_url` (V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItemsContentOneOf1ItemsImageUrl, optional)
- `source` (V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItemsContentOneOf1ItemsSource, optional)

### V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItemsContentOneOf1ItemsImageUrl

- string
- V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItemsContentOneOf1ItemsImageUrl1

### V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItemsContentOneOf1ItemsSource

- `type` (string, optional)
- `media_type` (string, optional)
- `data` (string, optional)
- `url` (string, optional)

### V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItemsContentOneOf1ItemsImageUrl1

- `url` (string, optional)
- `detail` (string, optional)

## Examples

**Request**

```json
{
  "model": "claude-sonnet-5-5",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": "Design a resilient webhook retry strategy for a payments API."
    }
  ]
}
```

**Response**

```json
{
  "id": "msg_example",
  "model": "claude-sonnet-5-5",
  "content": [
    {
      "type": "text",
      "text": "Retry with exponential backoff and jitter, and make every handler idempotent."
    }
  ],
  "stop_reason": "end_turn",
  "usage": {
    "input_tokens": 19,
    "output_tokens": 16
  },
  "role": "assistant",
  "stop_sequence": null,
  "type": "message"
}
```

**SDK Code**

```python Быстрый старт
import requests

url = "https://direct.beatapi.io/v1/messages"

payload = {
    "model": "claude-sonnet-5-5",
    "max_tokens": 1024,
    "messages": [
        {
            "role": "user",
            "content": "Design a resilient webhook retry strategy for a payments API."
        }
    ]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Быстрый старт
const url = 'https://direct.beatapi.io/v1/messages';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"model":"claude-sonnet-5-5","max_tokens":1024,"messages":[{"role":"user","content":"Design a resilient webhook retry strategy for a payments API."}]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Быстрый старт
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://direct.beatapi.io/v1/messages"

	payload := strings.NewReader("{\n  \"model\": \"claude-sonnet-5-5\",\n  \"max_tokens\": 1024,\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"Design a resilient webhook retry strategy for a payments API.\"\n    }\n  ]\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Быстрый старт
require 'uri'
require 'net/http'

url = URI("https://direct.beatapi.io/v1/messages")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"model\": \"claude-sonnet-5-5\",\n  \"max_tokens\": 1024,\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"Design a resilient webhook retry strategy for a payments API.\"\n    }\n  ]\n}"

response = http.request(request)
puts response.read_body
```

```java Быстрый старт
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://direct.beatapi.io/v1/messages")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"model\": \"claude-sonnet-5-5\",\n  \"max_tokens\": 1024,\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"Design a resilient webhook retry strategy for a payments API.\"\n    }\n  ]\n}")
  .asString();
```

```php Быстрый старт
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://direct.beatapi.io/v1/messages', [
  'body' => '{
  "model": "claude-sonnet-5-5",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": "Design a resilient webhook retry strategy for a payments API."
    }
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Быстрый старт
using RestSharp;

var client = new RestClient("https://direct.beatapi.io/v1/messages");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"model\": \"claude-sonnet-5-5\",\n  \"max_tokens\": 1024,\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"Design a resilient webhook retry strategy for a payments API.\"\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Быстрый старт
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "model": "claude-sonnet-5-5",
  "max_tokens": 1024,
  "messages": [
    [
      "role": "user",
      "content": "Design a resilient webhook retry strategy for a payments API."
    ]
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://direct.beatapi.io/v1/messages")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```