> ## Documentation Index
> Fetch the complete documentation index at: https://docs.crazyrouter.com/llms.txt
> Use this file to discover all available pages before exploring further.

# リクエストの作成

> Crazyrouter API へ正しくリクエストする方法

> 更新日: 2026-06-14

## リクエスト形式

API リクエストは HTTPS と JSON リクエストボディを使用します。

### 必須ヘッダー

| Header          | Value                 | 説明         |
| --------------- | --------------------- | ---------- |
| `Authorization` | `Bearer YOUR_API_KEY` | API 認証キー   |
| `Content-Type`  | `application/json`    | リクエストボディ形式 |

### 任意ヘッダー

| Header             | Value              | 説明                              |
| ------------------ | ------------------ | ------------------------------- |
| `Accept`           | `application/json` | レスポンス形式                         |
| `Content-Encoding` | `gzip`             | 任意。リクエストボディを gzip 圧縮して送信する場合に設定 |

## リクエスト例

```bash theme={null}
curl https://api.crazyrouter.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-xxxxxxxx" \
  -d '{
    "model": "gpt-5.5",
    "messages": [{"role": "user", "content": "Hello"}],
    "stream": false
  }'
```

## gzip でリクエストボディを送信する

長いコンテキスト、長文ドキュメント、大量のメッセージ履歴など、リクエストボディが大きい場合は、元の JSON ボディを gzip 圧縮して送信できます。

gzip は転送形式だけを変更します。リクエストの意味は変わりません。Crazyrouter は JSON を解析する前にリクエストボディを自動で解凍します。

次のヘッダーを追加してください。

```http theme={null}
Content-Type: application/json
Content-Encoding: gzip
```

<Note>
  `Content-Encoding: gzip` は「リクエストボディ自体が gzip 圧縮されている」ことを示します。通常レスポンス圧縮に使われる `Accept-Encoding: gzip` とは異なります。
</Note>

### Python

```python theme={null}
import gzip
import json
import requests

payload = {
    "model": "gpt-5.5",
    "messages": [
        {"role": "user", "content": "長いコンテキストやドキュメント内容をここに入れます..."}
    ],
    "stream": False
}

raw = json.dumps(payload, ensure_ascii=False).encode("utf-8")
compressed = gzip.compress(raw)

resp = requests.post(
    "https://api.crazyrouter.com/v1/chat/completions",
    headers={
        "Authorization": "Bearer sk-xxxxxxxx",
        "Content-Type": "application/json",
        "Content-Encoding": "gzip",
    },
    data=compressed,
    timeout=120,
)

print(resp.status_code, resp.text)
```

### Node.js

```js theme={null}
import zlib from "node:zlib";

const payload = {
  model: "gpt-5.5",
  messages: [
    { role: "user", content: "長いコンテキストやドキュメント内容をここに入れます..." },
  ],
  stream: false,
};

const raw = Buffer.from(JSON.stringify(payload));
const compressed = zlib.gzipSync(raw);

const resp = await fetch("https://api.crazyrouter.com/v1/chat/completions", {
  method: "POST",
  headers: {
    Authorization: "Bearer sk-xxxxxxxx",
    "Content-Type": "application/json",
    "Content-Encoding": "gzip",
  },
  body: compressed,
});

console.log(resp.status, await resp.text());
```

### cURL

```bash theme={null}
cat > body.json <<'JSON'
{
  "model": "gpt-5.5",
  "messages": [
    {
      "role": "user",
      "content": "長いコンテキストやドキュメント内容をここに入れます..."
    }
  ],
  "stream": false
}
JSON

gzip -c body.json > body.json.gz

curl https://api.crazyrouter.com/v1/chat/completions \
  -H "Authorization: Bearer sk-xxxxxxxx" \
  -H "Content-Type: application/json" \
  -H "Content-Encoding: gzip" \
  --data-binary @body.json.gz
```

### ボディサイズに応じて gzip を自動で有効にする

システムがワークフローになっている場合でも、どの業務ステップで gzip を使うかを手動で分ける必要は通常ありません。共通の HTTP クライアント層で JSON を bytes に変換し、サイズがしきい値を超えた場合だけ gzip するのがおすすめです。

推奨しきい値：

```text theme={null}
body >= 128KB：gzip を有効化
body < 128KB：通常の JSON として送信
```

リクエストが MB 単位になることが多い場合は、しきい値を `256KB` にしても構いません。非常に小さいリクエストは gzip ヘッダーや圧縮処理の影響で、逆に大きくなることがあります。

Python ラッパー例：

```python theme={null}
import gzip
import json
import requests

def post_json(url, payload, api_key, gzip_threshold=128 * 1024):
    raw = json.dumps(payload, ensure_ascii=False).encode("utf-8")

    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    }

    if len(raw) >= gzip_threshold:
        body = gzip.compress(raw)
        headers["Content-Encoding"] = "gzip"
    else:
        body = raw

    return requests.post(url, headers=headers, data=body, timeout=120)
```

Node.js ラッパー例：

```js theme={null}
import zlib from "node:zlib";

async function postJson(url, payload, apiKey, gzipThreshold = 128 * 1024) {
  const raw = Buffer.from(JSON.stringify(payload));
  const headers = {
    Authorization: `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  };

  const body =
    raw.length >= gzipThreshold
      ? (() => {
          headers["Content-Encoding"] = "gzip";
          return zlib.gzipSync(raw);
        })()
      : raw;

  return fetch(url, {
    method: "POST",
    headers,
    body,
  });
}
```

次のような場合に適しています。

* 1 回のリクエストボディが 1 MB を超えることが多い
* 長いコンテキストや長文ドキュメントを繰り返しアップロードする
* クライアント側で HTTP body とヘッダーを直接制御できる

## ストリーミング

`stream: true` を設定すると、SSE 形式のストリーミング出力を利用できます。

```bash theme={null}
curl https://api.crazyrouter.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-xxxxxxxx" \
  -d '{
    "model": "gpt-5.5",
    "messages": [{"role": "user", "content": "Hello"}],
    "stream": true
  }'
```

ストリーミングレスポンスは Server-Sent Events 形式です。各イベントは `data: ` で始まり、最後は `data: [DONE]` で終了します。

## オンラインデバッグ

次の方法で API をテストできます。

* **Crazyrouter Playground**: ログイン後、[crazyrouter.com/console/playground](https://crazyrouter.com/console/playground) でブラウザから直接テスト
* **cURL**: コマンドラインからリクエスト送信
* **Postman / Apifox**: API デバッグツールを利用
