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

# 認証

> BIZ MORI API リクエストを認証する方法

すべての API エンドポイントは、**API キー** を Bearer トークン形式で渡して認証する必要があります。

## API キーの発行

1. [BIZ MORI ダッシュボード](https://app.bizmori.com) にログインします
2. [**API キー**](https://app.bizmori.com/keys) に移動します
3. **新規発行** をクリックします
4. キーをコピーして安全に保管します。本番用 API キーは一度しか表示されません。

ダッシュボードでは、アカウントおよび組織ごとにテスト API キーを 1 つずつ自動的に発行します。発行されたキーは API キーページで再度確認できます。詳しい検証手順については [テスト API キー](/ja/test-api-keys) を参照してください。

<Warning>
  API キーはアカウントの API に対する全アクセス権限を付与します。クライアント側のコード、公開リポジトリ、バージョン管理システムには絶対に公開しないでください。環境変数として保存してください。
</Warning>

## テスト API キー

処理サービスを実際に実行せずに連携を検証したい場合は、自動発行された `sk_test_` プレフィックスのテスト API キーを使用してください。

テスト API キーは次のように動作します。

* 本番用キーと同様に `Authorization: Bearer` 認証を使用します。
* 注文作成および注文履歴 API でテスト注文のライフサイクルを検証できます。
* Anti-AI、watermark、AI Detection の処理は実行されません。
* 外部処理サービスを呼び出さず、クレジットも消費しません。
* アップロードされたファイルの内容は破棄され、結果ファイルは作成されません。

テスト注文は本番注文と分離されます。テストキーで Webhook の管理リクエストを送信すると拒否されます。アップロード URL、状態遷移、ファイル名による決定的な結果については [テスト API キー](/ja/test-api-keys) を参照してください。

## API キーの使用方法

すべてのリクエストで `Authorization: Bearer` ヘッダーを使って API キーを渡します。

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://api.bizmori.com/api/v2/orders/anti-ai \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"idempotencyKey": "unique-key", "files": [{"fileName": "image.jpg"}]}'
  ```

  ```javascript Node.js theme={null}
  const response = await fetch('https://api.bizmori.com/api/v2/orders/anti-ai', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_API_TOKEN',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      idempotencyKey: 'unique-key',
      files: [{ fileName: 'image.jpg' }],
    }),
  });

  const data = await response.json();
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://api.bizmori.com/api/v2/orders/anti-ai',
      headers={
          'Authorization': 'Bearer YOUR_API_TOKEN',
      },
      json={
          'idempotencyKey': 'unique-key',
          'files': [{'fileName': 'image.jpg'}],
      },
  )
  data = response.json()
  ```

  ```php PHP theme={null}
  <?php
  $ch = curl_init('https://api.bizmori.com/api/v2/orders/anti-ai');
  curl_setopt_array($ch, [
      CURLOPT_POST => true,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_HTTPHEADER => [
          'Authorization: Bearer YOUR_API_TOKEN',
          'Content-Type: application/json',
      ],
      CURLOPT_POSTFIELDS => json_encode([
          'idempotencyKey' => 'unique-key',
          'files' => [['fileName' => 'image.jpg']],
      ]),
  ]);
  $data = json_decode(curl_exec($ch), true);
  curl_close($ch);
  ```

  ```ruby Ruby theme={null}
  require 'net/http'
  require 'json'

  uri = URI('https://api.bizmori.com/api/v2/orders/anti-ai')
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  req = Net::HTTP::Post.new(uri)
  req['Authorization'] = 'Bearer YOUR_API_TOKEN'
  req['Content-Type'] = 'application/json'
  req.body = JSON.generate(
    idempotencyKey: 'unique-key',
    files: [{ fileName: 'image.jpg' }]
  )

  data = JSON.parse(http.request(req).body)
  ```

  ```go Go theme={null}
  package main

  import (
  	"bytes"
  	"encoding/json"
  	"net/http"
  )

  func main() {
  	body, _ := json.Marshal(map[string]any{
  		"idempotencyKey": "unique-key",
  		"files": []map[string]string{{"fileName": "image.jpg"}},
  	})

  	req, _ := http.NewRequest("POST",
  		"https://api.bizmori.com/api/v2/orders/anti-ai",
  		bytes.NewBuffer(body),
  	)
  	req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
  	req.Header.Set("Content-Type", "application/json")

  	resp, _ := http.DefaultClient.Do(req)
  	defer resp.Body.Close()
  }
  ```

  ```java Java theme={null}
  import java.net.URI;
  import java.net.http.*;

  HttpClient client = HttpClient.newHttpClient();
  HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://api.bizmori.com/api/v2/orders/anti-ai"))
      .header("Authorization", "Bearer YOUR_API_TOKEN")
      .header("Content-Type", "application/json")
      .POST(HttpRequest.BodyPublishers.ofString(
          "{\"idempotencyKey\":\"unique-key\",\"files\":[{\"fileName\":\"image.jpg\"}]}"
      ))
      .build();

  HttpResponse<String> response =
      client.send(request, HttpResponse.BodyHandlers.ofString());
  ```
</CodeGroup>

## 冪等性（Idempotency）

すべての注文作成エンドポイントは `idempotencyKey` パラメータをサポートしています。同じキーで重複したリクエストを送信すると、新しい注文を作成する代わりに **既存の注文を返します**。ネットワーク再試行時の二重処理を防ぐことができます。

```json theme={null}
{
  "idempotencyKey": "2f4b6c82-8a6e-4f39-9f8a-7d3b5c1e2a40",
  "files": [...]
}
```

**UUID v7** の使用を推奨します。ビジネスロジックから導出された決定論的なキー（例: `user-{id}-batch-{timestamp}`）も使用できます。
