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。
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.
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
1
2
3
4
5
6
7
8
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.
finish_reason memakai nilai standar BazaarLink seperti stop, length, tool_calls, content_filter, dan error.
JSON
1
2
3
{"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.
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.
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.
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.
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
typeResponse = {
id: string;
object: "chat.completion" | "chat.completion.chunk";
created: number; // Unix timestampmodel: string;
choices: (NonStreamingChoice | StreamingChoice)[];
usage?: ResponseUsage;
};
typeNonStreamingChoice = {
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 sectionreasoning_details?: Array<{ type: string; text?: string }>;
};
};
typeStreamingChoice = {
index: number;
finish_reason: string | null;
delta: {
role?: string;
content?: string | null;
tool_calls?: ToolCall[];
reasoning?: string;
reasoning_details?: Array<{ type: string; text?: string }>;
};
};
typeResponseUsage = {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
cost: number; // USD amount charged to the customer for this requestprompt_tokens_details?: {
cached_tokens: number; // Tokens served from prompt cache (reduced cost)cache_write_tokens?: number; // Tokens written to cache in this requestaudio_tokens?: number;
};
completion_tokens_details?: {
reasoning_tokens?: number; // Thinking/reasoning tokens (e.g. o3, Qwen3, DeepSeek R1)image_tokens?: number;
};
};
typeToolCall = {
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.
1
2
3
4
5
6
7
8
9
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.
1
2
3
4
5
6
7
8
9
10
11
12
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.
1
2
3
4
5
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.
1
2
3
4
5
6
7
8
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)
1
2
3
4
5
6
# 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.
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.
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}.
Kredit dicadangkan saat submit berdasarkan estimasi skenario terburuk. Setelah job selesai, usage.cost adalah jumlah USD yang ditagihkan kepada pelanggan.
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 ID
Modality
Tasks
minimax/hailuo-3-max
text+image->video
t2v, i2v
google/veo-3.1
text+image->video
t2v, i2v
bytedance/seedance-2.5
text+image+audio+video->video
—
x-ai/grok-imagine-video-1.5-lite
text+image->video
t2v, i2v
bytedance/seedance-2.0
text+image+audio+video->video
t2v, i2v
bytedance/seedance-1-5-pro
text+image->video
t2v, i2v
bytedance/seedance-2.0-fast
text+image+audio+video->video
t2v, 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.
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.
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
1
2
3
4
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.
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
Parameter
Tipe
Wajib
Deskripsi
model
string
Ya
ID model suara, misalnya elevenlabs/eleven-flash-v2.5.
input
string
Ya
Teks 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.
voice
string
Ya
Suara yang digunakan; formatnya bergantung pada model. Lihat aturan suara di bawah.
response_format
string
Tidak
mp3 (bawaan) atau pcm. API menerima opus, aac, flac, dan wav, tetapi model ElevenLabs saat ini menolaknya dengan 400.
speed
number
Tidak
Kecepatan bicara dari 0.25 hingga 4.0. Tidak semua model menerapkannya.
instructions
string
Tidak
Instruksi gaya suara. Tidak semua model menerapkannya.
stability
number
Tidak
Stabilitas 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_boost
number
Tidak
Kemiripan dengan suara asli, 0–1 (bawaan 0,75). Tidak dipakai oleh Eleven v3.
style
number
Tidak
Penekanan gaya, 0–1 (bawaan 0). Di atas 0 menambah latensi. Tidak dipakai oleh Eleven v4.
use_speaker_boost
boolean
Tidak
Meningkatkan kemiripan dengan pembicara asli (bawaan true); menambah sedikit latensi.
clone_strength
number
Tidak
Kekuatan kloning, 0–1 (0 disarankan untuk kebanyakan suara). Hanya untuk suara klon profesional milik Anda (voice_…) yang dilatih untuk Eleven v4.
language_code
string
Tidak
Kode bahasa dua huruf kecil (ISO 639-1) seperti ar, ja, atau en untuk menetapkan bahasa ucapan. Tidak dipakai oleh model multilingual-v2.
audio_effects
object
Tidak
Objek 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.
Suara
Deskripsi
Pratinjau
george
Male, middle-aged, British accent. Mature and steady, suited to narration and storytelling.
sarah
Female, young adult, American accent. Professional and clear, suited to broadcast-style reading.
adam
Male, middle-aged, American accent. Everyday and approachable, suited to short social videos.
alice
Female, middle-aged, British accent. Professional and informative, suited to explainers and teaching.
bella
Female, middle-aged, American accent. Professional and informative, suited to explainers and teaching.
bill
Male, senior, American accent. Crisp and direct, suited to advertising voice-overs.
brian
Male, middle-aged, American accent. Polished and refined, suited to social and brand content.
callum
Male, middle-aged, American accent. Expressive, suited to characters and animation.
charlie
Male, young adult, Australian accent. Energetic and lively, suited to conversation.
chris
Male, middle-aged, American accent. Relaxed and casual, suited to conversation.
daniel
Male, middle-aged, British accent. Formal and measured, suited to news-style and educational reading.
eric
Male, middle-aged, American accent. Polished and warm, suited to conversation.
harry
Male, young adult, American accent. Rough and gritty, suited to character voices.
jessica
Female, young adult, American accent. Bright and cute, suited to conversation.
laura
Female, young adult, American accent. Playful with attitude, suited to social content.
liam
Male, young adult, American accent. Confident and upbeat, suited to social content.
lily
Female, middle-aged, British accent. Confident and clear, suited to explainers and teaching.
matilda
Female, middle-aged, American accent. Upbeat and friendly, suited to explainers and teaching.
river
Neutral voice, middle-aged, American accent. Calm and even, suited to conversation.
roger
Male, middle-aged, American accent. Polished and confident, suited to conversation.
will
Male, 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.
1
2
3
4
5
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.
Permintaan 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).
401
Kunci API tidak ada atau tidak valid. Kirim Authorization: Bearer dengan kunci BazaarLink Anda.
402
Saldo tidak cukup. Isi ulang lalu coba lagi.
403
Kunci pengelolaan tidak dapat memanggil model, atau akun ditangguhkan. Gunakan kunci API biasa.
429
Batas laju tercapai. Tunggu sesuai Retry-After lalu coba lagi.
502
Layanan model sementara tidak tersedia atau pengiriman audio terputus. Coba lagi; permintaan yang gagal tidak dikenai biaya.
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
Parameter
Tipe
Wajib
Deskripsi
model
string
Ya
ID model transkripsi, misalnya elevenlabs/scribe-v2.
json (bawaan) mengembalikan {text}; verbose_json menambahkan bahasa, durasi, dan segments/words.
language
string
Tidak
Petunjuk bahasa opsional seperti en atau zh. Kosongkan untuk deteksi otomatis.
prompt
string
Tidak
Teks konteks opsional untuk membantu mengenali nama dan istilah. Tidak semua model menerapkannya.
timestamp_granularities[]
string[]
Tidak
word 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.
Permintaan 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.
401
Kunci API tidak ada atau tidak valid.
402
Saldo tidak cukup. Isi ulang lalu coba lagi.
413
audio_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.
429
Batas laju tercapai. Tunggu sesuai Retry-After lalu coba lagi.
502
Layanan model sementara tidak tersedia atau transfer audio terputus. Coba lagi; permintaan gagal tidak dikenai biaya.
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
Field
Tipe
Wajib
Deskripsi
name
string
Ya
Nama suara, 1–60 karakter.
files
file[]
Ya
1 sampai 5 file rekaman suara tersebut (mp3, wav, m4a, ogg, flac, webm).
consent
boolean
Ya
Harus true: Anda menegaskan berhak mengkloning dan menggunakan suara ini (lihat Persetujuan).
consent_statement_version
string
Ya
Versi pernyataan persetujuan yang Anda setujui. Saat ini "v1".
description
string
Tidak
Opsional, maksimal 200 karakter.
remove_background_noise
boolean
Tidak
Boolean 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.
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.
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
Status
Kode
Arti
400
bad_request
Permintaan salah format: bukan multipart/form-data, tidak ada file audio, description terlalu panjang, atau limit di luar 1–100.
400
consent_required
consent=true tidak ada.
400
consent_version_mismatch
Versi pernyataan persetujuan sudah usang; setujui ulang dengan versi saat ini.
400
invalid_voice_name
Nama kosong, lebih dari 60 karakter, atau tidak diizinkan.
400
too_many_files
File audio lebih dari 5.
401
invalid_api_key
API key tidak ada atau tidak valid.
402
insufficient_balance
Saldo terlalu rendah (biaya pembuatan atau saldo minimum).
403
email_unverified
Verifikasi alamat email Anda terlebih dahulu.
403
voice_cloning_not_enabled
Akun Anda belum diaktifkan untuk suara kustom; hubungi dukungan pelanggan untuk mengajukan.
403
voice_cloning_disabled
Suara kustom belum diaktifkan untuk layanan ini saat ini.
404
voice_not_found
Suara tidak ada (atau bukan milik Anda).
404
not_found
Tidak ditemukan, termasuk setiap permintaan /v1/voices selama fitur belum diaktifkan untuk akun Anda.
405
method_not_allowed
Metode itu tidak tersedia pada path ini.
409
duplicate_request
Idempotency-Key yang sama masih diproses; tunggu lalu coba lagi.
413
file_too_large
Sebuah file melebihi 10 MB atau seluruh file melebihi 25 MB.
415
unsupported_file_type
Jenis audio tidak didukung; gunakan mp3, wav, m4a, ogg, flac, webm.
422
voice_rejected
Pemeriksaan 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.
429
voice_create_rate_limited
Batas pembuatan harian tercapai; coba lagi besok (UTC).
429
voice_limit_reached
Anda telah mencapai jumlah maksimum suara kustom.
502
upstream_failed
Suara tidak dapat dibuat; Anda tidak ditagih. Coba lagi dengan Idempotency-Key baru.
503
voice_capacity_full
Kapasitas suara kustom sedang penuh; Anda tidak ditagih. Coba lagi nanti.
504
upstream_timeout
Layanan 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
Kode
Tipe
Wajib
Arti
platform
string
Ya
ID platform dari katalog, seperti twitter atau instagram.
action
string
Ya
Aksi yang didukung platform tersebut; lihat katalog untuk pasangan yang tersedia.
params
object
Tidak
Input khusus aksi. Gunakan required_params dan optional_params di katalog.
mode
sync | async
Tidak
Opsional. async mengembalikan job untuk dipolling; aksi khusus asinkron tetap mengembalikan job meski tidak dicantumkan.
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.
{"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.
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.
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
1
2
3
4
5
6
7
8
9
10
11
12
13
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?"},
],
}],
)
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,...`)
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.
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.
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 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
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{"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.
// /v1/models — Response SchematypeModelsResponse = {
data: Model[];
};
typeModel = {
id: string; // Model ID (e.g. "openai/gpt-4o")name: string; // Human-readable namecontext_length: number | null; // Max context window in tokensmodality: 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 oneinput_cache_write?: string; // Cache write price per token (USD); only when the model publishes oneimage_output?: string; // Image output price per token (USD); only token-billed image models (display only)
};
description?: string | null; // Model descriptiontop_provider?: {
max_completion_tokens?: number;
};
supported_parameters?: string[]; // e.g. ["tools", "response_format", "reasoning"]pricing_tiers?: { // Present only for models with input-length tiersabove_prompt_tokens: number; // Ascending; strict "greater than" thresholdprompt: string; // USD per token, override tiercompletion: string; // USD per token, override tierinput_cache_read?: string; // USD per token, only when the tier overrides itinput_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.
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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.
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.
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].
1
2
3
4
5
6
7
: 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
importOpenAIfrom"openai";
const client = newOpenAI({
baseURL: "https://api.bazaarlink.ai/v1",
apiKey: "sk-bl-YOUR_API_KEY",
});
const controller = newAbortController();
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 }
);
forawait (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).
1
2
3
4
5
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
1
2
3
4
5
6
7
8
9
10
11
12
13
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.
1
2
3
4
5
6
7
8
9
10
11
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 inenumerate(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.
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.
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-...).
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.
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.
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.
1
2
3
4
5
6
7
{"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:
1
2
3
4
5
6
7
{"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-*.
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 inrange(5):
try:
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Hello!"}],
)
breakexcept APIStatusError as error:
if error.status_code notin RETRYABLE or attempt == 4:
raise
retry_after = error.response.headers.get("Retry-After")
delay = (
float(retry_after)
if retry_after
elsemin(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.
1
2
3
4
5
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.
1
2
3
4
5
6
7
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