BazaarLinkBazaarLink
Masuk
DokumentasiReferensi APIReferensi SDKPenggunaan AgentikSkill AI

Referensi API

Ikhtisar API BazaarLink

BazaarLink menyediakan format permintaan dan respons terpadu yang kompatibel dengan OpenAI untuk berbagai model dan penyedia. Integrasikan sekali, lalu ganti model tanpa menulis ulang aplikasi.

Kolom perutean pelanggan diabaikan
provider (seluruh objek), transforms, route, service_tier tingkat teratas, dan preset dihapus sebelum permintaan diteruskan sehingga tidak dapat memilih upstream atau tingkat harga. Pada endpoint Chat Completions dan Responses, array models didukung sebagai daftar fallback lokal: BazaarLink merutekan setiap model sendiri dan mengenakan harga pelanggan untuk model tersebut; daftar ini tidak diteruskan ke upstream. Akhiran :nitro, :floor, dan :exacto yang dikirim pelanggan diabaikan. :eco tetap menjadi tier ekonomi BazaarLink dan dipetakan secara internal ke BazaarLink :floor. :free tetap menjadi varian model katalog tersendiri.
Biaya tambahan pencarian web
Perilaku pencarian web yang diminta melalui plugins, :online, atau web_search_options tetap sama dan dapat menimbulkan biaya tambahan upstream. Biaya dibebankan ke kunci yang digunakan untuk permintaan: kunci platform BazaarLink atau kunci BYOK Anda.

Spesifikasi OpenAPI

API BazaarLink lengkap didokumentasikan dengan spesifikasi OpenAPI dalam format YAML dan JSON:

Gunakan spesifikasi ini dengan Swagger UI, Postman, atau generator kode yang kompatibel dengan OpenAPI untuk menjelajahi API atau membuat pustaka klien.

Permintaan

Format Permintaan Chat Completions

Isi permintaan chat completions dikirim ke endpoint berikut:

POST/v1/chat/completions

Untuk daftar lengkap bidang yang didukung, lihat Parameter。

Skema Permintaan
// Definitions of subtypes are below
type Request = {
  // Required by BazaarLink Chat Completions
  model: string;                    // Use an id or alias from GET /v1/models
  messages: Message[];             // Must contain at least one message

  // Generation
  stream?: boolean;
  temperature?: number;
  max_tokens?: number;             // Positive integer
  max_completion_tokens?: number;  // Alias mapped to max_tokens upstream
  n?: number;
  seed?: number;
  stop?: string | string[];

  // Sampling
  top_p?: number;
  top_k?: number;
  frequency_penalty?: number;
  presence_penalty?: number;
  repetition_penalty?: number;
  min_p?: number;
  top_a?: number;
  // Sampling values are forwarded without range validation; models may clamp or ignore them.

  // Token probabilities
  logit_bias?: Record<number, number>;
  logprobs?: boolean;
  top_logprobs?: number;

  // Stable end-user identifier for abuse prevention
  user?: string;

  // Tool calling
  tools?: Tool[];
  tool_choice?: ToolChoice;
  parallel_tool_calls?: boolean;

  // Structured output
  response_format?: ResponseFormat;
  structured_outputs?: boolean;

  // Plugin configuration — forwarded to upstreams that support plugins.
  plugins?: Plugin[];

  // Multimodal and image-generation options
  modalities?: Array<"text" | "image">;
  image_config?: Record<string, unknown>;
  input_audio?: InputAudio;

  // Provider-specific reasoning controls
  reasoning_effort?: "low" | "medium" | "high";
  include_reasoning?: boolean;
  reasoning?: ReasoningConfig;
  thinking?: ThinkingConfig;
  enable_thinking?: boolean;

};

// Message types
type Message =
  | SystemMessage
  | UserMessage
  | AssistantMessage
  | ToolMessage;

type SystemMessage = {
  role: "system";
  content: string | ContentPart[];
  name?: string;
};

type UserMessage = {
  role: "user";
  content: string | ContentPart[];
  name?: string;
};

type AssistantMessage = {
  role: "assistant";
  content?: string | ContentPart[] | null;
  name?: string;
  tool_calls?: ToolCall[];
};

type ToolMessage = {
  role: "tool";
  content: string;
  tool_call_id: string;
  name?: string;
};

// Multimodal content parts
type ContentPart =
  | TextContentPart
  | ImageContentPart
  | FileContentPart
  | AudioContentPart
  | VideoContentPart;

type TextContentPart = {
  type: "text";
  text: string;
};

type ImageContentPart = {
  type: "image_url";
  image_url: {
    url: string;                    // Remote URL or base64 data URI
    detail?: string;
  };
};

type FileContentPart = {
  type: "file";
  file: {
    filename?: string;
    file_data: string;              // Base64 data URI
  };
};

type AudioContentPart = {
  type: "input_audio";
  input_audio: InputAudio;
};

type InputAudio = {
  data: string;                     // Raw base64 without a data URI prefix
  format: string;                   // For example "wav" or "mp3"
};

type VideoContentPart = {
  type: "video_url";
  video_url: {
    url: string;                    // Remote URL or base64 data URI
  };
};

// Tool calling subtypes
type FunctionDescription = {
  name: string;
  description?: string;
  parameters: object;               // JSON Schema object
};

type Tool = {
  type: "function";
  function: FunctionDescription;
};

type ToolChoice =
  | "none"
  | "auto"
  | "required"
  | {
      type: "function";
      function: {
        name: string;
      };
    };

type ToolCall = {
  id: string;
  type: "function";
  function: {
    name: string;
    arguments: string;
  };
};

// Structured output
type ResponseFormat =
  | {
      type: "json_object";
    }
  | {
      type: "json_schema";
      json_schema: {
        name: string;
        strict?: boolean;
        schema: object;
      };
    };

// Upstream plugin configuration
type Plugin = {
  id: string;
  enabled?: boolean;
  [key: string]: unknown;
};

// Reasoning controls vary by model family
type ReasoningConfig = {
  effort?: "low" | "medium" | "high";
  max_tokens?: number;
  exclude?: boolean;
};

type ThinkingConfig = {
  type?: "enabled" | "disabled";
  budget_tokens?: number;
};

Output Terstruktur

Paksa model mengembalikan JSON valid yang cocok dengan skema. Ini penting untuk membangun aplikasi andal yang mem-parse output model secara programatik.

  • json_object — mode JSON dasar; model mengembalikan JSON yang valid.
  • json_schema — mode skema ketat; keluaran harus cocok dengan JSON Schema yang diberikan.

Plugin

BazaarLink meneruskan array plugins ke rute upstream yang dipilih. Ketersediaan bergantung pada model dan penyedia; varian model :online juga mengaktifkan plugin web.

JSON
{
  "model": "openai/gpt-4o",
  "messages": [
    { "role": "user", "content": "What happened today?" }
  ],
  "plugins": [
    { "id": "web" }
  ]
}

Header Opsional

Identifikasi aplikasi Anda di header permintaan untuk mengaktifkan pelacakan penggunaan, visibilitas dasbor, dan analitik terperinci.

TypeScript
await fetch("https://api.bazaarlink.ai/v1/chat/completions", {
  method: "POST",
  headers: {
    "Authorization": "Bearer <BAZAARLINK_API_KEY>",
    "Content-Type": "application/json",
    "HTTP-Referer": "https://your-app.example",
    "X-Title": "Your App"
  },
  body: JSON.stringify({
    model: "openai/gpt-4o",
    messages: [{ role: "user", content: "Hello!" }]
  })
});

AAsisten Prefill

Tambahkan pesan assistant yang belum selesai sebagai item terakhir untuk meminta kelanjutan pada rute model yang kompatibel.

Cara kerjanya
BazaarLink mempertahankan dan meneruskan pesan assistant terakhir. Perilaku kelanjutan diterapkan oleh model dan penyedia upstream yang dipilih, sehingga tidak dijamin pada setiap rute.
TypeScript
const response = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-4.6",
  messages: [
    { role: "user", content: "What is the meaning of life?" },
    // Intentional partial response; compatible routes continue from here.
    { role: "assistant", content: "My best answer is" }
  ]
});

Respons

BazaarLink menormalkan respons completion dari berbagai model dan penyedia ke satu format yang kompatibel dengan OpenAI.

Format Respons Completion

choices selalu berupa array. Respons streaming memakai delta, sedangkan non-streaming memakai message. Detail penggunaan dan biaya dikembalikan jika tersedia.

Skema Respons
type Response = {
  id: string;
  object: "chat.completion" | "chat.completion.chunk";
  created: number;
  model: string;
  choices: Array<NonStreamingChoice | StreamingChoice>;
  usage?: {
    prompt_tokens: number;
    completion_tokens: number;
    total_tokens: number;
    cost?: number;
    prompt_tokens_details?: {
      cached_tokens: number;
      cache_write_tokens?: number;
      audio_tokens?: number;
    };
    completion_tokens_details?: {
      reasoning_tokens?: number;
      image_tokens?: number;
    };
  };
};

type NonStreamingChoice = {
  index: number;
  finish_reason: string | null;
  message: {
    role: "assistant";
    content: string | null;
    tool_calls?: ToolCall[];
    reasoning?: string;                                      // thinking text: when the request asked for it, or by default for the models listed in the reasoning docs section
    reasoning_details?: Array<{ type: string; text?: string }>;
  };
};

type StreamingChoice = {
  index: number;
  finish_reason: string | null;
  delta: {
    role?: string;
    content?: string | null;
    tool_calls?: ToolCall[];
    reasoning?: string;
    reasoning_details?: Array<{ type: string; text?: string }>;
  };
};

Alasan Selesai

finish_reason memakai nilai standar BazaarLink seperti stop, length, tool_calls, content_filter, dan error.

JSON
{
  "finish_reason": "stop"
}

Meminta Biaya dan Statistik

Gunakan ID permintaan BazaarLink yang buram dari id respons atau header x-request-id pada GET /v1/generation; respons non-streaming juga menyertakan ID itu di x-generation-id. Statistik dapat muncul beberapa detik setelah selesai; coba lagi sebentar jika mendapat 404.

TypeScript
const generation = await fetch(
  "https://api.bazaarlink.ai/v1/generation?id=<GENERATION_ID>",
  {
    headers: {
      Authorization: "Bearer <BAZAARLINK_API_KEY>"
    }
  }
).then((response) => response.json());

Pendaftaran agen

Saat diaktifkan, agen dapat membuat akun melalui jalur pendaftaran tanpa pembayaran atau berbayar x402.

POSThttps://api.bazaarlink.ai/api/v1/agents/register

Pendaftaran tanpa pembayaran menerima name, description opsional, dan referral_code opsional. Respons 201 berisi API key, kredit, claim token dan masa berlaku tujuh hari, URL upgrade, kode rujukan, free_model auto:free, base URL, serta tautan dokumentasi. Mekanisme model gratis yang ada digunakan; pencarian web gratis memerlukan email terverifikasi sehingga tidak tersedia untuk agen tanpa pembayaran.

POSThttps://api.bazaarlink.ai/api/v1/agents/register/x402

Pendaftaran berbayar dimulai dengan persyaratan HTTP 402: scheme exact, network eip155:196, asset USD-T0, dan payTo. Kirim ulang dengan header X-PAYMENT untuk menerima field pendaftaran yang sama ditambah payment { txHash, network, amountUsd }. Agen berbayar mengikuti aturan akun berbayar biasa; akun yang ada dapat melakukan top-up di /api/x402/topup.

Manusia dapat mengambil alih agen tanpa pembayaran di /claim selama token berlaku tujuh hari. Pendaftaran dibatasi satu kali per IP dalam 24 jam dan batas penyedia cloud; permintaan yang ditolak mengembalikan 429 dengan Retry-After.

POSThttps://api.bazaarlink.ai/api/x402/topup

Chat Completions Versi

Endpoint utama. Kompatibel dengan OpenAI Chat Completions API.

POST/v1/chat/completions

Body Permintaan

modelwajib
string
Gunakan id atau alias yang tercantum di GET /v1/models, seperti "claude-sonnet-4.6" atau "anthropic/claude-sonnet-4.6".
messageswajib
Message[]
Array objek pesan dengan role dan content
stream
boolean
Jika true, mengembalikan stream Server-Sent Events. Default: false
temperature
number
Nilai sampling diteruskan tanpa validasi rentang. Model dapat membatasi atau mengabaikan nilai di luar rentang yang didukung.
max_tokens
integer
Jumlah maksimum token yang dihasilkan
max_completion_tokens
integer
Alias untuk max_tokens (kompatibel OpenAI o-series). Keduanya diterima; yang mana pun yang disediakan berlaku
top_p
number
Massa probabilitas sampling nukleus. Default: 1
top_k
integer
Nilai sampling diteruskan tanpa validasi rentang. Model dapat membatasi atau mengabaikan nilai di luar rentang yang didukung.
frequency_penalty
number
Penalti token berulang. Rentang: [-2, 2]. Default: 0
presence_penalty
number
Penalti token berdasarkan kehadiran. Rentang: [-2, 2]. Default: 0
repetition_penalty
number
Kurangi pengulangan token dari input. Rentang: (0, 2]. Default: 1
min_p
number
Probabilitas minimum relatif terhadap token teratas. Rentang: [0, 1]. Default: 0
top_a
number
Top-P dinamis berdasarkan token probabilitas tertinggi. Rentang: [0, 1]. Default: 0
seed
integer
Seed integer untuk sampling deterministik. Tidak dijamin untuk semua model
n
integer
Jumlah completion yang dihasilkan. Default: 1
user
string
Pengidentifikasi pengguna akhir untuk pemantauan dan deteksi penyalahgunaan. Tidak berpengaruh pada tagihan. Hanya model keluarga OpenAI — lihat catatan di bawah.
stop
string | string[]
Urutan berhenti — generasi berhenti saat ditemukan
logit_bias
object
Peta ID token ke nilai bias [-100, 100] yang ditambahkan sebelum sampling. Hanya model keluarga OpenAI — lihat catatan di bawah.
logprobs
boolean
Kembalikan probabilitas log dari setiap token output. Hanya model keluarga OpenAI — lihat catatan di bawah.
top_logprobs
integer
Jumlah token paling mungkin per posisi (memerlukan logprobs: true). Rentang: 0–20. Hanya model keluarga OpenAI — lihat catatan di bawah.
tools
Tool[]
Daftar tools (fungsi) yang dapat dipanggil model
tool_choice
string | object
Mengontrol penggunaan tool: "auto", "none", atau tool tertentu
parallel_tool_calls
boolean
Aktifkan pemanggilan fungsi paralel saat tools disediakan. Default: true. Hanya model keluarga OpenAI — lihat catatan di bawah.
response_format
object
Paksa output JSON terstruktur. Lihat bagian Output Terstruktur
structured_outputs
boolean
Meminta output yang sesuai skema JSON secara ketat pada penyedia yang mendukungnya. Diteruskan apa adanya
reasoning
object
Konfigurasi reasoning/thinking spesifik penyedia. Diteruskan apa adanya
reasoning_effort
string
Tingkat upaya reasoning gaya OpenAI seri-o: "low", "medium", atau "high". Diteruskan apa adanya
include_reasoning
boolean
true mengembalikan isi pemikiran di message.reasoning (delta.reasoning saat streaming); false mematikan pemikiran untuk model yang berpikir secara default (lihat bagian reasoning), sehingga tidak ada pemikiran yang ditagih. Tanpa reasoning_effort, reasoning, atau thinking, hanya model-model itu yang berpikir dan mengembalikannya secara default; model lain hanya jika diminta
user, logprobs, top_logprobs, logit_bias, dan parallel_tool_calls hanya sampai ke model keluarga OpenAI
Kelima parameter ini dihapus dari permintaan upstream setiap kali model yang di-resolve bukan dikenali sebagai milik OpenAI sendiri — mengirimkannya ke anthropic/claude-*, google/gemini-*, atau target non-OpenAI lainnya mengembalikan 200 dengan parameter diabaikan secara diam-diam, bukan error. Jika Anda mengatur salah satu parameter ini dan efeknya tidak muncul, periksa apakah model target adalah milik OpenAI.

Skema Permintaan (TypeScript)

// Definitions of subtypes are below
type Request = {
  // Required by BazaarLink Chat Completions
  model: string;                    // Use an id or alias from GET /v1/models
  messages: Message[];             // Must contain at least one message

  // Generation
  stream?: boolean;
  temperature?: number;
  max_tokens?: number;             // Positive integer
  max_completion_tokens?: number;  // Alias mapped to max_tokens upstream
  n?: number;
  seed?: number;
  stop?: string | string[];

  // Sampling
  top_p?: number;
  top_k?: number;
  frequency_penalty?: number;
  presence_penalty?: number;
  repetition_penalty?: number;
  min_p?: number;
  top_a?: number;
  // Sampling values are forwarded without range validation; models may clamp or ignore them.

  // Token probabilities
  logit_bias?: Record<number, number>;
  logprobs?: boolean;
  top_logprobs?: number;

  // Stable end-user identifier for abuse prevention
  user?: string;

  // Tool calling
  tools?: Tool[];
  tool_choice?: ToolChoice;
  parallel_tool_calls?: boolean;

  // Structured output
  response_format?: ResponseFormat;
  structured_outputs?: boolean;

  // Plugin configuration — forwarded to upstreams that support plugins.
  plugins?: Plugin[];

  // Multimodal and image-generation options
  modalities?: Array<"text" | "image">;
  image_config?: Record<string, unknown>;
  input_audio?: InputAudio;

  // Provider-specific reasoning controls
  reasoning_effort?: "low" | "medium" | "high";
  include_reasoning?: boolean;
  reasoning?: ReasoningConfig;
  thinking?: ThinkingConfig;
  enable_thinking?: boolean;

};

// Message types
type Message =
  | SystemMessage
  | UserMessage
  | AssistantMessage
  | ToolMessage;

type SystemMessage = {
  role: "system";
  content: string | ContentPart[];
  name?: string;
};

type UserMessage = {
  role: "user";
  content: string | ContentPart[];
  name?: string;
};

type AssistantMessage = {
  role: "assistant";
  content?: string | ContentPart[] | null;
  name?: string;
  tool_calls?: ToolCall[];
};

type ToolMessage = {
  role: "tool";
  content: string;
  tool_call_id: string;
  name?: string;
};

// Multimodal content parts
type ContentPart =
  | TextContentPart
  | ImageContentPart
  | FileContentPart
  | AudioContentPart
  | VideoContentPart;

type TextContentPart = {
  type: "text";
  text: string;
};

type ImageContentPart = {
  type: "image_url";
  image_url: {
    url: string;                    // Remote URL or base64 data URI
    detail?: string;
  };
};

type FileContentPart = {
  type: "file";
  file: {
    filename?: string;
    file_data: string;              // Base64 data URI
  };
};

type AudioContentPart = {
  type: "input_audio";
  input_audio: InputAudio;
};

type InputAudio = {
  data: string;                     // Raw base64 without a data URI prefix
  format: string;                   // For example "wav" or "mp3"
};

type VideoContentPart = {
  type: "video_url";
  video_url: {
    url: string;                    // Remote URL or base64 data URI
  };
};

// Tool calling subtypes
type FunctionDescription = {
  name: string;
  description?: string;
  parameters: object;               // JSON Schema object
};

type Tool = {
  type: "function";
  function: FunctionDescription;
};

type ToolChoice =
  | "none"
  | "auto"
  | "required"
  | {
      type: "function";
      function: {
        name: string;
      };
    };

type ToolCall = {
  id: string;
  type: "function";
  function: {
    name: string;
    arguments: string;
  };
};

// Structured output
type ResponseFormat =
  | {
      type: "json_object";
    }
  | {
      type: "json_schema";
      json_schema: {
        name: string;
        strict?: boolean;
        schema: object;
      };
    };

// Upstream plugin configuration
type Plugin = {
  id: string;
  enabled?: boolean;
  [key: string]: unknown;
};

// Reasoning controls vary by model family
type ReasoningConfig = {
  effort?: "low" | "medium" | "high";
  max_tokens?: number;
  exclude?: boolean;
};

type ThinkingConfig = {
  type?: "enabled" | "disabled";
  budget_tokens?: number;
};

Contoh Permintaan

curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o",
    "messages": [
      {"role": "system", "content": "You are a helpful assistant."},
      {"role": "user", "content": "Explain quantum computing in one paragraph."}
    ],
    "temperature": 0.7,
    "max_tokens": 512
  }'

Respons

{
  "id": "85e6f35c71a31f19-SJC",
  "object": "chat.completion",
  "created": 1740000000,
  "model": "openai/gpt-4o",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Quantum computing leverages quantum mechanics..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 28,
    "completion_tokens": 74,
    "total_tokens": 102,
    "cost": 0.0006480,
    "prompt_tokens_details": {
      "cached_tokens": 0
    },
    "completion_tokens_details": {
      "reasoning_tokens": 0
    }
  }
}

Skema Respons (TypeScript)

BazaarLink mengembalikan respons terstandar dan menghapus field khusus upstream. usage.cost adalah jumlah USD yang ditagihkan kepada pelanggan untuk permintaan ini.

Untuk permintaan yang lebih panjang dari 100 detik, sebaiknya gunakan stream:true. Untuk permintaan non-streaming, setelah sekitar 12 detik (nilai default yang dapat disesuaikan melalui pengaturan deployment), respons terlebih dahulu mengembalikan 200 dan mulai mengirim whitespace keepalive; jika kemudian terjadi kesalahan, kesalahan tersebut dikembalikan sebagai 200 + error JSON. Keepalive berupa whitespace sebelum body JSON, yang diabaikan oleh parser JSON standar.

type Response = {
  id: string;
  object: "chat.completion" | "chat.completion.chunk";
  created: number;                 // Unix timestamp
  model: string;
  choices: (NonStreamingChoice | StreamingChoice)[];
  usage?: ResponseUsage;
};

type NonStreamingChoice = {
  index: number;
  finish_reason: "stop" | "length" | "tool_calls" | "content_filter" | null;
  message: {
    role: "assistant";
    content: string | null;
    tool_calls?: ToolCall[];
    reasoning?: string;                                      // thinking text: when the request asked for it, or by default for the models listed in the reasoning docs section
    reasoning_details?: Array<{ type: string; text?: string }>;
  };
};

type StreamingChoice = {
  index: number;
  finish_reason: string | null;
  delta: {
    role?: string;
    content?: string | null;
    tool_calls?: ToolCall[];
    reasoning?: string;
    reasoning_details?: Array<{ type: string; text?: string }>;
  };
};

type ResponseUsage = {
  prompt_tokens: number;
  completion_tokens: number;
  total_tokens: number;
  cost: number;                      // USD amount charged to the customer for this request
  prompt_tokens_details?: {
    cached_tokens: number;           // Tokens served from prompt cache (reduced cost)
    cache_write_tokens?: number;     // Tokens written to cache in this request
    audio_tokens?: number;
  };
  completion_tokens_details?: {
    reasoning_tokens?: number;       // Thinking/reasoning tokens (e.g. o3, Qwen3, DeepSeek R1)
    image_tokens?: number;
  };
};

type ToolCall = {
  id: string;
  type: "function";
  function: { name: string; arguments: string };
};

Pembuatan Gambar

Hasilkan gambar dari prompt teks menggunakan model seperti DALL·E dan GPT-4o. Gunakan parameter `modalities` untuk meminta output gambar dari endpoint chat completions. Pengeditan gambar (memodifikasi gambar yang sudah ada) menggunakan POST /v1/images/edits —— kompatibel dengan OpenAI images.edit, multipart/form-data dengan gambar sumber Anda. Model yang mendukung pengeditan memiliki modality text+image->image (mis. qwen/qwen-image-3); model murni-generasi adalah text->image —— periksa modality tiap model di GET /v1/models.

Response format

/v1/images/generations secara default mengembalikan JSON sinkron kompatibel OpenAI (sejak 2026-07-25) — client.images.generate() berfungsi tanpa wrapper. Kirim stream: true untuk beralih ke aliran event SSE, yang memberikan progres untuk model dengan waktu pembuatan lama.

Permintaan non-streaming yang berjalan lebih dari 20 detik dijawab lebih dulu dengan HTTP 200 (lalu spasi dikirim untuk menjaga koneksi), sehingga kegagalan yang muncul belakangan dikembalikan sebagai "200 dengan isi error": periksa objek `error` tingkat atas (kami juga menambahkan `"object": "error"` dan `"http_status"`). Jika batas waktu baca klien Anda panjang (SDK OpenAI memakai default 10 menit), kirim `X-BazaarLink-Sync-Wait: 90` (detik bulat, 1–90, default 20) agar kegagalan hingga waktu tersebut mendapat kode status yang sebenarnya; di SDK Python gunakan `default_headers={"X-BazaarLink-Sync-Wait": "90"}`, di SDK Node `defaultHeaders: { "X-BazaarLink-Sync-Wait": "90" }`. Di Windows, kirim JSON dari berkas UTF-8 dengan `curl --data-binary @body.json`: teks yang diketik setelah `-d` di konsol bukan UTF-8 dan langsung ditolak dengan 400 `invalid_utf8`.

A. /v1/chat/completions (native, direkomendasikan)

POST/v1/chat/completions

The canonical streaming path. Recommended for any new integration.

curl -N https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-5.4-image-2",
    "messages": [{"role":"user","content":"a red cat on a sofa"}],
    "modalities": ["image","text"],
    "stream": true
  }'

Image-to-image: sertakan bagian image_url dalam array content. Mendukung data URI atau URL gambar https (http:// ditolak), hingga 8 gambar, ~10MB per data URI. Pesan yang membawa gambar juga harus menyertakan bagian teks (instruksi penyuntingan). Beberapa model juga mendukung image_config (mis. {"strength": 0.7}, 0–1 — nilai lebih rendah lebih mendekati gambar sumber), diteruskan ke upstream apa adanya.

curl -N https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-5.4-image-2",
    "messages": [{"role":"user","content":[
      {"type":"image_url","image_url":{"url":"data:image/png;base64,..."}},
      {"type":"text","text":"change the background to a night city"}
    ]}],
    "modalities": ["image"],
    "stream": true
  }'

Penyuntingan Gambar (kompatibel OpenAI)

POST/v1/images/edits

client.images.edit() dari OpenAI SDK berfungsi langsung (unggahan multipart, respons JSON sinkron yang mengembalikan data: [{ url }]). Batas sama dengan image-to-image: hingga 8 gambar, 10MB per gambar; mask dan response_format=b64_json belum didukung.

curl https://api.bazaarlink.ai/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 (kompatibel DALL·E)

POST/v1/images/generations

OpenAI 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.

curl https://api.bazaarlink.ai/v1/images/generations \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-image-1",
    "prompt": "a red cat on a sofa",
    "size": "1024x1024"
  }'
modelwajib
string
ID model, misalnya google/gemini-2.5-flash-image
promptwajib
string
Prompt teks
size
string
Ukuran keluaran (dipetakan otomatis)
n
integer
Jumlah gambar (default 1)
# Streaming variant — progressive delivery for long generations
curl -N https://api.bazaarlink.ai/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

Abaikan baris komentar SSE dan event unknown atau ping; tangani event image, usage, dan done yang didokumentasikan.

: keep-alive

event: image
data: {"index": 0, "url": "https://api.bazaarlink.ai/v1/images/proxy/<token>"}

event: image-cached     # bazaarlink Redis-backed proxy URL (1 hr TTL)
data: {"index": 0, "url": "https://api.bazaarlink.ai/v1/images/proxy/<token>"}

event: usage            # final cost / token count
data: {"promptTokens": 12, "completionTokens": 7080, "cost": 0.226, "durationMs": 163400, "imageCount": 1}

event: done
data: {}

Model gambar yang didukung

Model IDModalityi2i (edits)

Pembuatan Video

Alur asinkron tiga langkah (submit → poll → content). Pembuatan video memakan waktu 30 detik–5 menit, sehingga tidak cocok dengan semantik permintaan/respons sinkron chat-completions — karena itu BazaarLink memisahkan video ke jalur /v1/videos dengan pola job-id: submit mengembalikan ID vjob_* → poll status → ambil bytes setelah selesai. Memanggil model video lewat /chat/completions atau /images/generations akan mengembalikan 400 (code: wrong_endpoint_for_video). Biaya diselesaikan berdasarkan usage.cost aktual saat completed.

Jenis tugas video

Satu endpoint mencakup beberapa tugas. Tugas mana yang berjalan ditentukan oleh field yang Anda kirim —— satu model bisa melakukan image-to-video, keyframe, dan lanjutan. Tidak semua model mendukung setiap tugas; permintaan yang tidak didukung mengembalikan 400.

Teks-ke-video
prompt
Menghasilkan hanya dari prompt teks — tanpa media masukan.
Gambar-ke-video
frame_images: [ first frame ]
Gambar Anda ADALAH gambarnya: menjadi frame pertama dan dianimasikan, tetap setia pada aslinya. Mis. foto seekor kucing → kucing yang sama menoleh di adegan yang sama.
Keyframe (pertama + terakhir)
frame_images: [ first, last ]
Berikan gambar awal dan gambar akhir; model menginterpolasi gerakan di antaranya.
Lanjutan
input_video
Memperpanjang klip yang sudah ada. Durasi yang diminta harus lebih besar dari panjang video sumber.
Referensi-ke-video
input_references: [ images ]
Gambar Anda adalah REFERENSI, bukan frame: model mempertahankan subjek/gaya dan menghasilkan adegan yang benar-benar baru. Mis. foto kucing + "menari di hutan" → video baru di mana tampilan kucing dipertahankan tetapi adegan dan gerakannya baru (1–9 referensi). Bedanya dengan gambar-ke-video: i2v tetap setia pada gambar persisnya; r2v menampilkan ulang subjek ke dalam rekaman baru.
Pengeditan video
input_video + prompt
Mengedit video yang sudah ada — mengubah adegan, gaya, atau gerakan. Ditagih berdasarkan detik video masukan + detik keluaran.

1. Kirim job (langsung mengembalikan vjob_xxx)

POST/v1/videos
modelwajib
string
ID model, misalnya bytedance/seedance-2.0
promptwajib
string
Prompt teks
duration
integer
Durasi dalam detik (tergantung model)
resolution
string
Resolusi: 480p / 720p / 1080p dll.
generate_audio
boolean
Hasilkan trek audio (true/false)
frame_images
array
Gambar frame pertama/terakhir (image-to-video, keyframe). Objek { type: "image_url", image_url: { url }, frame_type: "first_frame" | "last_frame" } atau string URL biasa.
input_references
array
Gambar referensi untuk reference-to-video —— panduan subjek/gaya, bukan frame persis.
input_video
string|object
URL video sumber untuk lanjutan dan pengeditan video. Harus dapat diambil secara publik oleh upstream.
aspect_ratio
string
Rasio aspek, mis. 16:9 atau 9:16. Diabaikan bila gambar input menentukan rasionya.
watermark
boolean
Menambahkan watermark. Default false.
callback_url
string
URL webhook yang dipanggil saat job mencapai status akhir — hanya HTTPS, diperiksa SSRF. Tidak ada tanda tangan di v1; perlakukan sebagai petunjuk dan konfirmasi via GET /videos/{id}.
curl https://api.bazaarlink.ai/v1/videos \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "bytedance/seedance-2.0",
    "prompt": "a bird flying over mountains",
    "duration": 3,
    "resolution": "720p",
    "generate_audio": false
  }'
# → 202 { "id": "vjob_xxx", "status": "pending" }
Note
Kredit dicadangkan saat submit berdasarkan estimasi skenario terburuk. Setelah job selesai, usage.cost adalah jumlah USD yang ditagihkan kepada pelanggan.

2. Status jajak pendapat

GET/v1/videos/{id}
curl -H "Authorization: Bearer $BL_API_KEY" \
  https://api.bazaarlink.ai/v1/videos/vjob_xxx
Note
Setiap GET harus berjarak ≥ 8 detik agar benar-benar diteruskan ke upstream (menghindari rate limit).
Note
Jika status=failed, seluruh jumlah reserve dikembalikan ke pengguna.

3. Ambil konten video (MP4)

GET/v1/videos/{id}/content
curl -H "Authorization: Bearer $BL_API_KEY" \
  -o output.mp4 \
  https://api.bazaarlink.ai/v1/videos/vjob_xxx/content

Perlu diketahui

  • Resolusi yang diizinkan berbeda per model —— nilai yang tidak didukung mengembalikan 400 beserta daftar yang didukung.
  • Gambar/video input harus dapat dijangkau dari URL publik. Host yang dilindungi hotlink (mis. beberapa wiki) akan gagal.
  • Media input melewati moderasi konten upstream dan sesekali dapat ditolak.
  • Untuk lanjutan, durasi yang diminta harus melebihi panjang video sumber.
  • Rasio aspek output mengikuti gambar input —— gambar persegi menghasilkan video persegi.
  • Pengeditan video ditagih berdasarkan detik video input ditambah detik output yang dihasilkan.
  • input_video (pengeditan / lanjutan) harus berupa URL PUBLIK. Video yang Anda hasilkan di sini disajikan di balik API key Anda, sehingga upstream tidak bisa mengambilnya —— host video sumber Anda di URL yang dapat diakses publik.
  • Payload webhook tidak ditandatangani — konfirmasi status/jumlah via GET /videos/{id} sebelum bertindak, dan perhatikan unsigned_urls di sana bersifat absolut (berbeda dari path relatif pada respons poll).

Model video yang didukung

Model IDModalityTasks
minimax/hailuo-3-maxtext+image->videot2v, i2v
google/veo-3.1text+image->videot2v, i2v
bytedance/seedance-2.5text+image+audio+video->video—
x-ai/grok-imagine-video-1.5-litetext+image->videot2v, i2v
bytedance/seedance-2.0text+image+audio+video->videot2v, i2v
bytedance/seedance-1-5-protext+image->videot2v, i2v
bytedance/seedance-2.0-fasttext+image+audio+video->videot2v, i2v

Sintesis suara

Ubah teks menjadi audio dengan ID model dari /v1/models?output_modalities=speech. Biaya mengikuti harga per juta karakter di halaman model. Seluruh audio ditampung dulu sebelum dikirim sebagai data biner; streaming bertahap belum didukung. Bidang kontrol perutean seperti provider, transforms, route, service_tier, dan preset diabaikan.

POST/v1/audio/speech
curl https://api.bazaarlink.ai/v1/audio/speech \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{"model":"<speech-model-id>","input":"Hello","voice":"alloy","response_format":"mp3"}' \
  --output speech.mp3

# Voice settings (elevenlabs/* models; the X-Voice-Settings response header says applied or ignored)
curl -D - https://api.bazaarlink.ai/v1/audio/speech \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{"model":"elevenlabs/eleven-v4","input":"Hello","voice":"george","stability":0.4,"similarity_boost":0.8,"style":0.2,"use_speaker_boost":true,"language_code":"en","audio_effects":{"distance":0.3}}' \
  --output speech.mp3

Transkripsi audio

Kirim multipart/form-data model dan file atau JSON model dan input_audio:{data,format} (base64 mentah). Format: wav, mp3, mp4, m4a, ogg, flac, webm, aac. Audio maksimal 25 MiB; isi permintaan 50 MiB untuk base64. audio.transcription_max_seconds_by_model mengatur batas per model; jika tidak ada, gunakan audio.transcription_max_seconds lalu bawaan 60 detik. Audio yang lebih panjang ditolak sebelum diproses dengan 413 audio_too_long dan tidak dikenai biaya. response_format hanya json atau verbose_json; timestamp_granularities word/segment perlu verbose_json. stream tidak didukung (400 unsupported_parameter); terlalu besar: 413 audio_too_large. provider diabaikan. Harga basis data per usage.seconds atau token masukan/keluaran; harga menit = 60 × harga detik. usage.cost adalah biaya pelanggan dalam USD.

POST/v1/audio/transcriptions
curl https://api.bazaarlink.ai/v1/audio/transcriptions \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -F model="<transcription-model-id>" \
  -F file=@audio.wav \
  -F response_format=json

curl https://api.bazaarlink.ai/v1/audio/transcriptions \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{"model":"<transcription-model-id>","input_audio":{"data":"<raw-base64-audio>","format":"wav"},"response_format":"verbose_json","timestamp_granularities":["word","segment"]}'

Pemeringkatan ulang dokumen

Kirim query dan documents untuk menerima index dan relevance_score terurut. Unit penagihan: search, dengan harga halaman model dikalikan usage.search_units, bukan jumlah dokumen. Streaming (stream) tidak didukung.

POST/v1/rerank
curl https://api.bazaarlink.ai/v1/rerank \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{"model":"your-rerank-model-id","query":"capital of France","documents":["Paris is the capital of France.","Berlin is in Germany."],"top_n":1}'
POST/v1/chat/completions

Gunakan audio atau input_audio pada /v1/chat/completions dengan model audio. Tarif token masukan/keluaran yang dikonfigurasi berlaku seragam pada seluruh token teks dan audio yang dilaporkan.

curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{"model":"<audio-chat-model-id>","messages":[{"role":"user","content":"Say hi."}],"stream":true,"modalities":["text","audio"],"audio":{"voice":"alloy","format":"pcm16"},"max_tokens":32}'

Panduan sintesis suara (TTS)

POST /v1/audio/speech bersifat OpenAI-compatible: kirim JSON dan terima berkas audio sebagai data biner. Keluarga ElevenLabs meliputi elevenlabs/eleven-v4, eleven-v4-turbo, eleven-v3, eleven-v3-conversational, eleven-multilingual-v2, eleven-flash-v2.5, eleven-flash-v2, eleven-turbo-v2.5, eleven-turbo-v2. Daftar terkini tersedia di GET /v1/models?output_modalities=speech. GET /v1/models secara bawaan hanya mengembalikan model teks, jadi tambahkan ?output_modalities=speech (atau all) untuk melihat daftarnya.

POST/v1/audio/speech

Parameter

ParameterTipeWajibDeskripsi
modelstringYaID model suara, misalnya elevenlabs/eleven-flash-v2.5.
inputstringYaTeks untuk disintesis: maksimal 4.096 karakter per permintaan (10.000 untuk elevenlabs/eleven-v4 dan eleven-v4-turbo). Pecah teks yang lebih panjang menjadi beberapa permintaan.
voicestringYaSuara yang digunakan; formatnya bergantung pada model. Lihat aturan suara di bawah.
response_formatstringTidakmp3 (bawaan) atau pcm. API menerima opus, aac, flac, dan wav, tetapi model ElevenLabs saat ini menolaknya dengan 400.
speednumberTidakKecepatan bicara dari 0.25 hingga 4.0. Tidak semua model menerapkannya.
instructionsstringTidakInstruksi gaya suara. Tidak semua model menerapkannya.
stabilitynumberTidakStabilitas suara, 0–1 (bawaan 0,5). Lebih rendah lebih ekspresif, lebih tinggi lebih datar. Berlaku pada model elevenlabs/* saat permintaan dilayani rute suara langsung kami; header respons X-Voice-Settings menunjukkan applied atau ignored.
similarity_boostnumberTidakKemiripan dengan suara asli, 0–1 (bawaan 0,75). Tidak dipakai oleh Eleven v3.
stylenumberTidakPenekanan gaya, 0–1 (bawaan 0). Di atas 0 menambah latensi. Tidak dipakai oleh Eleven v4.
use_speaker_boostbooleanTidakMeningkatkan kemiripan dengan pembicara asli (bawaan true); menambah sedikit latensi.
clone_strengthnumberTidakKekuatan kloning, 0–1 (0 disarankan untuk kebanyakan suara). Hanya untuk suara klon profesional milik Anda (voice_…) yang dilatih untuk Eleven v4.
language_codestringTidakKode bahasa dua huruf kecil (ISO 639-1) seperti ar, ja, atau en untuk menetapkan bahasa ucapan. Tidak dipakai oleh model multilingual-v2.
audio_effectsobjectTidakObjek efek audio opsional: filter_preset_id (mis. phone, old_radio), environment_id (ruang gema, mis. small_room, hall), background_noise_id (mis. cafe), distance (0–1), send_level (jumlah gema, 0–1), dan pan (−1…1). ID memakai huruf kecil, angka, dan garis bawah; tanpa biaya tambahan. Gema atau pan bukan 0 menghasilkan audio stereo dan tidak dapat digabung dengan keluaran pcm.

Ketujuh pengaturan suara di atas bersifat opsional; jika tidak dikirim, tidak ada yang berubah. Nilai di luar rentang mengembalikan 400 dan tidak dikirim maupun ditagih. Header respons X-Voice-Settings menunjukkan apakah pengaturan Anda dipakai: applied = dipakai; ignored = rute cadangan yang menjawab sehingga pengaturan Anda tidak dipakai (audio tetap dihasilkan); tanpa header = Anda tidak mengirim pengaturan suara. Contoh: stability 0 membaca lebih ekspresif, stability 1 lebih rata.

Aturan suara

Model ElevenLabs (elevenlabs/…) menerima salah satu nama suara berikut (tidak peka huruf besar/kecil): george, sarah, adam, alice, bella, bill, brian, callum, charlie, chris, daniel, eric, harry, jessica, laura, liam, lily, matilda, river, roger, will. Untuk model ElevenLabs, voice boleh dihilangkan (bawaan george). Nilai lain mengembalikan 400 invalid_voice. Suara kustom Anda sendiri (voice_…) dijelaskan di bagian Suara kustom di bawah.

Nama suara OpenAI-style seperti alloy, echo, atau nova hanya berlaku pada model yang mencantumkannya. Periksa halaman model untuk daftar suara.

Suara kustom (kloning) dibuka bertahap: lihat bagian Suara kustom di bawah (POST /v1/voices). Sampai diaktifkan untuk akun Anda, gunakan salah satu dari 21 nama preset di atas atau voice ID publik.

Mengirim alloy ke model ElevenLabs akan gagal
Jika model ElevenLabs menerima suara yang bukan voice ID maupun salah satu nama yang didukung (misalnya alloy atau Rachel), hasilnya 400 invalid_voice dan pesannya mencantumkan nama yang diterima. Permintaan gagal tidak ditagih.

Daftar suara bawaan

Isi voice dengan salah satu nama di bawah (huruf kecil). Setiap suara punya klip pratinjau singkat kami sendiri, dan GET /api/v1/audio/voices mengembalikan daftar lengkap (jenis kelamin, kelompok usia, aksen, gaya, dan URL pratinjau).

?lang= (en, zh-TW, zh-CN; default mengikuti Accept-Language) hanya memilih bahasa description. URL pratinjau tidak berubah: preview_urls.en (sama dengan preview_url) adalah klip bahasa Inggris, preview_urls.zh (sama dengan preview_url_zh) adalah klip bahasa Mandarin.

SuaraDeskripsiPratinjau
georgeMale, middle-aged, British accent. Mature and steady, suited to narration and storytelling.
sarahFemale, young adult, American accent. Professional and clear, suited to broadcast-style reading.
adamMale, middle-aged, American accent. Everyday and approachable, suited to short social videos.
aliceFemale, middle-aged, British accent. Professional and informative, suited to explainers and teaching.
bellaFemale, middle-aged, American accent. Professional and informative, suited to explainers and teaching.
billMale, senior, American accent. Crisp and direct, suited to advertising voice-overs.
brianMale, middle-aged, American accent. Polished and refined, suited to social and brand content.
callumMale, middle-aged, American accent. Expressive, suited to characters and animation.
charlieMale, young adult, Australian accent. Energetic and lively, suited to conversation.
chrisMale, middle-aged, American accent. Relaxed and casual, suited to conversation.
danielMale, middle-aged, British accent. Formal and measured, suited to news-style and educational reading.
ericMale, middle-aged, American accent. Polished and warm, suited to conversation.
harryMale, young adult, American accent. Rough and gritty, suited to character voices.
jessicaFemale, young adult, American accent. Bright and cute, suited to conversation.
lauraFemale, young adult, American accent. Playful with attitude, suited to social content.
liamMale, young adult, American accent. Confident and upbeat, suited to social content.
lilyFemale, middle-aged, British accent. Confident and clear, suited to explainers and teaching.
matildaFemale, middle-aged, American accent. Upbeat and friendly, suited to explainers and teaching.
riverNeutral voice, middle-aged, American accent. Calm and even, suited to conversation.
rogerMale, middle-aged, American accent. Polished and confident, suited to conversation.
willMale, young adult, American accent. Laid-back and easygoing, suited to conversation.

Tag emosi dan aksi (audio tags)

Tulis tag dalam kurung siku langsung di dalam input, misalnya [laughs], [whispers], [excited], [sighs], [crying], [curious] atau [softly]. Tag dikirim ke model persis seperti yang diketik dan menentukan cara kata-kata berikutnya dibawakan. Biarkan tag tetap dalam bahasa Inggris meskipun teksnya berbahasa lain.

curl https://api.bazaarlink.ai/v1/audio/speech \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"elevenlabs/eleven-v3","input":"[laughs] That was actually funny. [whispers] Do not tell anyone.","voice":"george","response_format":"mp3"}' \
  --output audio-tags.mp3

Didukung oleh elevenlabs/eleven-v3 dan keluarga elevenlabs/eleven-v4. Model suara lain tidak menafsirkan tag dan bisa membacakan isi kurung, jadi coba dulu dengan satu kalimat pendek.

Tag dihitung sebagai karakter input dan ditagih seperti teks lainnya.

Format keluaran

Jika response_format dihilangkan, bawaannya mp3 (Content-Type audio/mpeg); pcm (audio/pcm, PCM 16-bit mentah) juga berfungsi. API menerima opus, aac, flac, dan wav, tetapi model ElevenLabs saat ini menolaknya dengan 400. Simpan berkas sesuai header Content-Type respons.

Harga

Sintesis suara ditagih berdasarkan jumlah karakter masukan. Harga per karakter terdapat pada halaman model di /models dan dalam GET /v1/models sebagai pricing.character. Halaman model menampilkannya per sejuta karakter.

Contoh

curl https://api.bazaarlink.ai/v1/audio/speech \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"elevenlabs/eleven-flash-v2.5","input":"Hello from BazaarLink.","voice":"george","response_format":"mp3"}' \
  --output speech.mp3

Kesalahan umum

StatusPenyebab dan solusi
400Permintaan tidak valid: model, input, atau voice tidak ada; input lebih dari 4.096 karakter; speed di luar 0.25–4.0; response_format tidak didukung; Unknown voice; unknown_model (periksa ID di /models).
401Kunci API tidak ada atau tidak valid. Kirim Authorization: Bearer dengan kunci BazaarLink Anda.
402Saldo tidak cukup. Isi ulang lalu coba lagi.
403Kunci pengelolaan tidak dapat memanggil model, atau akun ditangguhkan. Gunakan kunci API biasa.
429Batas laju tercapai. Tunggu sesuai Retry-After lalu coba lagi.
502Layanan model sementara tidak tersedia atau pengiriman audio terputus. Coba lagi; permintaan yang gagal tidak dikenai biaya.

Referensi parameter lengkap: Sintesis suara

Panduan transkripsi audio

POST /v1/audio/transcriptions bersifat OpenAI-compatible: unggah audio sebagai multipart/form-data atau kirim input_audio base64 melalui JSON untuk menerima teks. Model mencakup elevenlabs/scribe-v2 dan elevenlabs/scribe-v2-medical. Daftar terkini tersedia di GET /v1/models?output_modalities=transcription. GET /v1/models secara bawaan hanya mengembalikan model teks, jadi tambahkan ?output_modalities=transcription (atau all) untuk melihat daftarnya.

POST/v1/audio/transcriptions

Parameter

ParameterTipeWajibDeskripsi
modelstringYaID model transkripsi, misalnya elevenlabs/scribe-v2.
filefileYaBerkas audio (multipart). Mendukung wav, mp3, mp4, m4a, ogg, flac, webm, aac. Maksimal 25 MiB. Klien JSON dapat mengirim input_audio: {data: base64, format}.
response_formatstringTidakjson (bawaan) mengembalikan {text}; verbose_json menambahkan bahasa, durasi, dan segments/words.
languagestringTidakPetunjuk bahasa opsional seperti en atau zh. Kosongkan untuk deteksi otomatis.
promptstringTidakTeks konteks opsional untuk membantu mengenali nama dan istilah. Tidak semua model menerapkannya.
timestamp_granularities[]string[]Tidakword dan/atau segment. Hanya diterapkan bersama response_format=verbose_json; selain itu diabaikan. Stempel waktu tingkat kata belum dikembalikan; segments dikembalikan.

Format keluaran

response_format hanya menerima json atau verbose_json (text, srt, vtt tidak didukung). stream tidak didukung. Batas durasi audio berlaku per model, dengan nilai bawaan 60 detik. Audio yang lebih panjang ditolak sebelum diproses dengan 413 audio_too_long dan tidak dikenai biaya. Bagi rekaman panjang menjadi segmen.

Harga

Transkripsi ditagih per detik audio. Harga per detik terdapat pada halaman model di /models dan dalam GET /v1/models sebagai pricing.second; harga per menit 60 kali nilai itu. Respons usage menunjukkan detik yang ditagih, sedangkan usage.cost menunjukkan jumlah tagihan.

Contoh

curl https://api.bazaarlink.ai/v1/audio/transcriptions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -F model="elevenlabs/scribe-v2" \
  -F file=@audio.mp3 \
  -F response_format=verbose_json \
  -F "timestamp_granularities[]=word"

Kesalahan umum

StatusPenyebab dan solusi
400Permintaan tidak valid: model atau file tidak ada, audio kosong, response_format selain json/verbose_json, stream=true (unsupported_parameter), atau timestamp_granularities selain word/segment.
401Kunci API tidak ada atau tidak valid.
402Saldo tidak cukup. Isi ulang lalu coba lagi.
413audio_too_large: audio terdekode melebihi 25 MiB. audio_too_long: audio melewati batas per model (bawaan 60 detik), ditolak sebelum diproses, dan tidak dikenai biaya. Kompres atau bagi audio.
429Batas laju tercapai. Tunggu sesuai Retry-After lalu coba lagi.
502Layanan model sementara tidak tersedia atau transfer audio terputus. Coba lagi; permintaan gagal tidak dikenai biaya.

Referensi parameter lengkap: Transkripsi audio

Suara kustom (kloning suara)

Suara kustom (kloning suara)
Tersedia hanya dengan pengajuan. Suara kustom dibuka akun demi akun: hubungi dukungan pelanggan untuk mengajukan. Sampai akun Anda diaktifkan, setiap permintaan /v1/voices dijawab 403 voice_cloning_not_enabled (dan 404 not_found selama fitur dimatikan untuk semua orang). Batas dan harga di halaman ini adalah nilai bawaan dan dapat berubah.

Unggah rekaman singkat suara yang boleh Anda gunakan dan dapatkan voice id milik kami (voice_…). Berikan id itu sebagai voice pada POST /v1/audio/speech. Suara hanya dapat dipakai oleh orang yang membuatnya.

Endpoint

POST/v1/voices

Buat suara (multipart/form-data)

GET/v1/voices

Daftar suara Anda (limit 1–100, after = voice id untuk halaman berikutnya)

GET/v1/voices/{id}

Ambil salah satu suara Anda

DELETE/v1/voices/{id}

Hapus suara (berlaku seketika)

POST/v1/voices/report

Laporkan suara (tanpa API key)

Membuat suara: field

FieldTipeWajibDeskripsi
namestringYaNama suara, 1–60 karakter.
filesfile[]Ya1 sampai 5 file rekaman suara tersebut (mp3, wav, m4a, ogg, flac, webm).
consentbooleanYaHarus true: Anda menegaskan berhak mengkloning dan menggunakan suara ini (lihat Persetujuan).
consent_statement_versionstringYaVersi pernyataan persetujuan yang Anda setujui. Saat ini "v1".
descriptionstringTidakOpsional, maksimal 200 karakter.
remove_background_noisebooleanTidakBoolean opsional, bawaan false. Membersihkan derau latar pada sampel sebelum kloning.

Permintaan bersifat sinkron: 201 berarti suara siap dipakai. Kirim header Idempotency-Key (string unik apa pun) dan pakai lagi saat mengulang, sehingga pengulangan tidak pernah membuat atau menagih suara kedua.

Respons

201 berisi id (voice_…), object ("voice"), name, description, status ("ready"), created_at (detik Unix) dan usage.cost_usd (biaya pembuatan yang ditagih). Informasi lain tentang cara suara dibuat tidak keluar dari sistem kami.

GET /v1/voices hanya mengembalikan suara Anda sendiri: { "object": "list", "data": [ … ], "has_more": false }. Voice id milik orang lain dijawab 404 voice_not_found, sama persis dengan id yang tidak ada.

GET /v1/voices/{id} mengembalikan satu suara (field sama seperti di atas, tanpa usage).

DELETE /v1/voices/{id} mengembalikan { "id": "voice_…", "object": "voice", "deleted": true } dan berlaku seketika: permintaan speech yang memakai suara itu langsung gagal. Menghapus gratis; biaya pembuatan tidak dikembalikan.

Batas (nilai bawaan)

  • Maksimal 3 suara per orang.
  • 1 sampai 5 file audio per suara, masing-masing maksimal 10 MB dan total 25 MB; format: mp3, wav, m4a, ogg, flac, webm. Total sekitar 30 detik sampai 5 menit suara yang bersih paling baik.
  • Maksimal 3 pembuatan per hari (hari UTC).
  • Akun Anda perlu alamat email terverifikasi dan saldo minimal US$5.
  • Nama dan deskripsi yang meniru tokoh publik, atau terdengar seperti suara resmi atau staf, ditolak (invalid_voice_name).
  • Rekaman hanya dipakai untuk membuat suara dan tidak kami simpan. Kami menyimpan nama suara, pemilik, catatan persetujuan, dan cap waktu.

Harga

Membuat suara dikenai biaya sekali bayar (bawaan US$1.00); jumlah yang ditagih dikembalikan di usage.cost_usd, dan Anda ditagih hanya jika suara berhasil dibuat. Memakai suara kustom pada speech dikenai harga per karakter yang sama dengan suara lain milik model itu. Menghapus gratis.

Persetujuan

Setiap pembuatan harus mengirim consent=true dan consent_statement_version="v1". Jika pernyataan diperbarui, pembuatan dijawab 400 consent_version_mismatch dan Anda menyetujui ulang dengan versi baru.

Draf pernyataan yang Anda setujui (kata-kata finalnya sedang ditinjau dan dapat berubah):

I confirm that I own the voice in these recordings or have the written permission of the person whose voice it is, that this person is an adult and has agreed to have their voice cloned and synthesized, and that I will not use the voice to impersonate a real person, to deceive, to harass, or for political persuasion, fraud or any unlawful purpose. I understand the voice can be removed and my account suspended if I break these rules.

Memakai suara kustom

Berikan voice id sebagai voice pada POST /v1/audio/speech (voice=voice_…) bersama model speech dari keluarga elevenlabs/*. Batas input, format, dan harga per karakter mengikuti model. Voice id yang tidak ada, sudah dihapus atau diblokir, atau milik orang lain dijawab 400 invalid_voice, dan suara kustom tidak bisa dipakai dengan model lain.

Contoh

curl https://api.bazaarlink.ai/v1/voices \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -F name="My narrator" \
  -F description="Warm and calm" \
  -F consent=true \
  -F consent_statement_version=v1 \
  -F files=@sample-1.mp3 \
  -F files=@sample-2.wav

curl "https://api.bazaarlink.ai/v1/voices?limit=20" \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY"

curl -X DELETE https://api.bazaarlink.ai/v1/voices/voice_0123456789abcdef01234567 \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY"

curl https://api.bazaarlink.ai/v1/audio/speech \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"elevenlabs/eleven-flash-v2.5","input":"Hello, this is my own voice.","voice":"voice_0123456789abcdef01234567","response_format":"mp3"}' \
  --output my-voice.mp3

Melaporkan suara

Jika sebuah suara meniru Anda atau orang lain tanpa izin, laporkan: POST /v1/voices/report (tanpa API key) dengan body JSON berisi voice_id (voice_…) atau sample_url, reason (impersonation, fraud, harassment, minor, political, atau other), serta opsional details dan contact (alamat email). Selalu dijawab 202. Kami meninjau laporan dan menghapus suara yang melanggar aturan; akun dapat ditangguhkan.

curl https://api.bazaarlink.ai/v1/voices/report \
  -H "Content-Type: application/json" \
  -d '{"voice_id":"voice_0123456789abcdef01234567","reason":"impersonation","details":"...","contact":"me@example.com"}'

Penggunaan yang bertanggung jawab

Jangan mengkloning suara tokoh publik, selebriti, politikus, atau siapa pun yang belum setuju. Jangan memakai suara hasil kloning untuk membuat orang percaya bahwa mereka berbicara dengan orang aslinya, untuk menipu, melecehkan, mempengaruhi secara politik, atau melakukan penipuan.

Error

StatusKodeArti
400bad_requestPermintaan salah format: bukan multipart/form-data, tidak ada file audio, description terlalu panjang, atau limit di luar 1–100.
400consent_requiredconsent=true tidak ada.
400consent_version_mismatchVersi pernyataan persetujuan sudah usang; setujui ulang dengan versi saat ini.
400invalid_voice_nameNama kosong, lebih dari 60 karakter, atau tidak diizinkan.
400too_many_filesFile audio lebih dari 5.
401invalid_api_keyAPI key tidak ada atau tidak valid.
402insufficient_balanceSaldo terlalu rendah (biaya pembuatan atau saldo minimum).
403email_unverifiedVerifikasi alamat email Anda terlebih dahulu.
403voice_cloning_not_enabledAkun Anda belum diaktifkan untuk suara kustom; hubungi dukungan pelanggan untuk mengajukan.
403voice_cloning_disabledSuara kustom belum diaktifkan untuk layanan ini saat ini.
404voice_not_foundSuara tidak ada (atau bukan milik Anda).
404not_foundTidak ditemukan, termasuk setiap permintaan /v1/voices selama fitur belum diaktifkan untuk akun Anda.
405method_not_allowedMetode itu tidak tersedia pada path ini.
409duplicate_requestIdempotency-Key yang sama masih diproses; tunggu lalu coba lagi.
413file_too_largeSebuah file melebihi 10 MB atau seluruh file melebihi 25 MB.
415unsupported_file_typeJenis audio tidak didukung; gunakan mp3, wav, m4a, ogg, flac, webm.
422voice_rejectedPemeriksaan penyedia suara tidak menerima sampel (misalnya suara terkenal atau bawaan, atau suara sintetis AI yang dikenal). Suara tidak disimpan dan Anda tidak ditagih. Gunakan rekaman jernih suara Anda sendiri, atau suara yang Anda berhak gunakan.
429voice_create_rate_limitedBatas pembuatan harian tercapai; coba lagi besok (UTC).
429voice_limit_reachedAnda telah mencapai jumlah maksimum suara kustom.
502upstream_failedSuara tidak dapat dibuat; Anda tidak ditagih. Coba lagi dengan Idempotency-Key baru.
503voice_capacity_fullKapasitas suara kustom sedang penuh; Anda tidak ditagih. Coba lagi nanti.
504upstream_timeoutLayanan suara tidak menjawab tepat waktu; Anda tidak ditagih. Coba lagi dengan Idempotency-Key yang sama.

API Data

Segera hadir — Data sosial dan commerce publik melalui tiga endpoint BazaarLink. Layanan ini nonaktif secara default. Permintaan akan mengembalikan service_paused sampai layanan diaktifkan.

Kirim permintaan data sosial

POST/v1/data/social

Parameter permintaan

KodeTipeWajibArti
platformstringYaID platform dari katalog, seperti twitter atau instagram.
actionstringYaAksi yang didukung platform tersebut; lihat katalog untuk pasangan yang tersedia.
paramsobjectTidakInput khusus aksi. Gunakan required_params dan optional_params di katalog.
modesync | asyncTidakOpsional. async mengembalikan job untuk dipolling; aksi khusus asinkron tetap mengembalikan job meski tidak dicantumkan.

Format respons

HTTP 200 · data.social · id · object · platform · action · count · results · usage.cost

{
  "id": "req_example",
  "object": "data.social",
  "platform": "twitter",
  "action": "search",
  "count": 1,
  "results": [
    {
      "id": "post_example",
      "url": "https://x.com/someone/status/post_example",
      "text": "Example post",
      "like_count": 120,
      "reply_count": 8,
      "retweet_count": 14,
      "view_count": 5400,
      "posted_at": "2026-10-07T00:48:38+00:00",
      "author_username": "someone",
      "author_name": "Someone",
      "platform": "twitter"
    }
  ],
  "usage": {
    "cost": 0.0048
  }
}

Job asinkron

Aksi khusus asinkron atau mode async mengembalikan HTTP 202 dengan ID job buram. Lakukan polling GET /v1/data/jobs/{id}: HTTP 202 berarti masih menunggu, dan HTTP 200 mengembalikan respons data.social yang selesai. Job kedaluwarsa setelah 15 menit (HTTP 410 job_expired). Job yang tidak dikenal dan job milik akun lain mengembalikan HTTP 404 not_found. Job yang selesai dikenai biaya satu kali saat pertama kali berhasil diambil.

{
  "platform": "instagram",
  "action": "discover",
  "params": {
    "keyword": "coffee"
  },
  "mode": "async"
}

HTTP 202

{
  "id": "job_example",
  "object": "data.job",
  "status": "pending",
  "platform": "instagram",
  "action": "discover"
}

Polling job asinkron

GET/v1/data/jobs/{id}

HTTP 202 pending → HTTP 200 data.social · HTTP 410 job_expired · HTTP 404 not_found

{
  "id": "job_example",
  "object": "data.social",
  "platform": "instagram",
  "action": "discover",
  "count": 1,
  "results": [
    {
      "id": "post_example",
      "url": "https://www.instagram.com/p/example/",
      "text": "Example result",
      "platform": "instagram"
    }
  ],
  "usage": {
    "cost": 0.0096
  }
}

Daftar aksi dan harga yang tersedia

GET/v1/data/catalog

object · product · platforms · actions · required_params · optional_params · max_limit · async · price_usd

{
  "object": "data.catalog",
  "product": "BazaarLink Data API",
  "platforms": [
    {
      "platform": "twitter",
      "actions": [
        {
          "action": "search",
          "label": "Keyword search",
          "required_params": [
            "keyword"
          ],
          "optional_params": [
            "sort"
          ],
          "max_limit": 200,
          "async": false,
          "price_usd": 0.0048
        }
      ]
    },
    {
      "platform": "instagram",
      "actions": [
        {
          "action": "discover",
          "label": "Discover",
          "required_params": [
            "keyword"
          ],
          "optional_params": [],
          "max_limit": null,
          "async": true,
          "price_usd": 0.0096
        }
      ]
    }
  ]
}

Penagihan

Harga bertingkat berdasarkan platform dan aksi. GET /v1/data/catalog menampilkan harga pelanggan untuk setiap aksi yang diaktifkan. Panggilan yang berhasil dikenai biaya satu kali; panggilan gagal dan panggilan tanpa hasil gratis. Data API dan pencarian web berbagi jatah gratis harian.

Kode error

{"error":{"code":"<code>","message":"<fixed message>"}}

KodeHTTPArti
unauthorized401API key tidak ada atau tidak valid.
forbidden403Permintaan tidak diizinkan.
invalid_request400Isi permintaan tidak valid.
invalid_params400Parameter aksi ditolak.
unsupported_capability400Platform atau aksi tidak tersedia.
insufficient_credits402Kredit tidak mencukupi.
budget_cap_reached402 or policy statusBatas pengeluaran akun tercapai.
body_too_large413Isi permintaan melebihi batas ukuran.
free_quota_exhausted432Jatah gratis harian habis.
rate_limited429Batas laju tercapai; patuhi Retry-After.
data_unavailable503Layanan data sementara tidak tersedia.
timeout504Permintaan kehabisan waktu.
bad_upstream_response502Layanan data mengembalikan respons yang tidak valid.
job_expired410Job kedaluwarsa setelah 15 menit.
not_found404Job tidak dikenal atau milik akun lain.
job_failed503Job asinkron gagal.
service_paused503Layanan belum diaktifkan atau sedang dijeda.

Contoh

curl

curl https://api.bazaarlink.ai/v1/data/social \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"platform":"twitter","action":"search","params":{"keyword":"BazaarLink","limit":5}}'

Python (requests)

import os
import requests

response = requests.post(
    "https://api.bazaarlink.ai/v1/data/social",
    headers={"Authorization": f"Bearer {os.environ['BAZAARLINK_API_KEY']}"},
    json={"platform": "twitter", "action": "search", "params": {"keyword": "BazaarLink", "limit": 5}},
    timeout=30,
)
response.raise_for_status()
print(response.json())

JavaScript (fetch)

const response = await fetch("https://api.bazaarlink.ai/v1/data/social", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BAZAARLINK_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ platform: "twitter", action: "search", params: { keyword: "BazaarLink", limit: 5 } }),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());

Submit a decisions request

Evaluate a state against named questions with a decisions-output model. This alpha endpoint returns non-streaming JSON. Find available model ids with GET /v1/models?output_modalities=decisions; use this endpoint for Clef instead of chat/completions. Input tokens are billed at the selected model's customer price. Sufficient credits are required. Set BAZAARLINK_API_KEY to your API key; the sample builds its complete Authorization header in BAZAARLINK_AUTH_HEADER.

View the decisions API reference

export BAZAARLINK_AUTH_HEADER="Authorization: $(printf '%s %s' 'Bearer' "$BAZAARLINK_API_KEY")"

curl https://api.bazaarlink.ai/v1/alpha/decisions \
  -H "$BAZAARLINK_AUTH_HEADER" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "cloudflare/clef-flash",
    "state": "The support agent issued a full refund.",
    "questions": {
      "refunded": {
        "type": "noul",
        "instructions": "Was a refund issued?"
      }
    }
  }'

Input Video

Kirim file video ke model yang mendukung input video untuk dianalisis, diberi keterangan, atau dijawab pertanyaannya seputar adegan dan peristiwa. Bisa pakai URL langsung atau base64 data URI — URL lebih efisien untuk video yang dapat diakses publik; base64 untuk file lokal atau video privat.

Format yang Didukung

MP4 (H.264)MPEGMOVWebM
response = client.chat.completions.create(
    model="google/gemini-3.5-flash",
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "video_url",
                "video_url": {"url": "https://example.com/video.mp4"},
            },
            {"type": "text", "text": "What is happening in this video?"},
        ],
    }],
)

Referensi API lengkap →

Input PDF

Kirim dokumen PDF langsung dalam pesan ke model yang mendukung input PDF secara native (mis. Claude, Gemini). BazaarLink meneruskan file langsung ke model — ditagih sebagai input token biasa, tanpa biaya tambahan atau langkah pemrosesan ekstra.

Format yang Didukung

  • Dokumen PDF (teks, gambar, tabel, pindai)
  • URL data base64 (`data:application/pdf;base64,...`)
  • Dokumen multi-halaman
  • Hanya PDF tanpa kata sandi
import base64

with open("document.pdf", "rb") as f:
    pdf_data = base64.b64encode(f.read()).decode()

response = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.6",
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "file",
                "file": {
                    "filename": "document.pdf",
                    "file_data": f"data:application/pdf;base64,{pdf_data}",
                },
            },
            {"type": "text", "text": "Summarize this document."},
        ],
    }],
)

Responses API

Endpoint yang kompatibel dengan OpenAI Responses API untuk percakapan multi-turn stateless, tool calling, dan input multimodal. Ideal untuk agen dan framework yang menggunakan OpenAI Python SDK >= 1.x dengan client.responses.create().

POST/v1/responses
Note
Menerima autentikasi dan routing model yang sama dengan Chat Completions.

Body Permintaan

modelwajib
string
Gunakan id atau alias yang tercantum di GET /v1/models, seperti "claude-sonnet-4.6" atau "anthropic/claude-sonnet-4.6".
inputwajib
string | Item[]
Input pengguna — string biasa (pesan tunggal) atau array item input untuk percakapan multi-turn / multimodal.
instructions
string
Instruksi level sistem, setara dengan pesan sistem. Harus dikirim ulang pada setiap permintaan.
stream
boolean
Jika true, mengembalikan event stream SSE Responses API. Tipe event: response.created, response.output_text.delta, response.completed.
max_output_tokens
integer
Jumlah maksimum token output yang dihasilkan (termasuk token penalaran untuk model o-series).
temperature
number
Nilai sampling diteruskan tanpa validasi rentang. Model dapat membatasi atau mengabaikan nilai di luar rentang yang didukung.
top_p
number
Massa probabilitas sampling nukleus. Default: 1
tools
Tool[]
Definisi tool (fungsi) — format JSON Schema yang sama dengan Chat Completions (menerima bentuk datar Responses maupun bentuk bersarang). Tool bawaan milik OpenAI sendiri (web_search_preview, file_search, computer_use_preview) tidak didukung; pencarian web tersedia melalui plugins: [{id:"web"}] — hanya didukung pada beberapa rute model.
tool_choice
string | object
Mengontrol penggunaan tool: "auto", "none", atau tool tertentu
parallel_tool_calls
boolean
Aktifkan pemanggilan fungsi paralel saat tools disediakan. Default: true. Hanya model keluarga OpenAI — lihat catatan di bawah.
response_format
object
Paksa output JSON terstruktur. Lihat bagian Output Terstruktur
previous_response_id
string
Endpoint ini stateless — mengirim nilai yang bukan null langsung mengembalikan 400 (invalid_prompt), tidak pernah diterima lalu diabaikan. Gunakan mode stateless: kirim riwayat percakapan lengkap dalam array input.

Skema Permintaan (TypeScript)

type ResponsesRequest = {
  model: string;                    // Listed id or alias from GET /v1/models
  input: string | InputItem[];      // string or multi-turn array

  // Optional
  instructions?: string;            // System-level message
  stream?: boolean;                 // Default: false
  max_output_tokens?: number;
  temperature?: number;
  top_p?: number;
  tools?: Tool[];
  tool_choice?: "auto" | "none" | "required" | object;
  parallel_tool_calls?: boolean;    // Default: true
  previous_response_id?: string;    // Not supported — use full input array
};

type InputItem =
  | { type?: "message"; role: "user" | "assistant" | "system" | "developer"; content: string | ContentBlock[] }
  | { type: "function_call_output"; call_id: string; output: string }   // tool result
  | { type: "function_call"; call_id: string; name: string; arguments: string };

type ContentBlock =
  | { type: "input_text"; text: string }
  | { type: "input_image"; image_url: string; detail?: "auto" | "low" | "high" };

Contoh Permintaan

curl https://api.bazaarlink.ai/v1/responses \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-5.4-mini",
    "instructions": "You are a helpful assistant.",
    "input": "What is the capital of Taiwan?"
  }'

Format Respons

BazaarLink mengembalikan respons terstandar dan menghapus field khusus upstream. ID permintaan BazaarLink yang buram di respons sama dengan x-request-id; gunakan ID itu pada GET /v1/generation. Respons non-streaming juga menyertakan ID yang sama di x-generation-id. usage.cost adalah jumlah USD yang ditagihkan kepada pelanggan. Statistik dapat tersedia beberapa detik setelah selesai; coba lagi sebentar jika mendapat 404.

// Non-streaming response object
type ResponsesResponse = {
  id: string;             // Opaque BazaarLink request id; format may change
  object: "response";
  created_at: number;
  completed_at: number;
  status: "completed" | "failed" | "incomplete";
  model: string;
  output: OutputItem[];
  usage: {
    input_tokens: number;   // equivalent to prompt_tokens
    output_tokens: number;  // equivalent to completion_tokens
    total_tokens: number;
    cost?: number;          // USD amount charged to the customer for this request
  } | null;
  error: null | { code: string; message: string };
};

type OutputItem =
  | {
      type: "message";
      id: string;
      role: "assistant";
      status: "completed";
      content: Array<{ type: "output_text"; text: string; annotations: [] }>;
    }
  | { type: "function_call"; id: string; call_id: string; name: string; arguments: string; status: "completed" };

Migrasi dari Chat Completions

Ganti messages dengan input (string atau array), gunakan instructions sebagai pengganti pesan system-role, dan baca output[0].content[0].text alih-alih choices[0].message.content.

# Chat Completions (before)
response = client.chat.completions.create(
    model="openai/gpt-5.4-mini",
    messages=[
        {"role": "system", "content": "You are helpful."},
        {"role": "user",   "content": "Hello"},
    ]
)
text = response.choices[0].message.content

# Responses API (after)
response = client.responses.create(
    model="openai/gpt-5.4-mini",
    instructions="You are helpful.",
    input="Hello"
)
text = response.output[0].content[0].text

Keterbatasan

  • previous_response_id atau store: true ditolak dengan 400 (kode error invalid_prompt) — bukan diterima lalu diabaikan. Selalu gunakan mode stateless: kirim riwayat percakapan lengkap dalam array input.
  • Tool bawaan milik OpenAI sendiri (web_search_preview, file_search, computer_use_preview) tidak didukung. Pencarian web tersedia melalui plugins: [{id:"web"}] — hanya didukung pada beberapa rute model.
  • background: true diterima tetapi diabaikan — setiap permintaan selalu berjalan secara sinkron hingga selesai.

Messages (Anthropic)

Messages API yang kompatibel dengan Anthropic untuk Claude SDK. Arahkan SDK ke BazaarLink dan gunakan API key BazaarLink; field respons dan metadata penagihan mengikuti kontrak BazaarLink yang dijelaskan di bawah.

POST/v1/messages
Note
AMenerima token pembawa atau header x-api-key (kompatibilitas Anthropic SDK). Ukuran badan maksimal: 10 MB.

Body Permintaan

modelwajib
string
Gunakan id atau alias yang tercantum di GET /v1/models, seperti "claude-sonnet-4.6" atau "anthropic/claude-sonnet-4.6".
max_tokenswajib
integer
Jumlah maksimum token yang akan dihasilkan (bilangan bulat positif).
messageswajib
Message[]
Array pesan percakapan (tidak kosong).
system
string
Permintaan sistem opsional.
stream
boolean
Jika true, mengembalikan stream Server-Sent Events. Default: false
temperature
number
Nilai sampling diteruskan tanpa validasi rentang. Model dapat membatasi atau mengabaikan nilai di luar rentang yang didukung.
top_p
number
Massa probabilitas sampling nukleus. Default: 1
top_k
integer
Nilai sampling diteruskan tanpa validasi rentang. Model dapat membatasi atau mengabaikan nilai di luar rentang yang didukung.
stop_sequences
string[]
String urutan penghentian khusus.
tools
Tool[]
Daftar tools (fungsi) yang dapat dipanggil model
tool_choice
string | object
Mengontrol penggunaan tool: "auto", "none", atau tool tertentu

Contoh Permintaan

from anthropic import Anthropic

client = Anthropic(
    base_url="https://api.bazaarlink.ai/v1",
    api_key="sk-bl-YOUR_KEY"
)

response = client.messages.create(
    model="anthropic/claude-opus-4.6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello"}]
)
print(response.content[0].text)

Respons

BazaarLink mengembalikan respons terstandar dan menghapus field khusus upstream. ID permintaan BazaarLink yang buram di respons sama dengan x-request-id; gunakan ID itu pada GET /v1/generation. Respons non-streaming juga menyertakan ID yang sama di x-generation-id. usage.cost dan usage.bz_cost berisi jumlah USD yang sama yang ditagihkan kepada pelanggan. Statistik dapat tersedia beberapa detik setelah selesai; coba lagi sebentar jika mendapat 404.

{
  "id": "85e6f35c71a31f19-SJC",
  "type": "message",
  "role": "assistant",
  "model": "anthropic/claude-opus-4.6",
  "content": [
    { "type": "text", "text": "Hello! How can I help you today?" }
  ],
  "stop_reason": "end_turn",
  "usage": {
    "input_tokens": 10,
    "output_tokens": 12,
    "cache_read_input_tokens": 0,
    "cache_creation_input_tokens": 0,
    "cost": 0.00042,
    "bz_cost": 0.00042
  }
}

Envelope error berbeda-beda menurut kegagalan. Tentukan alur berdasarkan status HTTP dan error.type jika tersedia; error.code dapat berupa string, status HTTP numerik, atau tidak ada. Lihat bagian Errors untuk panduan penanganan.

Model

Daftar semua model yang tersedia dengan informasi harga dan kemampuan. Tidak diperlukan autentikasi untuk endpoint ini.

GET/v1/models
# Text models (default)
curl https://api.bazaarlink.ai/v1/models

# Complete catalog
curl "https://api.bazaarlink.ai/v1/models?output_modalities=all"

Respons

{
  "data": [
    {
      "id": "openai/gpt-4o",
      "name": "GPT 4.1",
      "context_length": 1047576,
      "modality": "text+image+file->text",
      "pricing": {
        "prompt": "2.00",
        "completion": "8.00"
      }
    }
  ]
}
// /v1/models — Response Schema
type ModelsResponse = {
  data: Model[];
};

type Model = {
  id: string;                    // Model ID (e.g. "openai/gpt-4o")
  name: string;                  // Human-readable name
  context_length: number | null; // Max context window in tokens
  modality: string | null;       // e.g. "text->text", "text+image->text"
  architecture?: {
    input_modalities?: string[];
    output_modalities?: Array<
      "text" | "image" | "embeddings" | "audio" |
      "video" | "rerank" | "speech" | "transcription"
    >;
  };
  pricing: {
    prompt: string;              // Input price per 1M tokens (USD)
    completion: string;          // Output price per 1M tokens (USD)
    input_cache_read?: string;   // Cache read price per token (USD); only when the model publishes one
    input_cache_write?: string;  // Cache write price per token (USD); only when the model publishes one
    image_output?: string;       // Image output price per token (USD); only token-billed image models (display only)
  };
  description?: string | null;   // Model description
  top_provider?: {
    max_completion_tokens?: number;
  };
  supported_parameters?: string[]; // e.g. ["tools", "response_format", "reasoning"]
  pricing_tiers?: {               // Present only for models with input-length tiers
    above_prompt_tokens: number;  // Ascending; strict "greater than" threshold
    prompt: string;                // USD per token, override tier
    completion: string;            // USD per token, override tier
    input_cache_read?: string;     // USD per token, only when the tier overrides it
    input_cache_write?: string;    // USD per token, only when the tier overrides it
  }[];
};

Harga Bertingkat Berdasarkan Panjang Input

Beberapa model beralih ke tabel harga yang berbeda setelah prompt melebihi ambang token — seluruh tabel berubah, bukan hanya token di atas ambang. Ambang bersifat ketat: prompt dengan tepat N token masih ditagih pada tingkat di bawah N; tingkat yang lebih tinggi berlaku hanya ketika token input lebih besar dari N.

pricing_tiers adalah field sejajar dengan pricing, hanya ada ketika model memiliki tingkat override di atas harga dasar. Entri diurutkan berdasarkan above_prompt_tokens menaik; prompt/completion adalah USD per token (satuan sama dengan pricing.prompt/pricing.completion). pricing.prompt dan pricing.completion selalu tetap menjadi tingkat dasar (terendah).

Sebagian besar model tidak memiliki tingkat — untuk model tersebut, key pricing_tiers tidak ada sama sekali dalam respons.

{
  "id": "openai/gpt-4o",
  "name": "GPT 4.1",
  "pricing": {
    "prompt": "2.00",
    "completion": "8.00"
  },
  "pricing_tiers": [
    {
      "above_prompt_tokens": 128000,
      "prompt": "4.00",
      "completion": "16.00"
    }
  ]
}

Model Tersedia (171)

Ini adalah model yang saat ini tersedia di BazaarLink, dimuat secara dinamis dari database kami:

Qwen
qwen/qwen3.8-max1000K ctx · $1.65/$4.95text+image+video->text
qwen/qwen3.7-plus1000K ctx · $0.32/$1.28text+image->text
qwen/qwen3.7-max1000K ctx · $1.65/$4.95text->text
qwen/qwen3.7-flash1000K ctx · $0.03/$0.13text+image+video->text
qwen/qwen3.5-35b-a3b262K ctx · $0.31/$1.25text+image+video->text
qwen/qwen3.5-27b262K ctx · $0.26/$2.60text+image+video->text
qwen/qwen3-next-80b-a3b-instruct262K ctx · $0.14/$0.57text->text
qwen/qwen3.5-397b-a17b262K ctx · $0.55/$3.50text+image+video->text
qwen/qwen3.6-plus1000K ctx · $0.33/$1.95text+image+video->text
qwen/qwen3-coder-flash1000K ctx · $0.20/$0.97text->text
qwen/qwen3.5-122b-a10b262K ctx · $0.40/$3.20text+image+video->text
qwen/qwen3-vl-235b-a22b-instruct262K ctx · $0.20/$0.88text+image->text
qwen/qwen3.8-27b1000K ctx · $0.50/$3.00text+image+video->text
qwen/qwen3.8-2.4t-a95b1049K ctx · $2.00/$6.00text->text
qwen/qwen3-embedding-8b33K ctx · $0.01/$0.00text->embeddings
qwen/qwen3-embedding-0.6b33K ctx · $0.01/$0.00text->embeddings
qwen/qwen3-embedding-4b33K ctx · $0.02/$0.00text->embeddings
qwen/qwen3.5-flash-02-231000K ctx · $0.07/$0.26text+image+video->text
qwen/qwen3-coder-30b-a3b-instruct262K ctx · $0.07/$0.28text->text
qwen/qwen3.6-35b-a3b262K ctx · $0.15/$1.00text+image+video->text
qwen/qwen3-coder-next262K ctx · $0.12/$0.80text->text
qwen/qwen3-vl-30b-a3b-instruct262K ctx · $0.15/$0.60text+image->text
qwen/qwen3.5-plus-02-151000K ctx · $0.26/$1.56text+image+video->text
qwen/qwen3.6-27b262K ctx · $0.29/$2.40text+image+video->text
qwen/qwen3.5-plus-202604201000K ctx · $0.30/$1.80text+image+video->text
qwen/qwen3-coder262K ctx · $0.30/$1.00text->text
qwen/qwen-2.5-72b-instruct33K ctx · $0.36/$0.40text->text
qwen/qwen-image-3 · $0.00/$0.00text+image->image
qwen/qwen-image-3-pro · $0.00/$0.00text+image->image
Google
google/gemini-4-argon1049K ctx · $2.00/$10.00text+image+file+audio+video->text
google/gemini-3.1-flash-lite-preview1049K ctx · $0.25/$1.50text+image+file+audio+video->text
google/gemini-3.1-pro-preview1049K ctx · $2.00/$12.00text+image+file+audio+video->text
google/gemma-3-4b-it131K ctx · $0.05/$0.10text+image->text
google/gemini-3.1-flash-lite1049K ctx · $0.25/$1.50text+image+file+audio+video->text
google/gemini-3.5-flash-lite1049K ctx · $0.30/$2.50text+image+file+audio+video->text
google/gemini-3-flash-preview1049K ctx · $0.50/$3.00text+image+file+audio+video->text
google/gemini-3.7-flash1049K ctx · $0.75/$3.75text+image+file+audio+video->text
google/gemini-3.8-flash1049K ctx · $0.75/$3.75text+image+file+audio+video->text
google/gemini-3.6-flash1049K ctx · $0.75/$3.75text+image+file+audio+video->text
google/gemini-3.5-flash1049K ctx · $1.50/$9.00text+image+file+audio+video->text
google/text-embedding-0052K ctx · $0.03/$0.00text->embeddings
google/text-multilingual-embedding-0022K ctx · $0.03/$0.00text->embeddings
google/gemini-embedding-00120K ctx · $0.15/$0.00text->embeddings
google/gemma-4-26b-a4b-it262K ctx · $0.09/$0.34text+image+video->text
google/gemma-4-31b-it262K ctx · $0.09/$0.34text+image+video->text
google/gemini-2.5-flash-image33K ctx · $0.30/$2.50text+image->text+image
google/gemini-3.1-flash-image-preview66K ctx · $0.50/$3.00text+image->text+image
google/gemini-3.1-flash-image131K ctx · $0.50/$3.00text+image->text+image
google/gemini-3-pro-image131K ctx · $2.00/$12.00text+image->text+image
google/veo-3.1 · $0.00/$0.00text+image->video
google/gemini-embedding-2-preview8K ctx · $0.20/$0.00text+image+file+audio+video->embeddings
google/gemini-nano-banana-2.166K ctx · $1.50/$7.50text+image->text+image
OpenAI
openai/gpt-5.3-codex400K ctx · $1.75/$14.00text->text
openai/gpt-6-luna1050K ctx · $0.10/$0.50text+image+file->text
openai/gpt-5.6-luna1050K ctx · $0.20/$1.20text+image+file->text
openai/gpt-5.4-mini400K ctx · $0.75/$4.50text+image+file->text
openai/gpt-6.1-sol1050K ctx · $2.00/$10.00text+image+file->text
openai/gpt-6-sol1050K ctx · $2.00/$10.00text+image+file->text
openai/gpt-5.41050K ctx · $2.50/$15.00text+image+file->text
openai/gpt-5.51050K ctx · $5.00/$30.00text+image+file->text
openai/gpt-6-astra1050K ctx · $10.00/$50.00text+image+file->text
openai/gpt-5.6-terra1050K ctx · $2.00/$12.00text+image+file->text
openai/text-embedding-3-small8K ctx · $0.02/$0.00text->embeddings
openai/gpt-oss-safeguard-20b128K ctx · $0.07/$0.30text->text
openai/gpt-oss-120b131K ctx · $0.15/$0.60text->text
openai/text-embedding-ada-0028K ctx · $0.10/$0.00text->embeddings
openai/text-embedding-3-large · $0.13/$0.00text->embeddings
openai/gpt-5.6-sol1050K ctx · $4.00/$20.00text+image+file->text
openai/gpt-oss-20b131K ctx · $0.03/$0.13text->text
openai/gpt-4o128K ctx · $2.50/$10.00text+image+file->text
openai/gpt-image-1-mini400K ctx · $2.50/$2.50text+image->image
openai/gpt-5.4-image-2272K ctx · $8.00/$15.00text+image+file->text+image
openai/gpt-image-2.5-flare400K ctx · $8.00/$8.00text+image->image
openai/gpt-image-2.5-sunburst400K ctx · $8.00/$8.00text+image->image
openai/gpt-image-1400K ctx · $10.00/$10.00text+image->image
Anthropic
anthropic/claude-sonnet-4.61000K ctx · $3.00/$15.00text+image+file->text
anthropic/claude-opus-4.61000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-haiku-5.51000K ctx · $0.10/$0.50text+image+file->text
anthropic/claude-haiku-4.5200K ctx · $1.00/$5.00text+image+file->text
anthropic/claude-sonnet-51000K ctx · $2.00/$10.00text+image+file->text
anthropic/claude-sonnet-5.51000K ctx · $2.00/$10.00text+image+file->text
anthropic/claude-sonnet-4.51000K ctx · $3.00/$15.00text+image+file->text
anthropic/claude-opus-5.51000K ctx · $4.00/$20.00text+image+file->text
anthropic/claude-opus-4.81000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-opus-4.71000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-opus-51000K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-opus-4.5200K ctx · $5.00/$25.00text+image+file->text
anthropic/claude-fable-5.11000K ctx · $10.00/$50.00text+image+file->text
anthropic/claude-fable-51000K ctx · $10.00/$50.00text+image+file->text
anthropic/claude-opus-4.1200K ctx · $15.00/$75.00text+image+file->text
DeepSeek
deepseek/deepseek-v4.1-flash-10171049K ctx · $0.21/$0.85text+image->text
deepseek/deepseek-v4-flash1049K ctx · $0.14/$0.28text->text
deepseek/deepseek-v4-pro1049K ctx · $1.65/$3.30text->text
deepseek/deepseek-v4.1-flash1049K ctx · $0.21/$0.85text+image->text
deepseek/deepseek-chat-v3.1164K ctx · $0.21/$0.79text->text
deepseek/deepseek-chat164K ctx · $0.26/$0.38text->text
deepseek/deepseek-r164K ctx · $0.50/$2.15text->text
deepseek/deepseek-v4-pro-08131049K ctx · $0.89/$2.67text->text
deepseek/deepseek-v4-flash-07311000K ctx · $0.44/$1.32text->text
deepseek/deepseek-r1-0528164K ctx · $0.50/$2.15text->text
deepseek/deepseek-v4-flash-0731free1049K ctx · $0.20/$0.40text->text
elevenlabs
elevenlabs/eleven-v4-turbo · $0.00/$0.00text->speech
elevenlabs/eleven-multilingual-v2 · $0.00/$0.00text->speech
elevenlabs/eleven-v4 · $0.00/$0.00text->speech
elevenlabs/eleven-turbo-v2.5 · $0.00/$0.00text->speech
elevenlabs/eleven-flash-v2 · $0.00/$0.00text->speech
elevenlabs/eleven-v3-conversational · $0.00/$0.00text->speech
elevenlabs/eleven-flash-v2.5 · $0.00/$0.00text->speech
elevenlabs/eleven-v3 · $0.00/$0.00text->speech
elevenlabs/eleven-turbo-v2 · $0.00/$0.00text->speech
elevenlabs/scribe-v2 · $0.00/$0.00audio->transcription
elevenlabs/scribe-v2-medical · $0.00/$0.00audio->transcription
Zhipu AI
z-ai/glm-5v-turbo203K ctx · $1.20/$4.00text+image+video->text
z-ai/glm-5.3-flash1049K ctx · $0.15/$0.50text+image+video->text
z-ai/glm-4.6205K ctx · $0.60/$2.20text->text
z-ai/glm-5.3-flashx1049K ctx · $0.37/$1.25text+image+video->text
z-ai/glm-5.31049K ctx · $1.13/$4.40text->text
z-ai/glm-4.7-flash200K ctx · $0.06/$0.40text->text
z-ai/glm-4.5-air131K ctx · $0.13/$0.85text->text
z-ai/glm-4.6v131K ctx · $0.30/$0.90text+image+video->text
z-ai/glm-4.5v66K ctx · $0.60/$1.80text+image->text
z-ai/glm-4.5131K ctx · $0.60/$2.20text->text
voyage
voyage/voyage-4-lite32K ctx · $0.02/$0.00text->embeddings
voyage/voyage-3.5-lite32K ctx · $0.02/$0.00text->embeddings
voyage/voyage-3.532K ctx · $0.06/$0.00text->embeddings
voyage/voyage-432K ctx · $0.06/$0.00text->embeddings
voyage/voyage-4-large32K ctx · $0.12/$0.00text->embeddings
voyage/voyage-law-216K ctx · $0.12/$0.00text->embeddings
voyage/voyage-finance-232K ctx · $0.12/$0.00text->embeddings
voyage/voyage-code-216K ctx · $0.12/$0.00text->embeddings
voyage/voyage-3-large32K ctx · $0.18/$0.00text->embeddings
voyage/voyage-code-332K ctx · $0.18/$0.00text->embeddings
xAI
x-ai/grok-build-0.1256K ctx · $1.00/$2.00text+image+file->text
x-ai/grok-4.31000K ctx · $1.25/$2.50text+image+file->text
x-ai/grok-4.6500K ctx · $2.00/$6.00text+image+file->text
x-ai/grok-4.5500K ctx · $2.00/$6.00text+image+file->text
x-ai/grok-4.7500K ctx · $2.00/$6.00text+image->text
x-ai/grok-4.202000K ctx · $1.25/$2.50text+image+file->text
x-ai/grok-imagine-video-1.5-lite · $0.00/$0.00text+image->video
x-ai/grok-imagine-image-2.0 · $0.00/$0.00text+image->image
bytedance-seed
bytedance-seed/seed-1.6-flash262K ctx · $0.07/$0.30text+image+video->text
bytedance-seed/seed-2.0-mini262K ctx · $0.10/$0.40text+image+video->text
bytedance-seed/seed-2.0-lite262K ctx · $0.25/$2.00text+image+video->text
bytedance-seed/seed-1.6262K ctx · $0.25/$2.00text+image+video->text
ByteDance
bytedance/seedance-2.5 · $0.00/$0.00text+image+audio+video->video
bytedance/seedance-2.0 · $0.00/$0.00text+image+audio+video->video
bytedance/seedance-1-5-pro · $0.00/$0.00text+image->video
bytedance/seedance-2.0-fast · $0.00/$0.00text+image+audio+video->video
Moonshot AI
moonshotai/kimi-k31049K ctx · $2.83/$14.13text+image+video->text
moonshotai/kimi-k3.1-pro1049K ctx · $2.00/$10.00text+image+video->text
moonshotai/kimi-k2-0905262K ctx · $0.60/$2.50text->text
Cohere
cohere/rerank-v3.54K ctx · $0.00/$0.00text->rerank
cohere/rerank-4-pro33K ctx · $0.00/$0.00text->rerank
cohere/rerank-4-fast33K ctx · $0.00/$0.00text->rerank
MiniMax
minimax/minimax-m31049K ctx · $0.30/$1.20text+image+video->text
minimax/hailuo-3-max · $0.00/$0.00text+image->video
xiaomi
xiaomi/mimo-v2.6-flash1049K ctx · $0.14/$0.28text+image+video+audio->text
xiaomi/mimo-v2.6-pro1049K ctx · $0.43/$0.87text+image+video+audio->text
reflection
reflection/beam-free1049K ctx · $0.00/$0.00text->text
reflection/beam1049K ctx · $0.00/$0.00text->text
Perplexity
perplexity/pplx-embed-v1-0.6b32K ctx · $0.00/$0.00text->embeddings
perplexity/pplx-embed-v1-4b32K ctx · $0.03/$0.00text->embeddings
Mistral
mistralai/mistral-embed-23128K ctx · $0.10/$0.00text->embeddings
mistralai/codestral-embed-25058K ctx · $0.15/$0.00text->embeddings
cloudflare
cloudflare/clef-flash25K ctx · $0.09/$0.00text+image->decisions
cloudflare/clef66K ctx · $0.24/$0.00text+image->decisions
NVIDIA
nvidia/nemotron-3.5-lightning-free1000K ctx · $0.00/$0.00text->text
stealth
stealth/glyph-cluster256K ctx · $0.00/$0.00text->text
Meta
meta/muse-wonder1049K ctx · $4.00/$20.00text+image+file->text
amazon
amazon/titan-embed-text-v28K ctx · $0.02/$0.00text->embeddings
typesafe-ai
typesafe-ai/jev32K ctx · $0.04/$0.00text->decisions

Jelajahi semua model di halaman Model.

Evaluasi terstruktur (Jev)

Jev mengevaluasi state JSON berdasarkan pertanyaan bernama dan mengembalikan jawaban bertipe boolean, choice, atau score. Gunakan saat aplikasi perlu mengubah kriteria yang jelas menjadi hasil evaluasi yang dapat dibaca program.

Khusus evaluasi dan penilaian
Jev tidak mendukung chat. Kirim permintaan Jev ke POST /v1/evaluations; permintaan ke POST /v1/chat/completions akan menerima HTTP 400.
POST/v1/evaluations

Panggil endpoint ini dengan kunci API BazaarLink Anda. URL lengkap: https://api.bazaarlink.ai/v1/evaluations.

Keterangan field

model
string
Opsional. Jika dihilangkan, nilai default-nya typesafe-ai/jev. ID model lain mengembalikan HTTP 400 dengan kode model_not_available.
state
string | object | array
Wajib. Berikan state yang dinilai sebagai string JSON, objek, atau array. Total state dan questions setelah serialisasi yang melebihi 32.000 tokens mengembalikan context_length_exceeded.
questions
record<string, Question>
Wajib, berupa objek tidak kosong yang berisi pertanyaan bernama. Nama tiap pertanyaan menjadi kunci dalam objek answers pada respons.
type
boolean | choice | score
Wajib untuk setiap pertanyaan; pilih boolean, choice, atau score.
instructions
string | object | array
Wajib untuk setiap pertanyaan. Berupa string JSON, objek, atau array yang menjelaskan hal yang perlu diputuskan.
criteria
object | array
Bergantung pada type: opsional untuk boolean dan, jika ada, berupa objek dengan kunci true atau false saja; wajib berupa objek tidak kosong untuk choice; wajib berupa array berurutan dengan sedikitnya dua entri untuk score.

Jenis jawaban

  • boolean — criteria bersifat opsional; jika disertakan, hanya kunci true dan false yang diterima. Jawaban memuat probability numerik.
  • choice — criteria harus berupa objek tidak kosong yang memetakan nama opsi ke kriteria JSON. Jawaban memuat choice berupa string; probabilities menggunakan nama opsi sebagai kunci.
  • score — criteria harus berupa array berurutan dengan sedikitnya dua entri. score berupa angka dan merupakan nilai harapan dari indeks 0..N-1 sesuai urutan array criteria; probabilities menggunakan indeks tersebut dalam bentuk string sebagai kunci.

Contoh permintaan

curl --fail-with-body https://api.bazaarlink.ai/v1/evaluations \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "typesafe-ai/jev",
  "state": "The support agent issued a full refund and apologised for the delay.",
  "questions": {
    "refunded": {
      "type": "boolean",
      "instructions": "Was a refund issued?"
    },
    "tone": {
      "type": "choice",
      "instructions": "Tone of the agent?",
      "criteria": {
        "apologetic": "The agent apologises",
        "neutral": "No emotional language",
        "hostile": "The agent is rude"
      }
    },
    "quality": {
      "type": "score",
      "instructions": "How complete was the resolution?",
      "criteria": [
        "poor",
        "partial",
        "complete"
      ]
    }
  }
}'

Contoh respons berhasil

Contoh respons ini memuat id, object, model, answers, usage, rounding, dan warnings. answers menggunakan nama pertanyaan sebagai kunci. usage memuat input_tokens, output_tokens, dan total_tokens; rounding menampilkan probabilityDecimals dan scoreDecimals. warnings berupa array dan kosong dalam contoh ini. Di dalam answers, probabilities untuk choice memakai nama opsi sebagai kunci, sedangkan probabilities untuk score memakai indeks criteria dalam bentuk string sebagai kunci.

{
  "id": "eval-a3d350e5-2705-4a9b-be7c-838fa4e4eb2b",
  "object": "evaluation",
  "model": "typesafe-ai/jev",
  "answers": {
    "refunded": {
      "type": "boolean",
      "probability": 0.99
    },
    "tone": {
      "type": "choice",
      "choice": "apologetic",
      "probabilities": {
        "apologetic": 1,
        "neutral": 0,
        "hostile": 0
      }
    },
    "quality": {
      "type": "score",
      "score": 1.98,
      "probabilities": {
        "0": 0,
        "1": 0.02,
        "2": 0.98
      }
    }
  },
  "usage": {
    "input_tokens": 394,
    "output_tokens": 74,
    "total_tokens": 468
  },
  "rounding": {
    "probabilityDecimals": 2,
    "scoreDecimals": 2
  },
  "warnings": []
}

Respons error pada endpoint chat

Mengirim Jev ke endpoint chat menghasilkan HTTP 400. Field dan nilai berikut sesuai dengan handler; message ditampilkan sebagai teks pengganti dan teks sebenarnya diberikan oleh server.

{
  "error": {
    "message": "<server-generated message>",
    "type": "invalid_request_error",
    "code": 400
  }
}

Streaming

Atur stream: true untuk menerima stream Server-Sent Events (SSE). Setiap event berisi potongan respons.

from openai import OpenAI

client = OpenAI(
    base_url="https://api.bazaarlink.ai/v1",
    api_key="sk-bl-YOUR_API_KEY",
)

stream = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.6",
    messages=[{"role": "user", "content": "Count to 10 slowly."}],
    stream=True,
)

for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="", flush=True)

Format SSE

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"Hello"},"index":0}]}

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":" world"},"index":0}]}

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{"prompt_tokens":10,"completion_tokens":4,"total_tokens":14}}

data: [DONE]
Penggunaan dalam streaming
Saat streaming, data penggunaan dikembalikan dalam potongan terakhir sebelum pesan [DONE], bersama array choices dengan delta kosong dan finish_reason: "stop".

Keep-alive & chunk terakhir

Stream dapat berisi baris komentar SSE dan event unknown atau ping sebagai keep-alive. Abaikan dan parse data frame; data frame terakhir dapat memuat usage sebelum data: [DONE].

: keepalive          <- SSE comment line — ignore, do NOT JSON.parse

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"Hi"},"index":0}]}

data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{...}}

data: [DONE]

Pembatalan Stream

Permintaan streaming dapat dibatalkan dengan menutup koneksi klien — misalnya memanggil AbortController.abort() atau menutup objek stream. BazaarLink berhenti meneruskan chunk berikutnya dan membatalkan permintaan ke provider segera setelah pembatalan diterima.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.bazaarlink.ai/v1",
  apiKey: "sk-bl-YOUR_API_KEY",
});

const controller = new AbortController();

const stream = await client.chat.completions.create(
  {
    model: "anthropic/claude-sonnet-4.6",
    messages: [{ role: "user", content: "Write a long story." }],
    stream: true,
  },
  { signal: controller.signal }
);

for await (const chunk of stream) {
  const content = chunk.choices[0]?.delta?.content;
  if (content) process.stdout.write(content);
}

// e.g. on a "Stop" button click:
controller.abort();
Tidak ada biaya untuk stream yang terputus
Jika stream berakhir sebelum chunk usage terakhir tiba — termasuk pembatalan dari sisi klien — tidak ada data jumlah token yang valid untuk permintaan tersebut, sehingga BazaarLink mengembalikan penuh reservasi. Anda tidak dikenakan biaya untuk konten yang sudah terkirim ke klien sebelum pembatalan.
Tidak dijamin langsung berhenti di sisi provider
Menutup koneksi langsung menghentikan BazaarLink dari meneruskan dan menagih token berikutnya, tetapi apakah provider upstream benar-benar menghentikan generasi di server mereka sendiri saat koneksi terputus tergantung pada provider tersebut — beberapa mungkin masih memproses sebentar setelah terputus.

Error di Tengah Stream

Tidak ada field choices pada frame error
Jika terjadi kegagalan setelah streaming sudah dimulai (mis. koneksi upstream terputus), Anda akan menerima SSE data frame berbentuk {error:{message,type,code}} alih-alih {choices:[...]} yang biasa — tanpa perubahan status HTTP, karena header sudah terkirim. Periksa field error sebelum membaca choices[0].delta, dan hanya token yang sudah di-stream yang ditagih (berlaku billing parsial).
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"The capital of "},"index":0}]}

data: {"error":{"message":"The request could not be completed.","type":"upstream_error","code":502}}

data: [DONE]

Embeddings

Embeddings adalah representasi numerik teks yang menangkap makna semantik — mengubah teks menjadi vektor (deretan angka) yang dapat digunakan untuk berbagai tugas machine learning. BazaarLink menyediakan endpoint terpadu yang kompatibel dengan OpenAI Embeddings API, sehingga Anda dapat memanggil model embedding dari berbagai penyedia melalui satu antarmuka.

Respons embedding menggunakan ID permintaan BazaarLink yang buram dan sama dengan x-request-id; gunakan ID ini pada GET /v1/generation. Respons non-streaming juga mengembalikan ID yang sama di x-generation-id. usage.cost adalah jumlah USD yang ditagihkan kepada pelanggan untuk permintaan ini. Statistik dapat muncul beberapa detik setelah selesai; coba lagi sebentar jika mendapat 404.

Apa itu Embeddings?

Embeddings mengubah teks menjadi vektor berdimensi tinggi, di mana teks yang secara semantik mirip akan berdekatan dalam ruang vektor — misalnya, "kucing" dan "anak kucing" akan memiliki embedding yang mirip, sedangkan "kucing" dan "pesawat" akan sangat berjauhan. Representasi vektor ini memungkinkan mesin memahami hubungan antar teks, menjadikannya fondasi banyak aplikasi AI.

Kasus Penggunaan Umum

Kasus Penggunaan
Deskripsi
RAG (Generasi Augmented Pengambilan)Membangun sistem yang mengambil konteks relevan dari basis pengetahuan sebelum menghasilkan jawaban — embeddings menemukan dokumen paling relevan untuk disertakan dalam konteks LLM.
Pencarian SemantikMengubah dokumen dan kueri menjadi embeddings, lalu menemukan dokumen paling relevan berdasarkan kemiripan vektor — memahami makna, bukan sekadar mencocokkan kata kunci, sehingga hasilnya lebih baik daripada pencarian kata kunci.
Sistem RekomendasiMenghasilkan embeddings untuk item (produk, artikel, video) dan preferensi pengguna untuk merekomendasikan item serupa — perbandingan vektor menemukan item yang terkait secara semantik meskipun tidak ada kata kunci yang sama.
Clustering & KlasifikasiMengelompokkan dokumen serupa atau mengklasifikasikan teks dengan menganalisis pola embedding — dokumen dengan embedding serupa biasanya termasuk topik atau kategori yang sama.
Deteksi DuplikatMenemukan konten duplikat atau hampir duplikat dengan membandingkan kemiripan embedding — tetap berfungsi meskipun konten telah diparafrasekan.
Deteksi AnomaliMengenali konten yang tidak biasa atau outlier dengan mengidentifikasi embedding yang menyimpang jauh dari pola umum dataset.
POST/v1/embeddings
Note
Jika sumber upstream tidak mendukung model embeddings yang diminta, permintaan dapat mencoba sumber lain yang tersedia. Jika tidak ada yang mendukungnya, permintaan menghasilkan error.

Parameter

modelwajib
string
Model embedding yang digunakan, mis. "openai/text-embedding-3-small".
inputwajib
string | string[] | ContentItem[]
Teks yang akan di-embed — satu string, array string untuk satu panggilan batch, atau (untuk model yang mendukung) array item {content:[...]} yang menggabungkan bagian text dan image_url.
dimensions
integer
Ukuran vektor output yang diminta. Hanya dihormati oleh model yang mendukung dimensi variabel (mis. keluarga OpenAI text-embedding-3); diteruskan apa adanya ke penyedia upstream dan diabaikan oleh model yang tidak mendukungnya.
encoding_format
string
Format encoding embedding yang diminta, mis. "float" atau "base64". Diteruskan apa adanya ke penyedia upstream — dukungan tergantung pada model.
provider
object
Unsupported. The entire object is ignored and removed before forwarding; it cannot select an upstream or price tier.

Permintaan Dasar

from openai import OpenAI

client = OpenAI(
    base_url="https://api.bazaarlink.ai/v1",
    api_key="sk-bl-YOUR_API_KEY",
)

response = client.embeddings.create(
    model="openai/text-embedding-3-small",
    input="The quick brown fox jumps over the lazy dog",
)

print(response.data[0].embedding)  # 1536-dimensional vector

Pemrosesan Batch

Kirim array string untuk meng-embed beberapa teks dalam satu permintaan — lebih murah dan cepat daripada satu panggilan per teks.

response = client.embeddings.create(
    model="openai/text-embedding-3-small",
    input=[
        "Machine learning is a subset of artificial intelligence",
        "Deep learning uses neural networks with multiple layers",
        "Natural language processing enables computers to understand text",
    ],
)

for i, item in enumerate(response.data):
    print(f"Embedding {i}: {len(item.embedding)} dimensions")

Input Multimodal (Gambar + Teks)

Model dengan dukungan input gambar (output_modalities mencakup "embeddings" dan inputModalities mencakup "image") menerima item input berbentuk {content:[{type:"text",...}, {type:"image_url",...}]}, memungkinkan Anda meng-embed gambar sendiri atau bersama teks.

Tergantung model
Hanya sebagian model embedding yang menerima input gambar — periksa modalitas yang didukung model di halaman Models sebelum mengirim konten image_url. Model teks-saja akan menolak bentuk ini.
import requests

response = requests.post(
    "https://api.bazaarlink.ai/v1/embeddings",
    headers={
        "Authorization": "Bearer sk-bl-YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={
        "model": "google/gemini-embedding-2-preview",
        "input": [{
            "content": [
                {"type": "text", "text": "A scenic boardwalk through a green meadow"},
                {"type": "image_url", "image_url": {"url": "https://example.com/boardwalk.jpg"}},
            ]
        }],
        "encoding_format": "float",
    },
)

embedding = response.json()["data"][0]["embedding"]
print(f"Embedding dimension: {len(embedding)}")

Menemukan Model Embedding

Tidak ada endpoint khusus untuk mendaftar model embedding — panggil GET /v1/models lalu filter di sisi klien untuk entri yang output_modalities-nya mencakup "embeddings", atau jelajahi halaman Models.

Keterbatasan

  • Tidak ada streaming — embedding selalu dikembalikan sebagai respons lengkap, berbeda dengan chat completions.
  • Setiap model punya panjang input maksimum; teks yang melebihi batas akan dipotong atau ditolak di upstream.
  • Embedding untuk input yang identik bersifat deterministik — tidak ada temperature atau keacakan.

Praktik Terbaik

  • Pilih model sesuai trade-off kecepatan/kualitas/biaya — model lebih kecil (mis. qwen/qwen3-embedding-4b) lebih murah dan cepat; model lebih besar (mis. openai/text-embedding-3-large) umumnya meng-embed dengan fidelitas lebih tinggi.
  • Gabungkan beberapa teks dalam satu permintaan alih-alih satu panggilan per teks — lebih sedikit round trip, overhead lebih rendah.
  • Simpan hasil (cache) — embedding untuk input yang sama tidak pernah berubah, jadi simpan alih-alih membuatnya ulang.
  • Bandingkan dengan cosine similarity, bukan Euclidean distance — bersifat scale-invariant dan lebih baik untuk vektor berdimensi tinggi.
  • Perhatikan context length setiap model — dokumen panjang mungkin perlu dipecah (chunking) sebelum di-embed.

Parameter

Parameter sampling membentuk proses generasi token. BazaarLink meneruskan parameter yang didukung ke penyedia upstream; parameter yang tidak didukung diabaikan secara diam-diam.

Parameter Sampling

Murni passthrough — tidak ada default lokal
Nilai sampling diteruskan tanpa validasi rentang. Model dapat membatasi atau mengabaikan nilai di luar rentang yang didukung.
temperature
number
Nilai sampling diteruskan tanpa validasi rentang. Model dapat membatasi atau mengabaikan nilai di luar rentang yang didukung.
top_p
number
Massa probabilitas sampling nukleus. Default: 1
top_k
integer
Nilai sampling diteruskan tanpa validasi rentang. Model dapat membatasi atau mengabaikan nilai di luar rentang yang didukung.
frequency_penalty
number
Penalti token berulang. Rentang: [-2, 2]. Default: 0
presence_penalty
number
Penalti token berdasarkan kehadiran. Rentang: [-2, 2]. Default: 0
repetition_penalty
number
Kurangi pengulangan token dari input. Rentang: (0, 2]. Default: 1
min_p
number
Probabilitas minimum relatif terhadap token teratas. Rentang: [0, 1]. Default: 0
top_a
number
Top-P dinamis berdasarkan token probabilitas tertinggi. Rentang: [0, 1]. Default: 0
seed
integer
Seed integer untuk sampling deterministik. Tidak dijamin untuk semua model
max_tokens
integer
Jumlah maksimum token yang dihasilkan
n
integer
Jumlah completion yang dihasilkan. Default: 1
logit_bias
object
Peta ID token ke nilai bias [-100, 100] yang ditambahkan sebelum sampling. Hanya model keluarga OpenAI — lihat catatan di bawah.
logprobs
boolean
Kembalikan probabilitas log dari setiap token output. Hanya model keluarga OpenAI — lihat catatan di bawah.
top_logprobs
integer
Jumlah token paling mungkin per posisi (memerlukan logprobs: true). Rentang: 0–20. Hanya model keluarga OpenAI — lihat catatan di bawah.
response_format
object
Paksa output JSON terstruktur. Lihat bagian Output Terstruktur
structured_outputs
boolean
Meminta output yang sesuai skema JSON secara ketat pada penyedia yang mendukungnya. Diteruskan apa adanya
reasoning
object
Konfigurasi reasoning/thinking spesifik penyedia. Diteruskan apa adanya
reasoning_effort
string
Tingkat upaya reasoning gaya OpenAI seri-o: "low", "medium", atau "high". Diteruskan apa adanya
include_reasoning
boolean
true mengembalikan isi pemikiran di message.reasoning (delta.reasoning saat streaming); false mematikan pemikiran untuk model yang berpikir secara default (lihat bagian reasoning), sehingga tidak ada pemikiran yang ditagih. Tanpa reasoning_effort, reasoning, atau thinking, hanya model-model itu yang berpikir dan mengembalikannya secara default; model lain hanya jika diminta
stop
string | string[]
Urutan berhenti — generasi berhenti saat ditemukan
tools
Tool[]
Daftar tools (fungsi) yang dapat dipanggil model
tool_choice
string | object
Mengontrol penggunaan tool: "auto", "none", atau tool tertentu
parallel_tool_calls
boolean
Aktifkan pemanggilan fungsi paralel saat tools disediakan. Default: true. Hanya model keluarga OpenAI — lihat catatan di bawah.

Kredit

Query saldo kredit saat ini dan penggunaan API seumur hidup.

GET/v1/credits
Auth
Membutuhkan token Pembawa (kunci API standar sk-bl-...).

Contoh Permintaan

curl https://api.bazaarlink.ai/v1/credits \
  -H "Authorization: Bearer sk-bl-YOUR_KEY"

Respons

{
  "data": {
    "total_credits": 100.00,
    "total_usage": 12.34
  }
}

Errors: 401 (kunci missing/invalid), 403 (pengguna yang ditangguhkan).

Detail Generasi

Gunakan ID permintaan BazaarLink yang buram dari id respons atau header x-request-id pada GET /v1/generation; respons non-streaming juga menyertakan ID itu di x-generation-id. Statistik dapat muncul beberapa detik setelah selesai; coba lagi sebentar jika mendapat 404.

GET/v1/generation?id=<generation-id>
Auth
Memerlukan token Pembawa (kunci API standar). Parameter kueri yang diperlukan: id.

Contoh Permintaan

curl "https://api.bazaarlink.ai/v1/generation?id=BAZAARLINK_REQUEST_ID" \
  -H "Authorization: Bearer sk-bl-YOUR_KEY"

Respons

{
  "data": {
    "id": "85e6f35c71a31f19-SJC",
    "model": "openai/gpt-4o",
    "provider": "bazaarlink",
    "created_at": "2026-04-20T10:00:00.000Z",
    "app_name": "MyApp",
    "finish_reason": "stop",
    "status": 200,
    "duration_ms": 1234,
    "first_token_ms": 234,
    "throughput": 45.6,
    "usage": {
      "prompt_tokens": 100,
      "completion_tokens": 200,
      "total_tokens": 300,
      "prompt_tokens_details": { "cached_tokens": 50 },
      "completion_tokens_details": { "reasoning_tokens": 30 },
      "cost": 0.00123
    },
    "cost_breakdown": {
      "subtotal": 0.00123,
      "cache_discount": 0.00015,
      "total": 0.00108
    }
  }
}

Errors: 400 (id hilang), 401 (auth), 404 (generasi tidak ditemukan).

API Info Kunci

Query tingkat batas kecepatan kunci API saat ini dan penghitung penggunaan gabungan (format respons mengikuti konvensi API info kunci industri umum).

GET/v1/key
Auth
Membutuhkan token Pembawa (kunci API standar).

Respons

{
  "data": {
    "label": "Production Key",
    "limit": null,
    "limit_remaining": 100.00,
    "limit_reset": null,
    "expires_at": null,
    "is_free_tier": false,
    "is_management_key": false,
    "is_provisioning_key": false,
    "usage": 12.34,
    "usage_daily": 0.12,
    "usage_weekly": 0.45,
    "usage_monthly": 1.23,
    "requests": 1234,
    "requests_daily": 10,
    "requests_weekly": 50,
    "requests_monthly": 200,
    "rate_limit": { "requests": 600, "interval": "1m", "note": "Paid-tier rate limit." }
  }
}
Note
is_free_tier = benar bila saldo kredit < $10. Windows dalam format UTC: harian = hari ini, mingguan = Senin–Minggu, bulanan = 1–EOM. Ketika kunci memiliki batas pembelanjaan per kunci yang ditetapkan (melalui parameter batas pada kunci creation/update), limit / limit_remaining / limit_reset mencerminkan batas tersebut dan penggunaan periode yang cocok; jika tidak, limit adalah nol dan limit_remaining akan dikembalikan ke saldo kredit akun Anda. expired_at adalah waktu kedaluwarsa kunci (null jika tidak ada). is_management_key dan is_provisioning_key adalah alias untuk konsep yang sama — keduanya berlaku untuk kunci manajemen.
BYOK
BazaarLink tidak menawarkan program bawa kunci Anda sendiri (BYOK), jadi titik akhir ini tidak mengembalikan bidang byok_usage apa pun.

Errors: 401 (auth), 404 (pengguna hilang — jarang terjadi). Saldo Poin

Kode Error

Format respons kesalahan

Envelope error berbeda menurut endpoint. Gunakan status HTTP dan error.type bila tersedia. error.code dapat berupa string atau status numerik, atau tidak ada; error.message hanya untuk ditampilkan.

{
  "error": {
    "message": "Insufficient credits. Please top up to continue.",
    "type": "invalid_request_error",
    "code": "insufficient_credits"
  }
}

HTTP status dan kode kesalahan

Envelope error berbeda menurut endpoint. Gunakan status HTTP dan error.type bila tersedia. error.code dapat berupa string atau status numerik, atau tidak ada; error.message hanya untuk ditampilkan.

Kode
Nama
Deskripsi
424Dependensi GagalKunci BYOK yang Anda atur sendiri ditolak oleh penyedia upstream; periksa atau ganti di pengaturan BYOK. Ini hanya muncul dalam mode strict
400Permintaan BurukPermintaan salah format, array messages kosong, atau field wajib hilang
401Tidak SahKunci API hilang, tidak valid, atau dinonaktifkan
402Pembayaran DiperlukanKredit akun tidak cukup, batas pengeluaran per kunci tercapai, atau batas anggaran bulanan/mingguan terlampaui
403DilarangAkun ditangguhkan atau tidak memiliki izin
404Tidak DitemukanRequested model, generation, key, or other resource does not exist
409KonflikResource is not in the required state, such as an incomplete video job
410HilangRequested model has been retired and must be replaced
413Muatan Terlalu BesarBody permintaan melebihi 10 MB; kurangi ukuran konten atau pecah permintaan
416Rentang Tidak MemuaskanRequested byte range is invalid for generated video content
429Terlalu Banyak PermintaanBatas rate terlampaui; periksa header Retry-After sebelum mencoba ulang
432Kuota Gratis HabisEndpoint kompatibel Tavily (/v1/search, /v1/extract, /v1/crawl, /v1/map): kuota pencarian gratis sudah habis, atau saldo nol atau kurang; tambahkan kredit untuk melanjutkan. Isi respons berformat Tavily: {"detail":{"error":"..."}}
500Kesalahan ServerError internal BazaarLink
502Gerbang BurukTidak ada sumber upstream yang dapat menangani permintaan; permintaan menghasilkan error.
503Layanan Tidak TersediaTidak ada penyedia upstream yang dikonfigurasi untuk model ini; hubungi admin
504Gateway Batas WaktuUpstream connection or stream stalled and timed out

Kode penagihan yang dapat dibaca mesin

A 402 can represent different controls. Use these stable codes to choose the correct action.

Kode
Deskripsi
byok_key_invalidKunci BYOK yang Anda atur sendiri ditolak oleh penyedia upstream; periksa atau ganti di pengaturan BYOK. Ini hanya muncul dalam mode strict.
budget_cap_reachedA weekly or monthly budget cap was reached; raise or reset the cap.
credit_limit_exceededA monthly-billing organization's credit line was exhausted; contact billing.
insufficient_creditsThe prepaid balance is insufficient; add credits.
spend_limit_exceededThe API key reached its daily, weekly, or monthly spend limit.
capacity_unavailableThis model is temporarily at capacity. Retry shortly; the Retry-After header says how long to wait.

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.

Model dan titik akhir
Kesalahan pencarian model, siklus hidup, harga, modalitas, dan kompatibilitas titik akhir.
Kode
HTTP
unknown_model400
invalid_model_id400
model_not_found404
model_retired410
model_endpoint_mismatch400
embedding_on_chat_endpoint400
model_not_priced400
invalid_modality_for_model400
Permintaan dan keamanan
Parameter, konteks, alat, skema, dan penolakan keamanan konten tidak valid.
Kode
HTTP
missing_required_field400
unsupported_param400
max_tokens_invalid400
context_too_long400
tool_use_unsupported400
malformed_tool_messages400
invalid_response_format_schema400
invalid_tools_definition400
content_moderation403
content_filter403
unknown_4xx400
Pembuatan dan pengeditan gambar
Masukan gambar, pengeditan multibagian, keluaran, dan kesalahan saluran gambar.
Kode
HTTP
invalid_image_url400
input_images_not_supported400
invalid_content_type400
mask_not_supported400
unsupported_response_format400
missing_prompt400
missing_image400
too_many_images400
invalid_image_type400
image_too_large400
invalid_n400
pipeline_error502
no_images502
Perutean hulu
Konektivitas penyedia yang disanitasi, autentikasi, pembatasan, dan kesalahan ketersediaan.
Kode
HTTP
upstream_unreachable502
upstream_auth_failed502
upstream_rate_limited429
capacity_unavailable429
upstream_unavailable502/503
byok_key_invalid424

Moderasi Konten

Semua permintaan secara otomatis ditinjau sebelum dikirim ke model. Permintaan yang melanggar kebijakan penggunaan kami akan ditolak sebelum dikirim ke model, dan mengembalikan error 403.

Kategori yang akan diblokir

Moderasi didasarkan pada Kebijakan Penggunaan yang Dapat Diterima (Acceptable Use Policy) kami dan terutama memblokir kategori konten berikut:

  • Konten eksploitasi seksual
  • Ancaman kekerasan
  • Panduan operasional untuk tindakan ilegal
  • Konten terkait bahaya biologis

Format respons 403

Permintaan yang diblokir oleh moderasi akan mengembalikan error dengan format berikut:

{
  "error": {
    "message": "Your prompt was blocked by content moderation.",
    "type": "invalid_request_error",
    "code": "content_filter"
  }
}

Permintaan yang diblokir tidak dikenakan biaya — Anda tidak akan dikenakan biaya untuk permintaan yang ditolak.

Mengajukan banding atas kesalahan deteksi

Jika Anda yakin suatu permintaan diblokir secara keliru, hubungi dukungan dengan menyertakan waktu permintaan dan (jika memungkinkan) request id — kami akan meninjaunya.

Privasi

Setiap permintaan secara otomatis ditinjau untuk kepatuhan kebijakan konten.

Permintaan yang terbukti melanggar kebijakan akan disimpan kontennya sebagai bukti kepatuhan.

Permintaan lainnya tidak akan disimpan konten prompt lengkapnya.

Batas tarif, anggaran, dan rem darurat

These controls can reject an otherwise valid request and require different recovery actions.

Kontrol
HTTP
Cara mengidentifikasinya
Batas kecepatan permintaan429Kode string atau kode numerik 429; gunakan header Retry-After dan X-RateLimit-*.
Blok penalti batas tarif429Kode numerik 429 dan pesan pembatasan sementara; gunakan Coba Lagi-Setelah.
Global menghabiskan rem darurat503Kode numerik 503, pesan batas pembelanjaan global, dan Coba Lagi Setelah 30 atau 300 detik.
Scoped spend brake429Numeric code 429 and a spend circuit-breaker message naming the scope.
Penagihan dan kontrol anggaran402Gunakan kode string penagihan stabil yang tercantum di atas.

Envelope error berbeda menurut endpoint. Gunakan status HTTP dan error.type bila tersedia. error.code dapat berupa string atau status numerik, atau tidak ada; error.message hanya untuk ditampilkan.

Status sumber daya video dan media

Video validation commonly returns numeric code 400. Missing jobs return 404, retired models 410, unfinished video content 409, and invalid video byte ranges 416.

Kebijakan coba lagi

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.

Coba lagi dengan backoff
429, 502, 503, and 504. Check the original generation job before creating another after an ambiguous network failure.
Perbaiki sebelum mencoba lagi
400, 401, 402, 403, 404, 409, 410, 413, and 416. Fix the request, credentials, balance, permissions, resource state, or Range header first.

Menangani Error

import random
import time
from openai import OpenAI, APIStatusError

client = OpenAI(
    base_url="https://api.bazaarlink.ai/v1",
    api_key="sk-bl-YOUR_API_KEY",
    max_retries=0,  # Avoid double retries; this example handles them.
)

RETRYABLE = {429, 502, 503, 504}

for attempt in range(5):
    try:
        response = client.chat.completions.create(
            model="openai/gpt-4o",
            messages=[{"role": "user", "content": "Hello!"}],
        )
        break
    except APIStatusError as error:
        if error.status_code not in RETRYABLE or attempt == 4:
            raise
        retry_after = error.response.headers.get("Retry-After")
        delay = (
            float(retry_after)
            if retry_after
            else min(8, 0.5 * (2 ** attempt)) + random.uniform(0, 0.25)
        )
        time.sleep(delay)

Format Error Streaming

Error yang terjadi sebelum token apa pun di-stream mengembalikan respons error HTTP standar dengan body JSON.

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.

Jika stream gagal setelah dimulai, BazaarLink dapat mengirim event SSE terakhir dengan objek error tingkat atas, diikuti data: [DONE]. Perlakukan respons sebagai belum lengkap; jangan gunakan output parsial sebagai hasil akhir.

data: {"error":{"message":"The request could not be completed.","type":"upstream_error","code":502}}

data: [DONE]

// Branch on error.code; error.type can vary by failure path.

BazaarLink menyediakan satu jalur API stabil, /v1 — tidak ada versi berbasis tanggal atau header versi yang perlu dikelola. API berkembang secara berkelanjutan, bukan melalui rilis bernomor.

Perubahan Non-Breaking

Perubahan ini dirilis tanpa pemberitahuan sebelumnya:

  • Endpoint baru
  • Model baru ditambahkan ke katalog
  • Parameter permintaan opsional baru
  • Field respons baru
  • Skema baru dengan properti opsional
  • Kode status/error respons tambahan
Tulis klien secara defensif
Abaikan field respons yang tidak Anda kenali, dan jangan gagal pada nilai yang tidak dikenal di field bertipe enum — nilai baru ditambahkan seiring bertambahnya katalog dan fitur.

Perubahan Breaking

Perubahan ini jarang terjadi, dan mencakup:

  • Menghapus atau mengganti nama endpoint, parameter, atau field respons
  • Mengubah tipe suatu field
  • Menjadikan parameter opsional sebagai wajib

Jika terjadi, perubahan breaking berlaku pada endpoint tertentu, bukan seluruh permukaan /v1 — tidak ada satu lompatan versi yang bisa merusak semua integrasi sekaligus. Kami belum mempublikasikan changelog resmi dengan tag Breaking (lihat "Tetap Update" di bawah) — untuk hal yang kritis bagi integrasi Anda, hubungi Support sebelum mengandalkan perilaku yang tidak terdokumentasi.

Kebijakan Deprecation

Satu peristiwa "breaking" rutin yang perlu Anda antisipasi: model tertentu dipensiunkan seiring penyedia upstream men-deprecate-nya. Periksa status model saat ini melalui GET /v1/models.

GET https://api.bazaarlink.ai/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" } }

Tetap Update

Kami belum mempublikasikan changelog API khusus atau RSS feed. Untuk saat ini, periksa langsung halaman ini, pantau status model melalui GET /v1/models, atau hubungi Support jika Anda memerlukan pemberitahuan lebih awal untuk integrasi yang kritis.

Support
Support
Hi! How can we help you?
Send a message and we'll get back to you soon.
Referensi API | Chat, Embedding, dan Perutean Model