API リファレンス
BazaarLink API の概要
BazaarLink は、モデルやプロバイダーをまたいで統一された OpenAI 互換のリクエスト/レスポンス形式を提供します。一度統合すれば、アプリを書き直さずにモデルを切り替えられます。
OpenAPI 仕様
BazaarLink API 全体は OpenAPI 仕様で文書化され、YAML と JSON 形式で利用できます:
Swagger UI、Postman、または OpenAPI 対応のコードジェネレーターに読み込み、API の確認やクライアントライブラリの生成に利用できます。
リクエスト
チャット補完のリクエスト形式
チャット補完のリクエスト本文は、次のエンドポイントに送信します:
/api/v1/chat/completions対応フィールドの完全な一覧は パラメータ。
構造化出力
モデルにスキーマに一致する有効なJSONを返させます。モデル出力をプログラムで解析する信頼性の高いアプリケーション構築に不可欠です。
json_object— 基本 JSON モード。モデルは有効な JSON を返します。json_schema— 厳密なスキーマモード。出力は指定した JSON Schema に一致する必要があります。
プラグイン
BazaarLink は plugins 配列を選択した上流ルートへ転送します。利用可否はモデルとプロバイダーに依存し、:online モデルでは web プラグインも有効になります。
オプションヘッダー
リクエストヘッダーでアプリケーションを識別して、使用量追跡、ダッシュボード表示、詳細な分析を有効にします。
アシスタントプリフィル
メッセージ配列の最後に未完成の assistant メッセージを追加し、互換性のあるモデルルートに続きを生成するよう要求します。
レスポンス
BazaarLink はモデルやプロバイダーごとの完了レスポンスを、統一された OpenAI 互換形式に正規化します。
完了レスポンス形式
choices は常に配列です。ストリーミングでは delta、非ストリーミングでは message を使用し、利用可能な場合は使用量とコストも返します。
終了理由
finish_reason は stop、length、tool_calls、content_filter、error などに正規化され、native_finish_reason はプロバイダーの元の値を保持します。
コストと統計の照会
generation ID による単一完了の詳細統計を取得(chat/completions レスポンスの id、またはストリームの x-bz-gen-id ヘッダから)。
チャットコンプリーション
主要エンドポイント。OpenAI Chat Completions APIと互換。
/api/v1/chat/completionsリクエストボディ
リクエストスキーマ(TypeScript)
リクエスト例
レスポンス
レスポンススキーマ(TypeScript)
BazaarLinkが正規化するのはmodelとproviderフィールドの削除の2点のみで、それ以外のアップストリームレスポンスはそのまま転送されます。native_finish_reason、system_fingerprint、reasoningなどのフィールドは、該当するアップストリームプロバイダーがそれを設定している場合にのみ存在します — すべてのモデルで存在することを前提にしないでください。usage.costは例外で、常にBazaarLink自身が確定・請求した金額であり、アップストリームから転送された値ではありません。
画像生成
DALL·EやGPT-4oなどのモデルを使用してテキストプロンプトから画像を生成。チャットコンプリーションエンドポイントの`modalities`パラメータを使用して画像出力をリクエスト。 画像編集(既存の画像を修正)は POST /v1/images/edits を使用します —— OpenAI images.edit 互換で、multipart/form-data でソース画像を送信します。編集対応モデルは modality が text+image->image です(例: qwen/qwen-image-edit)。純粋な生成モデルは text->image です —— 各モデルの modality は GET /v1/models で確認してください。
Response format
/api/v1/images/generations はデフォルトで OpenAI 互換の同期 JSON を返します(2026-07-25 以降)——client.images.generate() はラッパーなしで動作します。stream: true を渡すと SSE イベントストリームに切り替わり、生成時間の長いモデルで進捗を受け取れます。
A. /v1/chat/completions(ネイティブ、推奨)
/api/v1/chat/completionsThe canonical streaming path. Recommended for any new integration.
画像から画像(image-to-image):content 配列に image_url パートを含めます。データURIまたは https 画像URL(http:// は拒否されます)をサポートし、最大8枚、データURIあたり約10MBです。画像を含むメッセージには text パート(編集指示)も必要です。一部のモデルは image_config(例:{"strength": 0.7}、0〜1 — 低いほど元画像に近い)を追加でサポートし、そのままアップストリームに渡されます。
画像編集(OpenAI互換)
/api/v1/images/editsOpenAI SDK の client.images.edit() がそのまま動作します(multipart アップロード、data: [{ url }] を返す同期JSONレスポンス)。制限は image-to-image と同じ:最大8枚、各10MB。mask と response_format=b64_json は未対応です。
curl https://bazaarlink.ai/api/v1/images/edits \
-H "Authorization: Bearer $BL_API_KEY" \
-F model="openai/gpt-5.4-image-2" \
-F image=@cat.png \
-F prompt="change the background to a night city"B. /v1/images/generations(DALL·E 互換)
/api/v1/images/generationsOpenAI DALL-E request shape. Sync JSON ({ created, data: [{ url }] }) is the default and works with client.images.generate() out of the box; pass stream: true to get the SSE event stream documented below instead.
# Streaming variant — progressive delivery for long generations
curl -N https://bazaarlink.ai/api/v1/images/generations \
-H "Authorization: Bearer $BL_API_KEY" \
-H "Accept: text/event-stream" \
-H "Content-Type: application/json" \
-d '{"model":"openai/gpt-5.4-image-2","prompt":"a red cat on a sofa","stream":true}'SSE event protocol
Both endpoints emit the same event types:
対応する画像モデル
| Model ID | Modality | i2i (edits) |
|---|
動画生成
非同期の 3 ステップフロー(submit → poll → content)。動画生成には 30 秒〜5 分かかり、chat-completions の同期リクエスト/レスポンス方式には適合しません — そのため BazaarLink は動画を専用の /api/v1/videos パスに分離し、job-id パターンを採用しています:submit で vjob_* ID を取得 → ステータスを poll → 完了後に bytes を fetch。video model を /chat/completions や /images/generations 経由で呼び出すと 400(code: wrong_endpoint_for_video)が返ります。費用は completed 時に実際の usage.cost で精算されます。
動画タスクの種類
1 つのエンドポイントで複数のタスクを扱います。実際にどのタスクが実行されるかは送信するフィールドで決まります —— 同一モデルで画像から動画、キーフレーム、継続生成が可能です。すべてのモデルがすべてのタスクに対応するわけではなく、非対応の場合は 400 を返します。
1. ジョブを送信(即座に vjob_xxx を返す)
/api/v1/videos2. ステータスをポーリング
/api/v1/videos/{id}curl -H "Authorization: Bearer $BL_API_KEY" \
https://bazaarlink.ai/api/v1/videos/vjob_xxx3. 動画コンテンツを取得 (MP4)
/api/v1/videos/{id}/contentcurl -H "Authorization: Bearer $BL_API_KEY" \
-o output.mp4 \
https://bazaarlink.ai/api/v1/videos/vjob_xxx/content知っておくべきこと
- 許可される解像度はモデルごとに異なります —— 非対応の値を送ると、対応値を列挙した 400 が返ります。
- 入力の画像/動画は公開 URL からアクセス可能である必要があります。ホットリンク保護されたホスト(一部の wiki など)は失敗します。
- 入力メディアはアップストリームのコンテンツモデレーションを通過し、まれに拒否されることがあります。
- 継続生成では、指定する duration がソース動画長を超える必要があります。
- 出力アスペクト比は入力画像に従います —— 正方形の画像は正方形の動画になります。
- 動画編集は入力動画の秒数と生成された出力の秒数で課金されます。
- 編集/継続生成の input_video は公開 URL である必要があります。ここで生成した動画は API キーの背後で配信されるためアップストリームが取得できません —— ソース動画は公開アクセス可能な URL にホストしてください。
- Webhook には署名がありません——実行前に GET /videos/{id} でステータスと金額を確認してください。そこでの unsigned_urls は絶対 URL です(ポーリング応答の相対パスとは異なります)。
対応する動画モデル
| Model ID | Modality | Tasks |
|---|---|---|
| bytedance/seedance-2.0 | text+image+audio+video->video | t2v, i2v |
| bytedance/seedance-2.0-fast | text+image+audio+video->video | t2v, i2v |
| google/veo-3.1 | text+image->video | t2v, i2v |
| openai/sora-2-pro | text+image->video | t2v, i2v |
| bytedance/seedance-1-5-pro | text+image->video | t2v, i2v |
| alibaba/happyhorse-1.0 | text->video | t2v |
| alibaba/wan2.6-r2v-flash | text+image+video->video | r2v |
| alibaba/wan2.5-i2v-preview | text+image->video | i2v |
| alibaba/happyhorse-1.1 | text->video | t2v |
| alibaba/wan2.7-t2v | text->video | t2v |
| alibaba/wan2.7-i2v | text+image+video->video | i2v, kf2v, continuation |
| alibaba/wan2.6-t2v | text->video | t2v |
| alibaba/wan2.5-t2v-preview | text->video | t2v |
| alibaba/wan2.2-t2v-plus | text->video | t2v |
| alibaba/wan2.7-r2v | text+image+video->video | r2v |
| alibaba/wan2.1-t2v-plus | text->video | t2v |
| alibaba/wan2.1-t2v-turbo | text->video | t2v |
| alibaba/wan2.6-i2v-flash | text+image->video | i2v |
| alibaba/wan2.2-i2v-flash | text+image->video | i2v |
| alibaba/wan2.7-videoedit | text+image+video->video | videoedit |
| alibaba/wan2.6-i2v | text+image->video | i2v |
| alibaba/wan2.2-i2v-plus | text+image->video | i2v |
| alibaba/wan2.6-r2v | text+image+video->video | r2v |
動画入力
動画入力に対応するモデルに動画ファイルを送信し、分析、キャプション生成、シーンやイベントに関する質問への回答をさせます。直接URLまたはbase64データURIが使えます — URLは公開アクセス可能な動画に効率的、base64はローカルファイルや非公開動画向けです。
対応フォーマット
MP4 (H.264)MPEGMOVWebMPDF入力
PDFをネイティブサポートするモデル(Claude、Geminiなど)に、メッセージで直接PDF文書を送信できます。BazaarLinkはファイルをそのままモデルに転送します — 通常のinput tokensとして課金、追加料金や追加処理はありません。
対応フォーマット
- PDFドキュメント(テキスト、画像、表、スキャン)
- Base64エンコードされたデータURL(`data:application/pdf;base64,...`)
- 複数ページドキュメント
- パスワードなしPDFのみ
Responses API
ステートレスなマルチターン会話、ツールコール、マルチモーダル入力に対応するOpenAI Responses API互換エンドポイント。OpenAI Python SDK ≥ 1.xのclient.responses.create()を使用するエージェントやフレームワークに最適。
/api/v1/responsesリクエストボディ
リクエストスキーマ(TypeScript)
リクエスト例
レスポンス形式
Chat Completionsからの移行
messagesをinput(文字列または配列)に置き換え、システムロールメッセージの代わりにinstructionsを使用し、choices[0].message.contentの代わりにoutput[0].content[0].textを読み取ります。
制限事項
- previous_response_id または store: true を渡すと 400(エラーコード invalid_prompt)を返します——受け付けられて無視されるわけではありません。常にステートレスモードを使用し、input 配列に完全な会話履歴を渡してください。
- OpenAI 独自の組み込み型ホスト済みツール(web_search_preview、file_search、computer_use_preview)は非対応です。Web 検索は plugins: [{id:"web"}] で利用できます——一部のモデルルートのみ対応。
- background: true は受け付けられますが無視されます——すべてのリクエストは完了まで同期的に実行されます。
Messages(Anthropic 互換)
Anthropic Claude SDK 互換の Messages API。Anthropic の公式 API と同じ方法で使用でき、base URL と auth header を変更するだけです。
/api/v1/messagesリクエストボディ
リクエスト例
レスポンス
エラー:400(検証失敗)、402(クレジット不足)、429(rate limit)、502(アップストリームエラー/キー欠如)、503(サーバー再起動中)。
モデル
料金と機能情報を含む、利用可能な全モデルの一覧を取得。 このエンドポイントには認証は不要です。
/api/v1/models# Text models (default)
curl https://bazaarlink.ai/api/v1/models
# Complete catalog
curl "https://bazaarlink.ai/api/v1/models?output_modalities=all"レスポンス
入力長に応じた段階制価格
一部のモデルは、プロンプトが token 閾値を超えると価格表全体が切り替わります(閾値を超えた分だけではありません)。閾値は厳密な不等式です:入力 token 数がちょうど N の場合は N 以下の階層が適用され、N を超えた場合にのみ上位の階層が適用されます。
pricing_tiers は pricing と同階層のフィールドで、基本価格を超える上書き階層があるモデルにのみ存在します。項目は above_prompt_tokens の昇順で並び、prompt/completion は token あたりの USD 価格です(pricing.prompt/pricing.completion と同じ単位)。pricing.prompt と pricing.completion は常に基本(最低)階層です。
ほとんどのモデルには階層がありません — その場合、レスポンスに pricing_tiers キー自体が存在しません。
利用可能なモデル (257)
BazaarLinkで現在利用可能なモデルです。データベースから動的に読み込まれます:
すべてのモデルは モデルページで閲覧できます。
ストリーミング
設定: stream: true でServer-Sent Events(SSE)ストリームを受信します。各イベントにはレスポンスのチャンクが含まれます。
SSE形式
data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"Hello"},"index":0}]}
data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":" world"},"index":0}]}
data: {"id":"chatcmpl-abc","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{"prompt_tokens":10,"completion_tokens":4,"total_tokens":14}}
data: [DONE]Keep-alive と最終チャンク
ストリームにはキープアライブとしてSSEコメント行(コロンで始まる)やハートビートイベントが含まれることがあります — 生ストリームをそのままJSON.parseせず、data: 以外の行はスキップしてください。最後のdataチャンクは data: [DONE] の前に usage(トークン数とコスト)を含みます。成功したレスポンスには X-Request-Id ヘッダーが含まれます — 問題を報告する際に添えてください。
: keepalive <- SSE comment line — ignore, do NOT JSON.parse
data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"Hi"},"index":0}]}
data: {"id":"chatcmpl-abc","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{...}}
data: [DONE]ストリームのキャンセル
クライアント接続を閉じることでストリーミングリクエストをキャンセルできます — 例えば AbortController.abort() を呼ぶ、または stream オブジェクトを閉じるなど。BazaarLink はキャンセルを受け取り次第、以降のチャンク転送を停止し、プロバイダーへのアウトバウンドリクエストを中止します。
ストリーム途中でのエラー
data: {"id":"chatcmpl-abc","choices":[{"delta":{"content":"The capital of "},"index":0}]}
data: {"error":{"message":"Upstream connection lost.","type":"upstream_error","code":502}}
data: [DONE]エンベディング
エンベディング(Embeddings)は意味を捉えた数値表現で、テキストをベクトル(数値の配列)に変換し、さまざまな機械学習タスクに利用できます。BazaarLinkはOpenAI Embeddings API互換の統一エンドポイントを提供し、単一のインターフェースで複数プロバイダーのエンベディングモデルを呼び出せます。
エンベディングとは?
エンベディングはテキストを高次元ベクトルに変換し、意味的に近いテキストはベクトル空間上でも近い距離に位置します——例えば「猫」と「子猫」のエンベディングは似ていますが、「猫」と「飛行機」は大きく離れています。このベクトル表現により、機械はテキスト間の関係を理解できるようになり、多くのAIアプリケーションの基盤となっています。
一般的なユースケース
/api/v1/embeddingsパラメータ
基本リクエスト
バッチ処理
文字列の配列を送信すると、1回のリクエストで複数のテキストをまとめてエンベディングできます — テキストごとに呼び出すより安く速くなります。
マルチモーダル入力(画像+テキスト)
画像入力に対応したモデル(output_modalities に "embeddings"、inputModalities に "image" を含む)は、{content:[{type:"text",...}, {type:"image_url",...}]} 形式の入力アイテムを受け付け、画像単体、またはテキストと組み合わせてエンベディングできます。
プロバイダールーティング
チャット補完と同様に、どのアップストリームがエンベディングリクエストを処理するかを制御できます — フィールドの完全なリファレンスは Provider Selection を参照してください。
エンベディングモデルの探し方
エンベディング専用のモデル一覧エンドポイントはありません。GET /api/v1/models を呼び出し、output_modalities に "embeddings" を含むエントリをクライアント側でフィルタするか、Models ページを参照してください。
制限事項
- ストリーミング非対応 — チャット補完と異なり、エンベディングは常に完全なレスポンスとして返されます。
- 各モデルには最大入力長があります。それを超えるテキストはアップストリーム側で切り詰められるか拒否されます。
- 同一の入力に対するエンベディングは決定論的です — temperature やランダム性はありません。
ベストプラクティス
- 速度・品質・コストのトレードオフに応じてモデルを選びましょう — 小型モデル(例:qwen/qwen3-embedding-4b)は安価で高速、大型モデル(例:openai/text-embedding-3-large)は一般的により高精度にエンベディングします。
- テキストごとに呼び出すのではなく、複数のテキストを1回のリクエストにまとめましょう — ラウンドトリップが減り、オーバーヘッドも下がります。
- 結果をキャッシュしましょう — 同じ入力のエンベディングは変化しないため、再生成せず保存しておくべきです。
- 比較にはユークリッド距離ではなくコサイン類似度を使いましょう — スケール不変で高次元ベクトルに向いています。
- 各モデルのコンテキスト長に注意しましょう — 長い文書はエンベディング前にチャンク分割が必要な場合があります。
パラメータ
サンプリングパラメータはトークン生成プロセスを制御します。BazaarLinkはサポートされているパラメータをアップストリームプロバイダーに渡し、サポートされていないパラメータは黙って無視されます。
サンプリングパラメータ
BazaarLink専用パラメータ
クレジット
現在のクレジット残高と累計 API 使用量を照会。
/api/v1/creditsリクエスト例
curl https://bazaarlink.ai/api/v1/credits \
-H "Authorization: Bearer sk-bl-YOUR_KEY"レスポンス
{
"data": {
"total_credits": 100.00,
"total_usage": 12.34
}
}エラー:401(キー無効/欠落)、403(停止中のユーザー)。
生成詳細
generation ID による単一完了の詳細統計を取得(chat/completions レスポンスの id、またはストリームの x-bz-gen-id ヘッダから)。
/api/v1/generation?id=<generation-id>リクエスト例
curl "https://bazaarlink.ai/api/v1/generation?id=gen_abc123" \
-H "Authorization: Bearer sk-bl-YOUR_KEY"レスポンス
エラー:400(id 欠落)、401(auth)、404(generation が見つかりません)。
API キー情報
現在の API キーの rate limit 階層と集計使用量カウンタを照会(レスポンス形式は業界標準のキー情報 API に準拠)。
/api/v1/keyレスポンス
エラー:401(auth)、404(ユーザーなし — まれ)。
エージェント登録
AI エージェント(ボット、自律システム)のセルフサービス登録。試用クレジット付き API キーとアカウントアップグレード用の claim token を返します。
/api/v1/agents/registerリクエストボディ
リクエスト例
curl -X POST https://bazaarlink.ai/api/v1/agents/register \
-H "content-type: application/json" \
-d '{
"name": "My Agent",
"description": "Autonomous research bot"
}'レスポンス
エラー:400(body 無効/name 欠落)、429(rate limit — 1/IP/24h)、500(内部エラー)。
エラーコード
Error response format
Model inference endpoints return an OpenAI-compatible error envelope. The type field can vary or be omitted; use the HTTP status and error.code instead of parsing the message.
{
"error": {
"message": "Insufficient credits. Please top up to continue.",
"type": "invalid_request_error",
"code": "insufficient_credits"
}
}HTTP status and error.code
Before streaming, the HTTP status identifies the broad failure class. error.code is either that number or a stable string for a specific remedy. Prefer the string code when present, otherwise use the HTTP status.
Machine-readable billing codes
A 402 can represent different controls. Use these stable codes to choose the correct action.
Stable error.code catalog
These string codes are emitted by public inference and media paths. Branch on the string code when present; the HTTP status remains the broad failure class.
Rate limits, budgets, and emergency brakes
These controls can reject an otherwise valid request and require different recovery actions.
Compatibility note: rate-limit and emergency-brake paths currently emit numeric error.code values. Use HTTP status, Retry-After, and the documented response message.
Video and media resource state
Video validation commonly returns numeric code 400. Missing jobs return 404, retired models 410, unfinished video content 409, and invalid video byte ranges 416.
Retry policy
Retry only failures that may recover without changing the request. Honor Retry-After or use exponential backoff with jitter. Do not stack SDK and manual retries.
エラー処理
ストリーミングエラー形式
トークンがストリーミングされる前に発生したエラーは、JSONボディを持つ標準のHTTPエラーレスポンスを返します。
After a stream starts, the HTTP response is already 200. Parse each SSE data frame and treat a top-level error or choices[0].finish_reason === "error" as a failed, incomplete response.
ストリームが途中で失敗した場合、BazaarLink はトップレベルの error オブジェクトを含む最後のSSEイベントを送信し、その後に data: [DONE] が続きます。一部のアップストリームからそのまま転送されるチャンクでは、エラーが choice 側に載ることがあります(choices[0].finish_reason === "error")— 両方に対応してください。
バージョニング
BazaarLink は単一の安定した API パス /api/v1 を公開しています — 日付固定のバージョンやバージョンヘッダーを管理する必要はありません。API は番号付きリリースではなく、継続的に進化します。
非破壊的変更
以下は事前通知なしにリリースされます:
- 新しいエンドポイント
- カタログへの新しいモデルの追加
- 新しい任意のリクエストパラメータ
- 新しいレスポンスフィールド
- 任意プロパティを持つ新しいスキーマ
- 追加のレスポンスステータス/エラーコード
破壊的変更
これらは稀で、以下を含みます:
- エンドポイント/パラメータ/レスポンスフィールドの削除や名称変更
- フィールドの型変更
- 任意パラメータの必須化
発生した場合も、破壊的変更は /api/v1 全体ではなく特定のエンドポイントに限定されます — すべての連携を一度に壊すような単一のバージョン切り替えはありません。Breaking タグ付きの正式な changelog はまだ公開していません(下記「最新情報の入手」参照)— 連携にとって重要な部分については、ドキュメント化されていない挙動に依存する前に Support までご連絡ください。
廃止ポリシー
想定しておくべき唯一の定常的な「破壊的」イベントは、アップストリームプロバイダーが廃止した個々のモデルが引退することです。モデルの現在のステータスは GET /api/v1/models で確認できます。
GET https://bazaarlink.ai/api/v1/models
Authorization: Bearer sk-bl-YOUR_API_KEY
# A model within 30 days of its deprecation date shows in the catalog
# with an "EOL" badge on the Models page. After the effective date it's
# dropped from the catalog and calls return:
# 410 { "error": { "type": "model_not_available", "code": "model_retired" } }最新情報の入手
専用の API changelog や RSS フィードはまだ公開していません。現時点では、このページを直接ご確認いただくか、GET /api/v1/models でモデルのステータスを確認するか、重要な連携で事前通知が必要な場合は Support までご連絡ください。