Dokumentasi BazaarLink
BazaarLink adalah gateway API AI terpadu untuk Taiwan — menyediakan akses ke ratusan model dari OpenAI, Anthropic, Google, Meta, dan lainnya melalui satu endpoint API yang kompatibel dengan OpenAI.
Read https://bazaarlink.ai/skill.md and follow the instructions to integrate BazaarLink into your app.Harga
BazaarLink menetapkan harga penggunaan model dengan markup nol (sama dengan daftar harga resmi masing-masing penyedia). Biaya platform dibebankan saat isi ulang (deposit): biaya transaksi 10%, ditambah 5% Taiwan VAT di saluran TWD. Ditagih dalam USD dengan kutipan TWD dan faktur terpadu elektronik. Top-up bayar sesuai pemakaian layanan mandiri; perusahaan dapat mengatur penagihan bulanan (Net-30, dapat dinegosiasikan).
Cara kerja
- Konsumsi (debit): setiap panggilan API ditagih berdasarkan penggunaan token aktual sesuai harga daftar USD resmi penyedia, dipotong dari saldo Anda — tanpa markup, tanpa biaya tambahan untuk konsumsi.
- Top-up (deposit): TWD dikonversi menjadi USD dengan kurs jual real-time dan ditambahkan ke saldo Anda; biaya transaksi 10% dibebankan saat isi ulang.
- • Metode pembayaran dan biaya khusus kanal ditampilkan pada checkout langsung.
- • Kanal TWD yang memenuhi syarat menampilkan pajak dan ketentuan faktur elektronik Taiwan sebelum pembayaran.
- • Transfer bank: untuk isi ulang skala besar atau perusahaan, hubungi kami untuk mengatur transfer kawat dan pembuatan faktur khusus.
- Faktur hanya tersedia melalui kanal yang sedang ditawarkan dan ditandai memenuhi syarat, atau melalui ketentuan perusahaan yang telah dikonfirmasi. Hubungi tim penjualan sebelum membayar bila memerlukan nomor pajak, penawaran, atau tagihan bulanan.
Tentang nilai tukar
Konversi valuta asing menggunakan kurs real-time; penagihan bulanan menggunakan tarif pada waktu penagihan (laporan), sedangkan isi ulang prabayar dikonversi berdasarkan tarif waktu isi ulang. Tarif dan stempel waktu disimpan dalam catatan penagihan.
Perlindungan tagihan untuk permintaan gagal
Jika permintaan upstream gagal tanpa data penggunaan yang dapat ditagih, BazaarLink otomatis mengembalikan seluruh jumlah yang dicadangkan. Tagihan percobaan tersebut tetap USD 0 meskipun stream sudah dimulai sebelum gagal.
- Upstream tidak dapat terhubung, menolak permintaan, atau tidak memberikan hasil yang dapat digunakan
- Stream berhenti sebelum catatan penggunaan akhir diterima, meskipun sebagian konten sudah dikirim
- Respons tidak memiliki usage atau hanya memiliki objek usage kosong dengan semua nilai nol
0 token output tidak selalu berarti gratis
usage.cost adalah jumlah USD yang ditagihkan untuk permintaan ini. Respons dengan 0 output token tetap dapat dikenai biaya input token; cek usage.cost atau catatan Activity untuk jumlah akhir.
Mulai Cepat
Tiga Cara Integrasi
Mulai dalam waktu kurang dari 5 menit. BazaarLink sepenuhnya kompatibel dengan OpenAI SDK — cukup ubah
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.
Base URL
https://api.bazaarlink.ai/v1api.bazaarlink.ai adalah titik masuk khusus API yang di-deploy terpisah dari situs web. Base URL sebelumnya https://bazaarlink.ai/api/v1 tetap didukung penuh — integrasi yang ada tidak perlu diubah.
Menggunakan OpenAI SDK
BazaarLink sepenuhnya kompatibel dengan OpenAI SDK. Cukup ubah base URL dan kunci API — semua kode lainnya tetap sama.
sk-bl-.Bawa Kunci Sendiri (BYOK)
Hubungkan kunci API upstream ke akun pribadi atau organisasi. Permintaan yang memenuhi syarat menggunakan kunci Anda lebih dulu. Setelah upstream error, permintaan dapat mencoba sumber lain yang tersedia; jika tidak ada, permintaan menghasilkan error. Kelola kunci pribadi di halaman kunci dan kunci organisasi di pengaturan organisasi. Buka pengaturan BYOK →
Penyaringan konten
Perlindungan konten dua arah untuk lalu lintas API Anda: permintaan yang terdeteksi membawa prompt injection diblokir (400), dan data sensitif pada permintaan maupun respons (kunci API, nomor kartu, nomor identitas, dll.) otomatis disamarkan. Aturan dan daftar pengecualian dapat disesuaikan, lengkap dengan statistik penggunaan. Buka pengaturan filter konten →
Pencarian web (:online)
Mencari di web sebelum model menjawab dan memberikan hasil pencarian sebagai referensi kepada model. Cocok untuk pertanyaan yang membutuhkan informasi terbaru, seperti berita, harga, kebijakan, atau produk yang baru dirilis.
Endpoint yang didukung
POST /api/v1/chat/completionsPOST /api/v1/messagesPOST /api/v1/responses
Streaming (stream: true) dan non-streaming didukung.
Cara menggunakan
Cara 1: tambahkan :online setelah nama model
curl https://bazaarlink.ai/api/v1/chat/completions \
-H "Authorization: Bearer $BAZAARLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.4-mini:online",
"messages": [{ "role": "user", "content": "Berita AI apa yang ada di Taiwan hari ini?" }]
}'Cara 2: gunakan parameter plugins
Cara 3: gunakan web_search_options
{
"model": "gpt-5.4-mini",
"messages": [{ "role": "user", "content": "..." }],
"web_search_options": { "search_context_size": "high", "query_source": "conversation" }
}Gunakan salah satu cara ini, atau gabungkan beberapa cara.
Parameter pencarian
Parameter berikut dapat ditempatkan pada item web di plugins atau di web_search_options; jika keduanya menentukan nilai berbeda, plugins yang diprioritaskan.
search_promptTeks apa pun—Menentukan kueri pencarian secara langsung. Jika ada, diprioritaskan daripada query_source.query_sourcelast_user, conversationlast_userSumber kueri saat search_prompt tidak ada. last_user hanya memakai pesan pengguna terakhir; conversation memakai seluruh percakapan tanpa pesan sistem.countryNama negara dalam bahasa Inggris huruf kecil (misalnya taiwan, japan, united states)Semua wilayahMemprioritaskan sumber dari negara tersebut. Jika dihilangkan, wilayah tidak dibatasi. Saat country ditentukan, jenis pencarian ditetapkan ke pencarian umum (general); topic: "news" secara bersamaan menghasilkan 400.topicgeneral, newsgeneralJenis pencarian. Jika dihilangkan, pencarian umum (general) digunakan; tetapkan topic: "news" secara eksplisit bila membutuhkan hasil berita.search_queriesArray string, 1–5 item—Menentukan beberapa kueri sekaligus. Setiap kueri dicari sekali dan dikenai satu biaya pencarian; hasil digabung dan URL duplikat dihapus sebelum diberikan kepada model. Tidak dapat dipakai bersama search_prompt. Jika sebagian gagal, jawaban dilanjutkan dengan hasil yang berhasil dan hanya jumlah yang berhasil yang dikenai biaya; semua gagal baru mengembalikan 503 tanpa biaya.time_rangeday, week, month, year (juga menerima d/w/m/y, past_day, 24h, 7d, 30d, 365d; nama parameter juga dapat recency atau search_recency_filter)Tanpa batasHanya mencari konten dalam periode yang ditentukan.languageKode bahasa ISO 639-1 (seperti zh, en, ja), tunggal atau arrayTanpa batasMemprioritaskan konten dalam bahasa tersebut. Jika array diberikan, saat ini hanya bahasa pertama yang dipakai.include_domainsArray string domain dengan wildcard (misalnya *.gov.tw)—Hanya mencari domain ini, maksimal 300 domain dan 253 karakter per domain.exclude_domainsArray string domain dengan wildcard—Mengecualikan domain ini, maksimal 150 domain.max_results1–10Menurut levelJumlah sumber referensi yang dikembalikan. Dapat juga ditulis sebagai num_results.enginebasic, fast, ultra-fast, advancedMenurut levelMenentukan kedalaman pencarian secara langsung dan memiliki prioritas tertinggi. Nilai lain, termasuk nama mesin pencari platform lain, memakai kedalaman default dan tidak menghasilkan error. (Hanya plugins)modeturbo, instant, fast, basic, advanced, deep—Cara lain menentukan kedalaman: turbo/instant → tercepat, fast → cepat, basic → standar, advanced/deep → lanjutan. Nilai yang tidak dikenali diabaikan.search_context_sizelow, medium, high, fastmediumLevel pencarian; lihat tabel di bawah. (Hanya web_search_options)Prioritas kedalaman: engine (empat nilai di atas) > mode > search_context_size > default medium.
Format parameter plugins dan web_search_options kompatibel dengan OpenRouter, sehingga permintaan yang ada dapat langsung digunakan.
Format alat pencarian yang juga kompatibel dengan Vercel AI Gateway
tools pada Chat Completions juga menerima format alat pencarian berikut. Format ini dianggap sebagai satu pencarian web, diproses oleh pencarian web platform ini, dengan penagihan dan format sitasi yang sama:
typeyang diterima:vercel:perplexity_search,vercel:exa_search,vercel:parallel_search,vercel:tako_search. Semuatypeini memiliki perilaku dan biaya yang sama.config.querydiperlakukan sebagaisearch_prompt;config.max_results(ataunum_results),config.country, dan lainnya dipetakan ke parameter dengan nama sama di atas; bidang yang tidak dikenali diabaikan.- Alat pencarian ini tidak diteruskan ke model.
- Jika satu permintaan berisi beberapa alat pencarian, hanya yang pertama yang dipakai.
Alat `web_search_preview` juga diterima
Masukkan { "type": "web_search_preview" } di tools pada Responses dan endpoint lain; ini juga dianggap sebagai satu pencarian web dan diproses oleh pencarian web platform ini dengan penagihan dan format sitasi yang sama. Alat ini tidak diteruskan ke model.
Saat beberapa format dipakai bersamaan
:online, plugins, web_search_options, dan alat pencarian (termasuk web_search_preview) dapat muncul bersamaan, tetapi setiap permintaan hanya menjalankan satu pencarian dan dikenai satu biaya; search_queries dihitung per kueri. Prioritas kueri: search_queries > config.query alat pencarian > search_prompt > query_source. Parameter lain digabung sesuai prioritas di atas.
400 invalid_web_search_options hanya dikembalikan untuk kesalahan tipe parameter, seperti angka pada engine atau include_domains yang bukan array string, atau nilai di luar rentang.
Level pencarian
lowStandarMaks. 5Lebih ringkasmediumStandarMaks. 10Level defaulthighLanjutanMaks. 10Pencarian lebih dalam, harga satuan lebih tinggifastCepatMaks. 10Respons lebih cepatJika level tidak ditentukan, digunakan medium.
Sumber sitasi dalam respons
Sumber yang ditemukan dikembalikan melalui annotations dengan format umum industri url_citation:
- Setiap sumber referensi memiliki satu sitasi.
- Jika model menandai sumber terkait dalam jawaban (misalnya
[source-1]),start_indexdanend_indexmenunjukkan posisi tanda itu dalam teks jawaban; tanpa tanda, keduanya0.
Lokasi berdasarkan endpoint:
- Chat Completions: non-streaming berada di
choices[].message.annotations; streaming mengirim blok tambahan yang hanya berisidelta.annotationssebelum[DONE]. - Responses: berada di
annotationsdalamoutput_text; streaming mengirimkannya bersama event selesai sepertiresponse.output_text.done. - Messages: ditempelkan pada blok konten teks di
annotations; streaming mengirimkannya dalam eventtext_deltasebelum selesai.
Penagihan
- Biaya per permintaan = biaya model + biaya pencarian web.
- Pencarian web ditagih per pencarian sesuai harga platform; kedalaman lanjutan (
highatau lanjutan melaluiengine/mode) memiliki harga satuan lebih tinggi. - Model gratis juga dikenai biaya pencarian web; modelnya sendiri tetap gratis.
- Setiap permintaan melakukan satu pencarian secara default. Dengan
search_queries, jumlah pencarian sama dengan jumlah kueri dan biaya dihitung per kueri. Percobaan ulang setelah pergantian rute di backend tidak mengulang pencarian atau biaya. - Situasi berikut tidak dikenai biaya pencarian web:
- Pencarian itu sendiri gagal (mengembalikan 503; lihat di bawah).
- Kueri yang gagal saat memakai
search_queries(hanya kueri berhasil yang ditagih). - Pencarian berhasil tetapi model akhirnya gagal menghasilkan respons.
- Biaya pencarian termasuk saat saldo dicadangkan. Potongan aktual tercermin pada
usage.costrespons dan catatan penagihan.
Error dan batasan
web_search_unavailableLayanan pencarian web sedang dihentikan. Coba lagi nanti.Tidak ditagih; model tidak dipanggilinsufficient_creditsSaldo tidak cukup untuk permintaan ini termasuk biaya pencarian; permintaan diblokir sebelum pencarian.Tidak ditagihweb_search_rate_limitedPermintaan pencarian web terlalu sering. Coba lagi nanti.Tidak ditagihinvalid_web_search_optionsParameter pencarian tidak valid, misalnya country tidak didukung, include_domains bukan array string, atau search_queries dan search_prompt ditentukan bersamaan.Tidak ditagih- Batas laju, izin model, peninjauan konten, dan pemeriksaan permintaan lain selesai sebelum pencarian; permintaan yang diblokir oleh pemeriksaan ini tidak melakukan pencarian.
- Parameter dan alat terkait pencarian (akhiran
:online, item web padaplugins,web_search_options, alat pencarian di atas, danweb_search_preview) hanya diproses oleh platform ini dan tidak diteruskan ke model.
Migrasi dari OpenRouter
API BazaarLink kompatibel dengan OpenRouter — sebagian besar integrasi cukup mengubah dua nilai: base URL menjadi https://api.bazaarlink.ai/v1 dan kunci API menjadi kunci BazaarLink yang dimulai dengan sk-bl-.
- Basis URL: https://openrouter.ai/api/v1 → https://api.bazaarlink.ai/v1
- Kunci API: sk-or-... → sk-bl-... (buat di /keys)
- ID model: format provider/model yang sama (mis. anthropic/claude-sonnet-4.6); katalog lengkap di GET /v1/models
- Fallback models[], streaming, tool calling, dan output terstruktur memakai bentuk permintaan yang sama
Autentikasi
Semua permintaan API memerlukan header Authorization dengan kunci API Anda.
Authorization: Bearer sk-bl-YOUR_API_KEYDapatkan kunci API Anda dari dasbor. Jaga keamanan kunci Anda — jangan mengeksposnya di kode sisi klien.
Header Opsional
Prinsip
BazaarLink dirancang berdasarkan tiga prinsip utama:
1. Antarmuka Terpadu
Satu API, satu SDK, ratusan model. Beralih antara OpenAI, Anthropic, Google Gemini, Meta Llama, dan lainnya tanpa mengubah kode Anda — cukup ubah ID model.
2. Optimasi Harga
BazaarLink secara otomatis mengarahkan ke penyedia paling hemat biaya untuk model yang Anda pilih. Anda hanya membayar apa yang Anda gunakan, ditagih dalam USD dengan dukungan faktur penuh.
3. Penanganan Permintaan
Jika sumber upstream bermasalah, permintaan dapat mencoba sumber lain yang tersedia. Jika tidak ada yang tersedia, permintaan menghasilkan error.
Multimoda
BazaarLink mendukung input multimodal — kirim gambar, audio, dan file bersamaan dengan teks ke model yang mendukungnya. Konten diteruskan ke penyedia upstream.
Modalitas yang Didukung
Contoh:
Mengirim Gambar
Gunakan format array content dengan bagian image_url. Format yang didukung: PNG, JPEG, WebP, dan GIF (termasuk animasi). Anda dapat menyertakan banyak gambar dalam satu pesan — masing-masing sebagai bagian image_url terpisah:
Batas
BazaarLink menerapkan dua batas independen: batas rate untuk permintaan per menit, dan batas kredit untuk pengeluaran akun. Melebihi batas rate mengembalikan HTTP 429; kredit habis mengembalikan HTTP 402.
Batas Rate
Batas rate per pengguna (bukan per kunci), diukur dalam permintaan per menit (RPM). Tidak ada batas harian. Tier ditentukan secara otomatis berdasarkan saldo kredit akun Anda.
Ketika batas rate terlampaui, Anda menerima respons 429 dengan header Retry-After. Terapkan exponential backoff saat mencoba ulang permintaan.
Judul Respons
Respons dapat menyertakan x-request-id; x-generation-id pada respons non-streaming; x-ratelimit-*; retry-after bila berlaku; dan x-auto-resolved-model untuk routing auto atau auto:free.
x-request-id: 85e6f35c71a31f19-SJC
x-generation-id: 85e6f35c71a31f19-SJC
x-ratelimit-limit: 200
x-ratelimit-remaining: 198
x-ratelimit-reset: 1740000060
retry-after: 5
x-auto-resolved-model: openai/gpt-4oBatas Kredit
Respons 402 berarti saldo akun Anda atau batas pengeluaran kunci telah mencapai nol — bukan berarti Anda mengirim permintaan terlalu cepat. Respons ini tidak menyertakan header rate limit, dan jika batas tercapai di tengah streaming, Anda akan menerima event error SSE, bukan perubahan status HTTP.
Daftar izin IP
Setiap kunci API dapat memiliki daftar izin IP sendiri, sehingga hanya request dari IP sumber yang ditentukan yang dapat menggunakan kunci tersebut.
Kapan sebaiknya digunakan
Fitur ini cocok untuk deployment server production dengan IP outbound tetap. Jika aplikasi mengirim request dari jaringan rumah, jaringan seluler, atau alamat yang berubah-ubah, pastikan IP outbound stabil terlebih dahulu agar Anda tidak mengunci diri sendiri.
Cara mengatur
Buka /keys , buka menu "⋯" pada kunci yang dipilih, pilih "Daftar izin IP", masukkan entri, lalu simpan.
Anda juga dapat menggunakan PATCH /api/v1/keys/:id dengan session yang sudah login atau Management API key:
Format entri
Di UI, masukkan satu nilai per baris. Di API, kirim nilai yang sama dalam array `allowedCidrs`. Format yang diterima adalah IPv4 polos, IPv4 CIDR, atau literal IPv6 (hanya pencocokan persis).
203.0.113.7
198.51.100.0/24
2001:db8::1Perilaku
Kosongkan (kirim array [] kosong) untuk tidak membatasi IP sumber. Ini adalah nilai default, sehingga perilaku kunci yang sudah ada tetap sama.
IP sumber diambil dari header `cf-connecting-ip`.
Jika daftar tidak kosong tetapi IP sumber tidak dapat ditentukan, request akan ditolak (fail-closed).
Pemutus Sirkuit Pribadi
Batas pengeluaran USD tetap 1 menit dan 1 jam yang diterapkan ke semua kunci API Anda. Permintaan baru mendapat HTTP 429 saat ambang batas jendela tercapai; jendela direset otomatis pada batas waktu.
Keamanan Akun
Selain kata sandi, BazaarLink juga mendukung verifikasi dua langkah untuk lapisan perlindungan tambahan saat masuk.
Aktifkan verifikasi dua langkah (TOTP)
- Buka halaman "Pengaturan", temukan bagian "Verifikasi dua langkah (TOTP)", lalu klik "Aktifkan verifikasi dua langkah".
- Pindai kode QR di layar dengan aplikasi authenticator (seperti Google Authenticator), atau masukkan secret yang ditampilkan di bawah secara manual.
- Masukkan kode 6 digit yang dihasilkan aplikasi authenticator dan konfirmasi untuk menyelesaikan aktivasi.
Setelah diaktifkan, sistem akan menampilkan 8 kode cadangan (hanya ditampilkan sekali) — masing-masing 10 karakter dan hanya berlaku sekali. Segera catat atau salin dan simpan di tempat aman selain ponsel Anda; gunakan kode cadangan untuk masuk jika ponsel hilang atau aplikasi authenticator tidak dapat diakses.
Cara lain melindungi akun Anda
Gabungkan fitur berikut dengan verifikasi dua langkah untuk lebih membatasi kerugian akibat kunci yang bocor atau disalahgunakan:
- Daftar Izin IP — membatasi API key hanya dapat digunakan dari IP sumber tertentu.
- Pemutus Sirkuit Pribadi — menetapkan batas pengeluaran per menit dan per jam yang berhenti otomatis saat terlampaui.
- Batas pengeluaran per key — menetapkan batas pengeluaran harian, mingguan, atau bulanan saat membuat atau memperbarui API key.
Pembuatan Gambar
Buat gambar via /v1/chat/completions dengan modalities:["image"], atau /v1/images/generations yang kompatibel dengan OpenAI DALL·E.
curl -N https://api.bazaarlink.ai/v1/chat/completions \
-H "Authorization: Bearer $BAZAARLINK_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}'Alur lengkap (streaming, edit gambar, protokol SSE, daftar model) lihat Referensi API →
Pembuatan Video
Alur 3-langkah async (submit → poll → content). Pembuatan video membutuhkan 30 detik hingga 5 menit.
curl https://api.bazaarlink.ai/v1/videos \
-H "Authorization: Bearer $BAZAARLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"bytedance/seedance-2.0","prompt":"a bird flying over mountains","duration":3}'
# → 202 { "id": "vjob_xxx", "status": "pending" }Alur lengkap (polling, unduhan, jenis tugas, catatan) lihat Referensi API →
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
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)MPEGMOVWebMOAuth PKCE
OAuth 2.0 PKCE (Proof Key for Code Exchange) memungkinkan aplikasi klien publik (browser SPA, aplikasi mobile) membuat panggilan API atas nama pengguna individu tanpa menyimpan rahasia server jangka panjang di sisi klien.
Kapan Menggunakan OAuth PKCE
- Membangun browser SPA atau aplikasi mobile yang membutuhkan tagihan per pengguna
- SaaS multi-tenant — setiap pengguna akhir membayar penggunaan API mereka sendiri
- Anda tidak dapat menyimpan rahasia bersama di sisi klien (klien publik)
- Anda membutuhkan kunci terpisah yang dapat dicabut untuk setiap pengguna (berlaku sampai pengguna mencabutnya) alih-alih satu kunci API bersama
Yang akan dilihat pengguna Anda
Jelaskan langkah-langkah ini di layar masuk Anda sendiri:
- Di aplikasi Anda, mereka memilih "Masuk dengan BazaarLink" (atau apa pun nama tombol Anda).
- Browser mereka membuka halaman otorisasi BazaarLink. Jika belum masuk, mereka masuk terlebih dahulu lalu otomatis kembali ke halaman ini.
- Halaman menampilkan alamat aplikasi Anda dan apa yang terjadi jika mereka mengizinkan: kunci API baru dibuat untuk aplikasi, penggunaan ditagihkan ke saldo BazaarLink mereka, dan mereka dapat mencabut kunci kapan saja. Mereka dapat menamai kunci dan menetapkan batas pengeluaran bulanan (keduanya opsional).
- Mereka mengklik Izinkan lalu dikembalikan ke aplikasi Anda. Jika mereka mengklik Tolak, tidak ada kunci yang dibuat, aplikasi Anda tidak diberi tahu, dan mereka melihat halaman "Akses ditolak".
- Untuk mencabut akses nanti, mereka membuka halaman Kunci API (https://bazaarlink.ai/keys) dan menonaktifkan atau menghapus kunci yang dinamai sesuai aplikasi Anda.
Cara kerjanya
Langkah 1 — Mulai Autentikasi — Hasilkan code_verifier acak (string acak panjang) dan hash SHA-256-nya sebagai code_challenge, lalu arahkan pengguna ke halaman autentikasi BazaarLink.
https://bazaarlink.ai/auth?callback_url=https://yourapp.com/callback&code_challenge=CODE_CHALLENGE&code_challenge_method=S256Parameter URL otorisasi
- callback_url (wajib) — tujuan pengguna kembali setelah mengizinkan. Aturan di bawah.
- code_challenge (wajib) — SHA-256 dari code_verifier Anda yang dikodekan base64url (43 karakter, tanpa padding).
- code_challenge_method (wajib) — harus S256.
- state (opsional) — nilai CSRF buram milik Anda sendiri, 1 sampai 256 karakter ASCII yang dapat dicetak. BazaarLink mengembalikannya apa adanya sebagai &state=… tepat setelah code. State yang salah format membuat halaman otorisasi menampilkan "Permintaan otorisasi tidak valid".
- key_label (opsional) — hingga 100 karakter. Mengisi nama kunci di halaman persetujuan secara otomatis (pengguna tetap dapat mengubahnya). Label yang terlalu panjang atau kosong diabaikan.
- Headless tools (CLI / desktop, no callback_url) — omit callback_url. After the user allows, the page shows a one-time code (valid 5 minutes, single use) for them to enter into your tool; exchange it exactly like a redirected code. The page cannot show which app is asking, so tell users to enter the code only in a tool they started themselves.
Tidak didukung
- workspace_id dan required_workspace_id — tidak didukung. Kunci selalu milik akun pengguna sendiri.
- code_challenge_method=plain — tidak didukung (hanya S256).
Aturan callback_url
- Harus https://. http:// hanya diterima untuk localhost, 127.0.0.1, dan [::1] (port apa pun); halaman persetujuan kemudian menampilkan peringatan pengembangan lokal.
- Tanpa fragmen (#), tanpa nama pengguna atau kata sandi di URL, maksimal 2048 karakter.
- Halaman persetujuan menampilkan nama host callback Anda agar pengguna tahu aplikasi mana yang meminta.
- Setelah pengguna mengizinkan, browser diarahkan ke callback_url Anda dengan code=… ditambahkan (dan state=… jika Anda mengirimnya; query string yang sudah ada dipertahankan). Code berlaku 10 menit dan hanya dapat dipakai sekali.
Langkah 2 — Tukar Kode dengan Kunci API — Setelah pengguna mengotorisasi permintaan, BazaarLink mengarahkan ke callback_url Anda dengan code sekali pakai. Code berlaku selama 10 menit dan hanya dapat dipakai sekali; code_verifier yang salah akan menghanguskannya. POST code, code_verifier, dan code_challenge_method (ketiganya wajib) untuk menerima kunci API pengguna.
Langkah 3 — Gunakan Kunci Cakupan Pengguna — Kunci yang dikembalikan adalah kunci API BazaarLink biasa milik pengguna yang memberi otorisasi — penggunaan ditagihkan ke saldo pengguna tersebut, bukan saldo Anda.
curl https://bazaarlink.ai/api/v1/chat/completions \
-H "Authorization: Bearer sk-bl-..." \
-H "Content-Type: application/json" \
-d '{"model": "google/gemini-3.5-flash", "messages": [{"role": "user", "content": "Hello"}]}'Contoh JavaScript (browser)
Halaman /auth dan POST /api/v1/auth/keys dilayani dari https://bazaarlink.ai (bukan api.bazaarlink.ai). Kunci yang Anda terima berfungsi di kedua base URL: https://bazaarlink.ai/api/v1 dan https://api.bazaarlink.ai/v1.
Jika pengguna menetapkan batas pengeluaran saat memberi otorisasi, batas itu bersifat bulanan dan direset mengikuti periode bulanan akun.
Kesalahan
Kesalahan menggunakan format ala OpenAI {"error":{"message","type","code"}}. POST /api/v1/auth/keys dapat mengembalikan:
- 400 invalid_code_challenge_method — code_challenge_method tidak ada, plain, atau selain S256.
- 400 — body JSON tidak valid, atau code / code_verifier tidak ada.
- 403 invalid_code — code tidak dikenal, kedaluwarsa atau sudah dipakai, code_verifier salah, atau akun tidak lagi diizinkan. Semua kasus ini sengaja mengembalikan pesan yang sama agar pemanggil tidak dapat membedakannya. code_verifier yang salah juga menghanguskan code: minta pengguna mengotorisasi ulang.
- 429 rate_limited — lebih dari 30 percobaan pertukaran dalam 10 menit dari satu IP (lihat header Retry-After).
- 429 key_total_cap — akun sudah memiliki maksimum 200 kunci API.
- 405 — hanya POST yang diterima.
Buat kode dari server Anda (Kunci Manajemen)
Pemilik Kunci Manajemen (Management Key) pribadi dapat membuat kode otorisasi langsung dengan POST /api/v1/auth/keys/code tanpa mengarahkan pengguna ke halaman browser (kompatibel dengan OpenRouter). Kode terikat pada pemilik Kunci Manajemen, sehingga kunci yang ditukar adalah kunci standar di akun pemilik tersebut, dengan batas, periode, masa berlaku, dan nama yang dipilih di sini. Gunakan bila alat Anda sendiri sudah memegang Kunci Manajemen dan ingin memberikan kunci terbatas kepada sebuah aplikasi. Penukaran (POST /api/v1/auth/keys) sama seperti di atas.
- callback_url (wajib) dan code_challenge + code_challenge_method=S256 (wajib) — aturan sama dengan URL otorisasi.
- key_label (opsional) — hingga 100 karakter; nama kunci. Default: "App: <host callback Anda>".
- limit (opsional) — batas pengeluaran dalam USD, 0 atau lebih; 0 atau tidak diisi berarti tanpa batas.
- usage_limit_type (opsional) — daily, weekly, atau monthly: seberapa sering batas direset. Hanya dipakai bersama limit; default monthly.
- expires_at (opsional) — kapan kunci kedaluwarsa: waktu ISO 8601 UTC dengan detik di masa depan, misalnya 2026-12-31T23:59:59Z. Nilai dengan presisi menit ditolak. Jika tidak diisi, kunci tetap berlaku sampai dicabut.
- workspace_id — tidak didukung (400). spawn_agent dan spawn_cloud diterima tetapi diabaikan.
Respons: { "data": { "id", "app_id", "created_at" } }. id adalah kode sekali pakai untuk ditukar (berlaku 10 menit, satu kali). BazaarLink tidak memiliki registri aplikasi, sehingga app_id adalah bilangan bulat tetap yang diturunkan dari alamat callback Anda: alamat yang sama selalu mendapat app_id yang sama.
- 401 unauthorized — tidak ada kunci Bearer, atau kunci tidak dikenal.
- 403 management_key_required — kunci bukan Kunci Manajemen pribadi (kunci standar dan Kunci Manajemen organisasi ditolak).
- 403 account_not_allowed — pemilik kunci ditangguhkan atau dihapus.
- 400 — invalid_callback_url, invalid_code_challenge_method, invalid_code_challenge, invalid_expires_at, workspace_not_supported, atau body yang tidak valid.
- 429 rate_limited — lebih dari 30 kode per jam untuk satu pemilik atau 120 per jam dari satu IP (lihat Retry-After).
Kunci yang Anda terima
- Kunci API BazaarLink standar (sk-bl-…), jenis yang sama dengan kunci yang dibuat di halaman Kunci API. Berlaku sampai pengguna mencabutnya.
- Penggunaan ditagihkan ke saldo BazaarLink pengguna. Jika pengguna menetapkan batas pengeluaran di halaman persetujuan, batas itu bersifat bulanan.
- Berfungsi di kedua base URL: https://bazaarlink.ai/api/v1 dan https://api.bazaarlink.ai/v1.
- Dihitung dalam batas 200 kunci per akun dan muncul di daftar Kunci API pengguna, tempat pengguna dapat menonaktifkan atau menghapusnya kapan saja.
- Akun yang ditangguhkan atau dihapus tidak dapat mengotorisasi aplikasi, dan code yang diterbitkan sebelum penangguhan ditolak saat pertukaran (403 invalid_code).
Yang Anda dapatkan
- Alur Authorization Code + PKCE untuk aplikasi klien publik
- Tagihan per pengguna: setiap pengguna membayar penggunaannya sendiri dari saldonya sendiri
- Satu kunci terpisah untuk setiap pengguna, tercantum di halaman Kunci API pengguna tempat ia dapat mencabutnya
Kunci API Manajemen
Kunci manajemen dirancang untuk manajemen kunci programatik. Mereka dapat membuat, mendaftar, memperbarui, menonaktifkan, dan menghapus kunci API standar — tetapi tidak dapat melakukan panggilan model AI.
Membuat Kunci Manajemen
Buka halaman Management API Keys lalu klik "Create" — ini halaman terpisah dari API Keys standar, bukan pilihan tipe di halaman yang sama.
Daftar Kunci
Buat Sub-Kunci
Perbarui Kunci
Cabut Kunci
DELETE https://api.bazaarlink.ai/v1/keys/:id
Authorization: Bearer sk-bl-YOUR_MGMT_KEY
# Returns 204 No Content on successKueri Saldo
Kueri Penggunaan
GET https://api.bazaarlink.ai/v1/usage?period=month
Authorization: Bearer sk-bl-YOUR_MGMT_KEY
# period: day | week | month | yearAtribusi Aplikasi
Identifikasi aplikasi Anda di header permintaan untuk mengaktifkan pelacakan penggunaan, visibilitas dasbor, dan analitik terperinci.
Header yang Tersedia
| Header | Description |
|---|---|
| HTTP-Referer | URL situs Anda, untuk pelacakan penggunaan dan analitik (opsional) |
| X-Title | Nama aplikasi Anda, ditampilkan di dasbor (opsional) |
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 penagihan yang dapat dibaca mesin
A 402 can represent different controls. Use these stable codes to choose the correct action.
Stable error.code catalog
These string codes are emitted by public inference and media paths. Branch on the string code when present; the HTTP status remains the broad failure class.
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
Permintaan ditinjau otomatis untuk keamanan konten; teks dan gambar dari input terbaru Anda dapat dikirim ke layanan penilaian keamanan konten pihak ketiga.
Untuk permintaan yang dinilai melanggar, diduga melanggar, mendekati ambang batas, atau diambil sebagai sampel acak, kami dapat menyimpan teks lengkap atau bagian awalnya sebagai bukti kepatuhan, penanganan sengketa, dan audit, tanpa menjanjikan jangka waktu penghapusan tetap.
Permintaan biasa lainnya yang berhasil tidak disimpan prompt dan responsnya; permintaan dengan kunci ZDR tidak tercakup dalam dua poin pertama.
Batas tarif, anggaran, dan rem darurat
These controls can reject an otherwise valid request and require different recovery actions.
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.
Menangani Error
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.Alat Memanggil
Tool calling (juga dikenal sebagai function calling) memungkinkan model memanggil fungsi eksternal yang Anda definisikan. Model memutuskan kapan memanggil tool dan menghasilkan argumen terstruktur — kode Anda mengeksekusi fungsi dan mengembalikan hasil untuk melanjutkan percakapan.
Model yang Didukung
Sebagian besar model frontier mendukung tool calling. Berikut beberapa pilihan populer:
Mendefinisikan Tools
Setiap tool adalah objek JSON yang mendeskripsikan fungsi yang dapat dipanggil model. Field parameters menggunakan JSON Schema.
Opsi tool_choice
Alur Lengkap
Tool calling adalah proses multi-turn: (1) kirim permintaan dengan tools → (2) model mengembalikan tool_calls → (3) eksekusi fungsi → (4) kirim hasil kembali → (5) model menghasilkan respons akhir.
Panggilan Tool Paralel
Beberapa model dapat memanggil banyak tool dalam satu respons. Tangani setiap panggilan tool dan kembalikan semua hasil:
Panggilan Tool saat Streaming
Saat streaming, panggilan tool tiba sebagai delta parsial yang diindeks berdasarkan posisi — kumpulkan string argumen setiap delta berdasarkan indeks hingga finish_reason menjadi "tool_calls", yang menandakan panggilan telah selesai.
Loop Agentic Sederhana
Pola umum yang terus memanggil model selama model terus meminta tool, dan berhenti setelah model mengembalikan jawaban akhir — gunakan max_iterations untuk mencegah loop tak terbatas.
Praktik Terbaik Definisi Fungsi
- Gunakan nama yang spesifik dan deskriptif — get_weather_forecast, bukan sekadar weather.
- Tulis deskripsi yang jelas tentang apa yang dilakukan fungsi dan kapan harus digunakan — model hanya mengandalkan teks ini untuk memutuskan apakah akan memanggilnya.
- Batasi nilai dengan enum jika memungkinkan dan sertakan contoh dalam deskripsi untuk mengurangi argumen yang salah bentuk.
- Tandai hanya field yang benar-benar wajib sebagai required — field opsional harus benar-benar bisa dihilangkan.
Output Terstruktur
Paksa model mengembalikan JSON valid yang cocok dengan skema. Ini penting untuk membangun aplikasi andal yang mem-parse output model secara programatik.
Metode 1: response_format (JSON Schema)
untuk memaksa kepatuhan JSON Schema yang ketat:
Tips
- Gunakan nama properti yang jelas dan deskriptif — model menggunakannya sebagai konteks.
- Tambahkan deskripsi ke properti skema untuk memandu model.
- Atur strict: true untuk kepatuhan skema yang dijamin (mungkin sedikit meningkatkan latensi).
- Jaga skema tetap sederhana — skema yang sangat bersarang dapat mengurangi kualitas output.
- Uji dengan model berbeda — beberapa menangani skema kompleks lebih baik dari yang lain.
AAsisten Prefill
Tambahkan pesan assistant yang belum selesai sebagai item terakhir untuk meminta kelanjutan pada rute model yang kompatibel.
Transformasi Pesan
The client-supplied transforms field is ignored and removed before an upstream request. It cannot enable or disable message transformations. BazaarLink may apply context handling under its own server-side rules; shorten the input or select a model with a larger context window when needed.
transforms values such as middle-out; they do not change how this request is routed or processed.Tanpa Penyimpanan Data
Untuk permintaan biasa yang berhasil, BazaarLink tidak menyimpan konten pesan Anda (pengecualian: lihat Kebijakan Privasi); mode kunci ZDR menyediakan zero data retention yang lebih ketat. Halaman ini menjelaskan bagaimana data Anda ditangani. Cocok untuk aplikasi yang memproses data sensitif.
Penanganan Data Saat Ini
- Konten pesan: tidak disimpan untuk permintaan biasa yang berhasil (pengecualian: lihat Kebijakan Privasi); mode kunci ZDR lebih ketat
- Catatan penggunaan untuk tagihan dan operasional: jumlah token, waktu, model, biaya, latensi, dan status
- Log penggunaan: hanya statistik penggunaan untuk permintaan biasa yang berhasil, tanpa konten pesan
- Penerusan upstream: pesan diteruskan ke penyedia upstream — tunduk pada kebijakan privasi mereka
Caching Cepat
Prompt caching menggunakan ulang token prompt yang sudah dihitung sebelumnya, secara signifikan mengurangi biaya dan latensi — terutama untuk aplikasi dengan prompt sistem besar yang berulang.
Cara Kerjanya
Perlu tidaknya konfigurasi tergantung penyedia model. Model keluarga OpenAI meng-cache prefiks prompt yang panjang dan berulang secara otomatis — tidak perlu mengubah request. Model Claude (Anthropic) hanya meng-cache jika request menyertakan breakpoint cache_control secara eksplisit; BazaarLink tidak menambahkannya untuk Anda, jadi request Claude tanpa marker tidak akan pernah di-cache. BazaarLink meneruskan marker cache yang Anda kirim apa adanya dan melaporkan jumlah token cache read/write sebenarnya di respons penggunaan.
Token Penalaran
Model penalaran (mis., DeepSeek R1, seri o1) berpikir secara internal sebelum menghasilkan jawaban akhir. Token internal ini disebut token penalaran dan ditagih secara terpisah.
Membaca Token Penalaran dari Respons
Kontrol Mode Berpikir
Beberapa model mendukung pengaktifan mode "berpikir". Mode berpikir menghasilkan token penalaran internal sebelum menghasilkan jawaban akhir, meningkatkan kualitas dengan biaya token lebih banyak.
| Keluarga Model | Parameter | Default |
|---|---|---|
| qwen3-* | enable_thinking: boolean | false (default platform) |
| openai/gpt-5.5, gpt-5.6-sol, gpt-5.4 | reasoning_effort: "low" | "medium" | "high" | medium |
| deepseek/deepseek-r1 | — | Selalu aktif (tidak dapat dinonaktifkan) |
Objek reasoning Terpadu (Format Baru)
BazaarLink juga mendukung objek reasoning terpadu, yang berfungsi di semua keluarga model dengan satu API yang konsisten:
| Bidang | Nilai | Berlaku untuk |
|---|---|---|
| reasoning.effort | "xhigh" | "high" | "medium" | "low" | "none" | OpenAI o-series, Grok |
| reasoning.max_tokens | integer | Anthropic Claude, Gemini |
| reasoning.exclude | boolean | Sembunyikan penalaran dari respons (model tetap melakukan penalaran) |
Membaca isi pemikiran
Model reasoning dapat mengembalikan isi pemikirannya bersama jawaban. Untuk model yang tercantum di bawah, berpikir aktif secara default: permintaan tanpa parameter reasoning dijalankan dengan berpikir aktif, mengembalikan isi pemikiran, dan ditagih sesuai token pemikiran yang benar-benar dipakai. Kirim reasoning: { exclude: true } atau include_reasoning: false untuk mematikannya. Semua model lain hanya mengembalikan isi pemikiran jika Anda memintanya: kirim reasoning_effort, objek reasoning, include_reasoning: true, thinking atau enable_thinking.
Model yang berpikir secara default: gemini-4-argon, deepseek-v4.1-flash, deepseek-v4.1-flash-1017
Cara memintanya
Kirim salah satu dari ini dalam permintaan: reasoning_effort (low, medium atau high), objek reasoning (effort, max_tokens), include_reasoning: true, thinking: { type: "enabled" } atau enable_thinking: true. Kirim reasoning.exclude: true atau include_reasoning: false untuk mematikan isi pemikiran (model tetap bernalar).
| Bidang | Lokasi | Arti |
|---|---|---|
| reasoning | choices[].message.reasoning | Isi pemikiran (string) |
| reasoning_details | choices[].message.reasoning_details | Isi pemikiran sebagai daftar item, setiap item hanya berisi type dan text |
| reasoning | choices[].delta.reasoning | Streaming: isi pemikiran datang sepotong-sepotong (delta.reasoning dan delta.reasoning_details), sebelum teks jawaban di delta.content |
Periksa tingkat yang didukung tiap model dengan GET /v1/models: setiap model reasoning mencantumkan reasoning.supported_efforts, reasoning.default_effort dan reasoning.mandatory (misalnya gemini-4-argon mendukung high, medium dan low).
Contoh: gemini-4-argon
Di /v1/responses, minta dengan reasoning: { effort, summary: "auto" }; isi pemikiran dikembalikan pada item reasoning di array output. Di /v1/messages, kirim thinking: { type: "enabled", budget_tokens } untuk menerima blok thinking.
Latensi & Performa
Mengoptimalkan latensi respons API AI sangat penting untuk pengalaman pengguna. Di bawah ini adalah faktor-faktor utama yang mempengaruhi latensi dalam arsitektur BazaarLink dan praktik terbaik untuk optimasi.
Faktor yang Mempengaruhi Latensi
- Ukuran model: model lebih besar (70B+) umumnya lebih lambat menghasilkan
- Beban penyedia: bervariasi antar penyedia dan waktu dalam sehari
- Jumlah token: max_tokens lebih tinggi berarti waktu completion lebih lama
- Streaming vs. non-streaming: stream: true mengirimkan token pertama lebih cepat
- Panjang konteks: konteks sangat panjang meningkatkan waktu pra-pemrosesan
Tips Optimasi
- Lebih suka streaming (stream: true) untuk meningkatkan latensi yang dirasakan
- Pilih model lebih kecil (flash/mini/haiku) untuk skenario sensitif latensi
- Aktifkan prompt caching untuk mengurangi latensi permintaan berulang
Optimasi Uptime
Setelah upstream error, permintaan dapat mencoba sumber lain yang tersedia. Jika tidak ada sumber yang dapat menangani permintaan, error akan dikembalikan. Circuit breaker membatasi percobaan berulang dan status penyedia dipantau.
Mekanisme Ketersediaan
- Circuit breaker: otomatis mendeteksi dan mengisolasi penyedia yang gagal
- Jika sumber upstream bermasalah, permintaan dapat mencoba sumber lain yang tersedia. Jika tidak ada yang tersedia, permintaan menghasilkan error.
- Pemantauan kesehatan penyedia: terus melacak tingkat error dan latensi per penyedia
- Logika percobaan ulang: error sementara (5xx) otomatis dicoba ulang
Pemutus Sirkuit
Pagar Pembatas
Tambahkan mekanisme keamanan konten ke permintaan API Anda untuk memfilter konten berbahaya dan menegakkan kebijakan kepatuhan. BazaarLink saat ini hanya menyediakan guardrail penyaringan konten yang dapat disesuaikan di tingkat organisasi; kunci API pribadi (non-organisasi) tidak memiliki pengaturan setara — keamanan konten sepenuhnya bergantung pada sistem keamanan bawaan masing-masing penyedia model upstream.
Fitur yang Direncanakan (belum tersedia untuk kunci pribadi maupun organisasi)
Perilaku Saat Ini
Kunci API pribadi: semua penyedia upstream memiliki sistem keamanan konten mereka sendiri — respons model yang memicu filter konten dikembalikan dengan finish_reason: "content_filter", dan BazaarLink tidak menerapkan penyaringan tambahan. Kunci API organisasi: org_admin dapat mengonfigurasi aturan kustom (blokir/redaksi/tandai) di bawah "Content Filter Guardrails," diterapkan sebelum teks mencapai model.
Kursor IDE
Gunakan BazaarLink sebagai Override URL OpenAI Cursor. Setup plug-and-play dengan konversi otomatis Responses API, normalisasi format tool, dan konvensi prefix bz- untuk model Claude.
Pengaturan cepat
Di Cursor, buka Settings → Models, lalu:
- Atur Override OpenAI Base URL ke https://api.bazaarlink.ai/v1
- Atur Override OpenAI API Key ke kunci BazaarLink sk-bl-... Anda
- Tambahkan nama model yang diinginkan — lihat di bawah untuk Claude (prefix bz-).
Prefix bz- (untuk model Claude)
Validasi client-side Cursor merutekan setiap nama model yang dimulai dengan claude- melalui integrasi Anthropic milik Cursor sendiri, melewati Override URL Anda. Agar Cursor mengirim permintaan ke BazaarLink, beri awalan bz- pada nama model. Server menghapus prefix dan menyelesaikan sisanya melalui alias map.
Variasi titik vs tanda hubung dinormalisasi: bz-claude-sonnet-4.6 dan bz-claude-sonnet-4-6 keduanya menjadi model yang sama.
Env var CURSOR_MODEL_MAP (override operator)
Untuk deployment BazaarLink self-hosted, setel env var ini untuk memetakan ulang nama model sisi Cursor ke canonical id katalog:
CURSOR_MODEL_MAP=gpt-claude-sonnet:anthropic/claude-sonnet-4.6,gpt-opus:anthropic/claude-opus-4.7Sekarang gpt-claude-sonnet yang diketik di Cursor dipetakan ke anthropic/claude-sonnet-4.6 di sisi server. Berguna ketika Anda ingin Cursor mengira sebuah model adalah keluarga GPT (agar dirutekan via Override URL) sementara Anda sebenarnya menyajikan Claude.
Apa yang terjadi secara otomatis
Ketika sebuah permintaan mencapai /v1/chat/completions, BazaarLink menerapkan transformasi kompatibilitas berikut secara transparan — Anda tidak perlu melakukan apa pun di sisi client:
- Mendeteksi otomatis body Responses API — jika body memiliki input alih-alih messages, ia dikonversi ke bentuk Chat Completions (Cursor mengirim format Responses API untuk model keluarga GPT).
- Membungkus definisi tool datar — Cursor Agent mengirim { name, description, parameters } tanpa pembungkus function. Kami membungkusnya agar upstream tidak menolak sebagai Tool '' not found in provided tools.
- Mengoreksi tool_choice yang salah bentuk — Cursor mengirim { type: "auto" } (bentuk objek, tanpa function). Spesifikasi OpenAI memerlukan bentuk string untuk auto/none/required, jadi kami mengoreksinya.
- Menghapus field khusus penyedia saat upstream tidak mendukungnya — parallel_tool_calls, logprobs, top_logprobs, logit_bias, service_tier, user dihapus sebelum diteruskan (jika tidak, upstream mengembalikan 400).
- Memetakan max_output_tokens → max_tokens dan menghapus field khusus Responses-API (previous_response_id, truncation, background, store). Field reasoning dipertahankan untuk body Chat-Completions native.
Mode Cursor Agent
Pemanggilan tool bekerja melalui alur tool-call Chat Completions standar. Cursor mengirim tools (Shell, Read, Write, Grep, dll.) dengan tool_choice: "auto"; BazaarLink meneruskan ke penyedia model pilihan Anda, yang memutuskan memanggil tool atau tidak. Pemanggilan tool dikembalikan sebagai delta tool_calls OpenAI standar; Cursor mengeksekusi secara lokal dan melanjutkan percakapan. Bekerja sama baik Anda memilih gpt-4o (OpenAI native) atau bz-claude-sonnet-4.6.
Routing Model
BazaarLink menggunakan format provider/model-name untuk mengarahkan permintaan ke penyedia upstream yang tepat. Ini memberi Anda akses ke semua model utama melalui satu endpoint API.
Format ID Model
{provider}/{model-name}
# Examples
openai/gpt-5.4-mini
anthropic/claude-sonnet-4.6
google/gemini-3-flash-preview
deepseek/deepseek-v4.1-flashPrioritas Routing
Saat Anda mengirim permintaan, BazaarLink menyelesaikan penyedia upstream dalam urutan ini:
- Pencocokan tepat — mencari route model yang cocok dengan ID model lengkap
- Wildcard penyedia — fallback ke route provider/* (mis. openai/*)
- Wildcard global — fallback ke route wildcard *
- Kunci penyedia default — hanya untuk model katalog yang dikenal, memakai kunci aktif yang ditandai default
Jelajahi semua model yang tersedia di halaman Model.
Router Otomatis
Auto Router v3 menilai permintaan ke salah satu dari 14 tier tugas, lalu memakai primary dan rantai fallback yang saat ini dikonfigurasi untuk tier tersebut. Tabel berbayar dan gratis dikelola terpisah di admin.
- auto — memakai tabel routing berbayar; model aktual yang berhasil ditagih sesuai harga publiknya.
- auto:free — memakai tabel routing gratis; biaya USD 0 selama kuota gratis. Setelah kuota habis, akun dengan saldo dapat berpindah ke auto berbayar kecuali fallback berbayar dinonaktifkan.
Cara Menggunakan
Atur model ke "auto" (berbayar) atau "auto:free" (gratis) untuk mengaktifkan routing otomatis:
curl https://api.bazaarlink.ai/v1/chat/completions \
-H "Authorization: Bearer $BAZAARLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"auto","messages":[{"role":"user","content":"Review this TypeScript function"}]}'Cara v3 memilih tier
Tier umum: simple, standard, complex, reasoning. Tier khusus: coding, vision, image, video, data, search, social, email, calendar, trading. Hasil batas berkepercayaan rendah dinaikkan satu tingkat.
- Penilaian tier: messages, tools, panjang, kata kunci, dan sinyal struktur memilih satu dari 14 tier
- Aturan keras: gambar, penalaran formal, dan tugas khusus dapat memilih tier langsung
- Pencarian route: membaca primary dan maksimal lima fallback; tier nonaktif mengembalikan 503
- Eksekusi: mencoba primary lalu fallback sesuai urutan konfigurasi
- Pelacakan respons: model yang dipilih dikembalikan dalam body respons dan header X-Auto-Resolved-Model
Tabel model saat ini
Tabel berikut dibaca dari konfigurasi live yang sama dengan inference dan admin. Primary, urutan fallback, dan status tiap tier dapat diubah tanpa deployment.
auto
auto:free
Model tertentu menawarkan tier gratis dengan batas laju. Kelayakan gratis diberikan per model oleh platform — panggil model dengan ID regulernya; sufiks :free adalah alias opsional (menambahkannya ke model berbayar tidak membuatnya gratis).
Varian Model
ID Model Independen
Varian katalog seperti :free, :extended, dan :thinking dapat menandai entri dengan kemampuan atau harga katalog yang berbeda. Rute upstream dan harga pelanggan ditentukan oleh katalog serta aturan sisi server BazaarLink.
:free
:extended
:thinking:nitro
:floor
:exacto:onlineModel Gratis
Model tertentu menawarkan tier gratis dengan batas laju. Kelayakan gratis diberikan per model oleh platform — panggil model dengan ID regulernya; sufiks :free adalah alias opsional (menambahkannya ke model berbayar tidak membuatnya gratis).
- Panggil ID model reguler (mis. deepseek/deepseek-v4-flash). Permintaan dalam kuota gratis otomatis dilayani tanpa biaya.
- Penggunaan gratis dibatasi per pengguna berdasarkan permintaan per menit dan batas harian. Batas menyesuaikan tingkat akun (tanpa kredit / berkredit).
- Saat kuota gratis terlampaui dan Anda punya kredit, permintaan otomatis berlanjut di tier berbayar dengan harga tercantum. Kirim X-Free-Fallback: false untuk menonaktifkan fallback otomatis dan menerima 429. Tanpa kredit, permintaan melebihi kuota mengembalikan 429.
- GET /v1/models mencantumkan entri :free untuk setiap model dengan tier gratis; auto:free selalu diarahkan ke model gratis.
Model dengan kuota gratis saat ini
Panggil ID model ini secara langsung untuk memakai kuota gratis. Daftarnya berubah seiring waktu — ambil versi terbaru lewat API.
qwen/qwen3.7-flash
reflection/beam-free
stealth/glyph-cluster
nvidia/nemotron-3.5-lightning-free
inclusionai/ling-3.1-flash-1019
deepseek/deepseek-v4-flash-0731freeBatas kuota gratis
Anggaran harian = anggaran permintaan harian di atas × pengali tingkat akun, dihitung terpisah untuk tiap model gratis. auto:free juga menerapkan batas paralel per-IP. Model tertentu bisa diberi batas lebih ketat atau lebih longgar oleh platform; nilai efektifnya ditampilkan di blok "Kuota gratis" pada halaman model. Kuota gratis dihitung dalam "unit", bukan sekadar jumlah permintaan: unit yang dikonsumsi satu permintaan bertambah seiring panjang context prompt. Dengan kuota harian yang sama, permintaan ber-context panjang menghasilkan jauh lebih sedikit penggunaan dibanding prompt pendek.
Setelah kuota gratis habis
Setelah kuota gratis habis, permintaan tambahan ditagihkan dengan tarif berbayar model jika akun memiliki saldo. Untuk menerima 429, kirim `X-Free-Fallback: false` atau nonaktifkan peralihan ke tingkat berbayar di pengaturan kunci. Tanpa saldo, permintaan yang melebihi kuota mengembalikan 429.
Saat permintaan benar-benar di-downgrade dengan cara ini, respons membawa header x-bl-free-fallback: daily atau x-bl-free-fallback: rpm yang menyebutkan batas mana yang terpicu, sehingga Anda bisa mendeteksi peralihan itu saat permintaan dibuat, bukan hanya dari tagihan. Header ini tidak ada pada permintaan yang tidak di-downgrade.
# Return 429 instead of switching to paid routing
-H "X-Free-Fallback: false"Manajemen Organisasi
Organisasi BazaarLink menggunakan arsitektur tiga tingkat: Organisasi → Tim → Anggota. Kredit disimpan di tingkat organisasi; setiap Tim dan anggota dapat memiliki batas pengeluaran bulanan. Permintaan API memeriksa anggota → tim → kredit org secara berurutan.
Sistem Anggaran Tiga Tingkat
Pada setiap permintaan API, tiga lapisan anggaran diperiksa secara berurutan. Melebihi lapisan mana pun mengembalikan HTTP 429:
- Anggaran bulanan anggota (OrgMember.monthlyBudget)
- Anggaran bulanan tim (Team.monthlyBudget)
- Saldo kredit organisasi (Organization.credits)
Laporan Penggunaan
Halaman Laporan di portal organisasi menyediakan analitik pengeluaran bulanan di empat dimensi:
- Ikhtisar: total pengeluaran, tingkat margin, grafik tren harian
- Per Tim: pengeluaran per tim, bagian %, rincian model, pemanfaatan anggaran
- Per Model: pengeluaran per model, harga rata-rata ($/1M token)
- Per Anggota: pengeluaran per anggota — hanya org_admin
Semua tampilan mendukung ekspor CSV dengan prefiks BOM untuk kompatibilitas Excel langsung.
Buat & Kelola Organisasi
- Buka Pengaturan → Organisasi → Buat Organisasi Baru
- Buat Tim di portal organisasi (opsional: kode pusat biaya dan anggaran bulanan)
- Undang anggota melalui email, tetapkan peran dan Tim
- Terbitkan kunci API untuk anggota — penggunaan otomatis ditandai ke Tim / anggota yang benar
- Lihat halaman Laporan untuk pengeluaran bulanan dirinci berdasarkan Tim, Model, atau Anggota
- Lihat halaman Laporan untuk pembelanjaan bulanan yang dikelompokkan berdasarkan Tim, Model, atau Anggota
Peran Anggota
Apa lagi yang bisa dikelola organisasi?
Di luar anggota dan tim, area manajemen organisasi menyediakan:
- API keys and model restrictions
- Content filtering before text reaches a model
- Allowed Models by organization, team, member, or key
- Monthly budgets and spend emergency brakes
- Reports and billing
- Change logs and security logs
Pemfilteran konten
Organization-owned rules inspect text before it reaches a model. An org_admin can enable, edit, and test them in Settings.
- block: reject with HTTP 403
- redact: replace matches with [REDACTED]
- flag: send unchanged and record an audit event
- Built-in sensitive-data and prompt-injection templates plus custom keyword or regex rules
- Up to 100 safety-checked rules with a test preview
API Manajemen (v1)
Endpoint /v1/orgs/ menerima kunci manajemen Bearer (sk-bl-...) dan cookie sesi, memungkinkan manajemen organisasi server-ke-server tanpa sesi browser.
Organisasi
/v1/orgsMenampilkan daftar semua organisasi tempat caller tergabung, beserta role dan joinedAt.
/v1/orgs/:orgIdMengambil detail org termasuk jumlah team dan member.
curl https://api.bazaarlink.ai/v1/orgs \
-H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY"Tim
/v1/orgs/:orgId/teamsMenampilkan daftar team beserta jumlah member, diurutkan berdasarkan name.
/v1/orgs/:orgId/teams/v1/orgs/:orgId/teams/:teamIdUpdate parsial — sertakan hanya field yang ingin diubah.
/v1/orgs/:orgId/teams/:teamId# Create a team
curl https://api.bazaarlink.ai/v1/orgs/{orgId}/teams \
-X POST \
-H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Engineering", "costCenterCode": "ENG-001", "monthlyBudget": 500}'Anggota
/v1/orgs/:orgId/membersMenampilkan daftar semua member dengan informasi user (id/name/email) dan team yang ter-nested.
/v1/orgs/:orgId/members404 jika alamat email tidak memiliki akun BazaarLink. 409 jika sudah menjadi anggota. Peran default: member.
/v1/orgs/:orgId/members/:memberIdUpdate parsial untuk role, teamId, atau monthlyBudget.
/v1/orgs/:orgId/members/:memberIdMengembalikan 400 jika target adalah org_admin terakhir.
API Laporan
Kueri data pengeluaran bulanan secara programatik. Dapat diakses oleh org_admin dan billing_viewer. Menerima sesi web dan kunci manajemen Bearer.
Parameter kueri: year (default tahun ini), month (default bulan ini, 1–12).
Referensi Respons Error
AModel yang Diizinkan (Daftar Putih)
Batasi model mana yang dapat dipanggil oleh organisasi, tim, atau anggota individu Anda. Berguna untuk memblokir model yang mahal atau belum tervalidasi, menegakkan standar model, atau membatasi tim ke satu provider tertentu.
Cara kerjanya
- Tiga lapis independen — Organisasi, Tim, Anggota — masing-masing memiliki daftarnya sendiri (String[] di database).
- Ketika ketiga lapis kosong, semua model diizinkan (perilaku default).
- Ketika satu atau lebih lapis tidak kosong, daftar efektif adalah irisan dari lapis-lapis yang tidak kosong — sebuah model harus diizinkan di setiap lapis yang dibatasi agar lolos.
- Perubahan berlaku dalam beberapa detik (cache in-memory 60s + Redis 5min; keduanya dibersihkan saat update).
Format pola
- Pencocokan tepat — mis. openai/gpt-4o (hanya model spesifik ini).
- Wildcard provider — mis. openai/* (semua model di bawah prefix openai/).
- Hanya huruf kecil. Maks 200 entri per daftar, 100 karakter per entri.
Tempat mengelola
Org Portal → Allowed Models. org_admin dapat mengedit daftar org / team / member; team_admin dapat mengedit timnya sendiri dan anggota di dalamnya.
Respons error saat diblokir
Panggilan ke model yang tidak diizinkan mengembalikan HTTP 403 dengan body berikut:
Manajemen API
Semua endpoint menerima Web Session atau Bearer Management Key (sk-bl-...). PATCH menggantikan seluruh daftar; kirim [] untuk mengosongkan.
Pemutus Sirkuit (Saklar Pemutus Pembelanjaan)
Batas pengeluaran dua jendela yang memblokir permintaan lanjutan ketika biaya upstream melonjak. Dirancang untuk membendung skrip yang lepas kendali, infinite loop, atau penyalahgunaan kunci yang dicuri sebelum mereka memakan biaya nyata.
Cara kerjanya
- Dua jendela tetap dilacak di Redis per scope: biaya upstream 1 menit dan 1 jam (USD).
- Jika pengeluaran salah satu jendela mencapai threshold, semua permintaan berikutnya pada scope tersebut ditolak sampai jendela direset.
- Default: $5 / menit, $20 / jam. Nonaktif secara default — perlu diaktifkan sendiri.
- Counter berada di Redis dengan TTL — pemulihan otomatis, tidak perlu reset manual untuk trip pada org/team/member.
Scope (member menimpa team menimpa org)
Setiap lapis dapat menetapkan thresholdnya sendiri. Urutan resolusi adalah member → team → org → default platform — nilai non-null pertama menang per field (cbEnabled, cbMinuteUsd, cbHourlyUsd).
- Level Org — berlaku untuk semua kunci di bawah organisasi. Atur di Org Portal → Circuit Breaker.
- Level Team — berlaku untuk semua kunci yang ditandai ke tim tersebut. Menimpa org untuk kunci-kunci tersebut.
- Level Member — berlaku hanya untuk kunci yang ditandai ke anggota tersebut. Menimpa team dan org.
Perilaku trip
Saat trip, permintaan gagal cepat (tidak ada panggilan upstream yang dilakukan). Responsnya adalah HTTP 429 dengan body berikut:
Alog Audit
Setiap event trip dan setiap perubahan konfigurasi dicatat:
- Event trip — action org.cb.tripped / team.cb.tripped / org_member.cb.tripped. Dideduplikasi menjadi satu entri per scope+window per jam, sehingga trip yang berkelanjutan tidak membanjiri log.
- Perubahan konfigurasi — action org.cb.update / team.cb.update / org_member.cb.update. Mencatat nilai before/after beserta aktor.
Manajemen API
Org admin dapat membaca dan memperbarui pengaturan via API. Semua endpoint menerima Web Session atau Bearer Management Key (sk-bl-...). Kirim subset field apa pun di body PATCH; null mengosongkan field dan kembali ke lapis induk.
Rotasi Kunci API
Mengganti kunci API secara berkala merupakan praktik keamanan. Buat kunci baru, perbarui dan uji integrasi Anda, lalu cabut kunci lama. Proses ini tidak menjamin tanpa downtime.
Langkah Rotasi
- Buat kunci API baru
- Perbarui aplikasi atau variabel lingkungan Anda untuk menggunakan kunci baru
- Verifikasi kunci baru berfungsi dengan benar
- Nonaktifkan atau hapus kunci lama
Ekspor Aktivitas
Unduh riwayat penggunaan API lengkap Anda sebagai CSV untuk audit keuangan, analisis biaya, atau pelaporan kepatuhan.
Ekspor CSV
Masuk dan buka halaman Log. Klik tombol Ekspor CSV di sudut kanan atas untuk mengunduh riwayat lengkap Anda sebagai file CSV. Tidak perlu panggilan API.
Kolom CSV
API Penggunaan JSON
Untuk akses programatik, kueri statistik teragregasi yang dikelompokkan berdasarkan periode, model, atau kunci:
Akuntansi Penggunaan
Kueri statistik penggunaan terperinci melalui API, termasuk konsumsi token, analisis biaya, dan riwayat permintaan.
Referensi Field Respons
| Field | Type | Description |
|---|---|---|
| model | string | Model ID used (e.g., openai/gpt-4o) |
| provider | string | Nilai tetap BazaarLink: bazaarlink |
| prompt_tokens | number | Input tokens consumed |
| completion_tokens | number | Output tokens generated |
| total_tokens | number | Total tokens (prompt + completion) |
| reasoning_tokens | number | Reasoning tokens (for thinking models) |
| cached_tokens | number | Prompt tokens served from cache |
| cost | number | Jumlah USD yang ditagihkan kepada pelanggan untuk permintaan ini |
| duration_ms | number | End-to-end latency in milliseconds |
| throughput | number | Generation speed in tokens/sec |
| finish_reason | string | stop | length | content_filter | error |
| status | number | Kode status respons BazaarLink |
| app_name | string | null | Application name (X-Title header) |
| key_name | string | API key name used for the request |
Laporkan Masukan
Bantu kami meningkatkan BazaarLink dengan melaporkan masalah, bug, atau saran. Kami secara aktif memantau semua saluran umpan balik.
Cara Melaporkan
Yang Harus Disertakan
- ID Permintaan (dari field id respons)
- Model yang digunakan dan parameter yang dikirim
- Perilaku yang diharapkan vs aktual
- Stempel waktu dan frekuensi masalah
- Pesan error atau kode status HTTP
Data sosial (
:social)Tambahkan
:socialdi belakang nama model jika pertanyaan Anda tentang platform sosial. Sebelum model menjawab, BazaarLink mengambil postingan, profil, atau komentar yang relevan dari platform tersebut dan menyediakannya sebagai bahan referensi. Jika data platform tidak dapat diambil tepat waktu, permintaan dialihkan ke pencarian web biasa sehingga Anda tetap mendapat jawaban.Contoh
curl https://bazaarlink.ai/api/v1/chat/completions \ -H "Authorization: Bearer $BAZAARLINK_API_KEY" \ -H "Content-Type: application/json" \ --max-time 60 \ -d '{ "model": "gpt-5.4-mini:social", "messages": [{ "role": "user", "content": "Postingan terbaru di X tentang GPT-6" }] }'Yang perlu diketahui
:socialdapat memerlukan 20 hingga 40 detik sebelum jawaban mulai muncul. Setelah 40 detik, permintaan dialihkan ke pencarian web. Atur timeout klien minimal 60 detik.:onlinetetap cepat karena merupakan pencarian web biasa.:online(5 per hari tanpa saldo, 10 dengan saldo atau langganan, direset pada 00:00 UTC). Di luar kuota, setiap kueri ditagih sesuai tabel harga Data API (lihatGET /v1/data/catalog), di luar biaya token model itu sendiri. Kueri yang dialihkan ke pencarian web ditagih seperti:online.:socialhanya membaca sebagian platform sosial, dan daftarnya bergantung pada pengaturan yang aktif; daftar terkini ada di/solutions/data-api#social-suffix. Platform yang ada di katalog Data API tetapi tidak ada di daftar itu tidak dibaca oleh:social, sehingga kueri tentangnya, atau tanpa platform tertentu, dijawab dengan pencarian web.POST /api/v1/chat/completions,/api/v1/messages, dan/api/v1/responses, baik streaming maupun non-streaming, dengan sitasi yang sama seperti:online.:onlinedan:socialtidak dapat digabungkan dalam satu nama model (400invalid_web_search_options).