> 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

1 つの BeatAPI キーで、同じ Anthropic Messages エンドポイントから Claude Fable 5.1、Opus 5.5、Sonnet 5.5、Haiku 5.5 を呼び出せます。- 1 つのエンドポイント `POST /v1/messages` で、現行の Claude モデルすべてを呼び出せます。`model` を変えるだけで切り替わります。
- テキストと画像の入力、テキスト出力、ストリーミング、ツール呼び出し、拡張思考、プロンプトキャッシュに対応しています。
- Anthropic SDK で使えます。base URL を `https://direct.beatapi.io`（`/v1` なし）にし、BeatAPI のキーを使ってください。
- Claude モデルは Anthropic Messages のみで呼び出します。`/v1/responses` を呼ぶと `400` が返ります。テキストリクエストの base URL には `https://direct.beatapi.io` を推奨します。Cloudflare の 100 秒制限を受けないため、長時間のノンストリーミングリクエストが途中で切れません。`https://api.beatapi.io` も使え、ネットワークから `direct.beatapi.io` に届かない場合の代替になります。キー、モデル、価格はどちらも同じです。画像・動画 API は `https://api.beatapi.io` のみを使います。POST/v1/messages試してみるこのエンドポイントをテスト画面で開きます。BeatAPI の API キーを入力して送信してください。実際に呼び出され、ご自身の残高から課金されます。## モデル次の ID のいずれかを `model` として送ります。それぞれ独立したモデルで、互いのエイリアスではありません。| モデル ID              | コンテキスト（トークン） | 最大出力（トークン） | 位置づけ                                                    | 入力、USD / 100 万トークン | 出力、USD / 100 万トークン | 備考                               |
| ------------------- | ------------ | ---------- | ------------------------------------------------------- | ------------------ | ------------------ | -------------------------------- |
| `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。100 万トークンのコンテキストに対応 | \$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` に置いて、ブラウザーのコードには入れないでください。以下はリクエスト例であり、実際のモデル出力の記録ではありません。回答は `content` 内の `text` ブロックから読み取り、続けて `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 クライアントは base 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回答をサーバー送信イベントとして返します。下のストリーミングの節を参照してください。**デフォルト**：`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` から始め、自分のワークロードで 1 段階下げた場合と上げた場合を比べてください。**指定できる値**：`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 メッセージをそのまま `messages` に追加し、ツールを実行して、結果を次の `user` メッセージの `tool_result` ブロックで送ります。同じ `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 オブジェクトを 1 つ返します。以下は省略した例です。```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`（断片をつないでから解析します）、思考テキストは `thinking_delta` で届きます。
- `stop_reason` と最終的な出力トークン数は `message_delta` に入っています。
- レスポンスは `text/event-stream` です。ストリーミングなしの場合は `application/json` です。モデルを呼ぶ前に起きた失敗は、ストリームイベントではなく、HTTP ステータス付きの通常の JSON エラーで返されます。
- 明示的なタイムアウトを設定し、ストリーミングレスポンスを安全に再接続してください。```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`、request 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`                       | バックオフして 1～2 回再試行してください。                                        |
| 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) — Send your API key as `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) — 回答をサーバー送信イベントとして返します。下のストリーミングの節を参照してください。
- `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 オブジェクトを 1 つ返します。以下は省略した例です。

- `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`、request 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`、request 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`、request 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`、request 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`、request 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`、request id は `message` の末尾にあります。詳しくは[エラー](/errors#text-endpoints)を参照してください。

- `map from string to any`

### 500 Internal Server Error

`internal_error`、`temporary_error` バックオフして 1～2 回再試行してください。 認証、ルーティング、レート制限、存在しないモデルの失敗はモデルを呼ぶ前に起き、BeatAPI のエンベロープ（`error.code`、`error.message`、`retryable`、`request_id`）で返ります。それ以外の失敗は Anthropic の形式 `{"type": "error", "error": {"type", "message"}}` のままで、コードは `error.type`、request 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`、request id は `message` の末尾にあります。詳しくは[エラー](/errors#text-endpoints)を参照してください。

- `map from string to any`

## Types

### V1MessagesPostRequestBodyContentApplicationJsonSchemaMessagesItems

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

### V1MessagesPostRequestBodyContentApplicationJsonSchemaSystem

システムプロンプト。文字列、または `text` ブロックの配列です。ブロックに `cache_control` を付けると、長く変わらない先頭部分をキャッシュできます。

### 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` から始め、自分のワークロードで 1 段階下げた場合と上げた場合を比べてください。 `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

## 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()
```