BazaarLinkBazaarLink
साइन इन
दस्तावेज़API संदर्भSDK संदर्भएजेंटिक उपयोगAI स्किल्स

BazaarLink दस्तावेज़ीकरण

BazaarLink ताइवान के लिए एक एकीकृत AI API गेटवे है - जो एक एकल, OpenAI-संगत के माध्यम से OpenAI, Anthropic, Google, मेटा और अधिक से सैकड़ों मॉडलों तक पहुंच प्रदान करता है। API समापन बिंदु।

AI एजेंट कौशल फ़ाइल
BazaarLink API का पूरा ज्ञान देने के लिए हमारी कौशल फ़ाइल को अपने AI सहायक (Claude, कर्सर, कोपायलट…) में लोड करें:
Read https://bazaarlink.ai/skill.md and follow the instructions to integrate BazaarLink into your app.
मुफ़्त मॉडल और रेट लिमिट
मुफ़्त मॉडल, प्रति-मिनट अनुरोध सीमा और मुफ़्त क्रेडिट की जानकारी के लिए देखें रेट लिमिट · सामान्य प्रश्न

मूल्य निर्धारण

BazaarLink मूल्य मॉडल उपयोग शून्य मार्कअप पर (प्रत्येक प्रदाता की आधिकारिक सूची मूल्य के समान)। प्लेटफ़ॉर्म शुल्क टॉप-अप (जमा) पर लिया जाता है: एक 10% लेनदेन शुल्क, साथ ही 5% ताइवान VAT TWD चैनलों पर। TWD उद्धरण और इलेक्ट्रॉनिक एकीकृत चालान के साथ USD में बिल किया गया। सेल्फ-सर्व पे-एज़-यू-टॉप-अप; उद्यम मासिक बिलिंग (नेट-30, परक्राम्य) की व्यवस्था कर सकते हैं।

यह कैसे काम करता है

  • उपभोग (डेबिट): प्रत्येक API कॉल को प्रदाता के आधिकारिक USD सूची मूल्य पर वास्तविक टोकन उपयोग द्वारा बिल किया जाता है, जो आपके शेष से काटा जाता है - शून्य मार्कअप, उपभोग पर कोई अतिरिक्त शुल्क नहीं।
  • टॉप-अप (जमा): TWD को वास्तविक समय बिक्री दर पर USD में परिवर्तित किया जाता है और आपके शेष में जोड़ा जाता है; टॉप-अप पर 10% लेनदेन शुल्क लिया जाता है।
  • • भुगतान विधियाँ और चैनल-विशिष्ट शुल्क लाइव चेकआउट पर दिखते हैं।
  • • पात्र TWD चैनल लागू कर और ताइवान ई-इनवॉइस की शर्तें भुगतान से पहले दिखाते हैं।
  • • बैंक वायर ट्रांसफर: बड़े या एंटरप्राइज़ टॉप-अप के लिए, वायर ट्रांसफर और कस्टम इनवॉइसिंग की व्यवस्था करने के लिए हमसे संपर्क करें।
  • इनवॉइस केवल वर्तमान में उपलब्ध पात्र चैनल या पुष्टि की गई एंटरप्राइज़ शर्तों से मिलता है। टैक्स आईडी, कोटेशन या मासिक बिलिंग के लिए भुगतान से पहले बिक्री टीम से संपर्क करें।
उदाहरण
US$10.00 क्रेडिट खरीदते समय लाइव चेकआउट पुष्टि से पहले उपलब्ध विधियाँ, अंतिम राशि, शुल्क या कर और रसीद या इनवॉइस पात्रता दिखाता है। शेष राशि बाद में बिना मॉडल मार्कअप के आधिकारिक सूची मूल्य पर खर्च होती है।

विनिमय दर के बारे में

विदेशी-विनिमय रूपांतरण वास्तविक समय दर का उपयोग करता है; मासिक बिलिंग बिलिंग (विवरण) समय पर दर का उपयोग करती है, जबकि प्रीपेड टॉप-अप टॉप-अप-टाइम दर पर परिवर्तित होते हैं। दर और टाइमस्टैम्प को बिलिंग रिकॉर्ड के साथ रखा जाता है।

विफल अनुरोधों के लिए बिलिंग सुरक्षा

यदि upstream अनुरोध बिना बिल योग्य usage के विफल होता है, तो BazaarLink आरक्षित पूरी राशि अपने-आप लौटा देता है। stream शुरू होने के बाद विफल होने पर भी उस प्रयास का शुल्क USD 0 रहता है।

कब शुल्क नहीं लगता
कोई सेटिंग चालू करने की आवश्यकता नहीं है। यह नियम public inference और media API पर अपने-आप लागू होता है। upstream प्रदाता द्वारा BazaarLink से शुल्क लेने पर भी BazaarLink विफल अनुरोध की लागत स्वयं वहन कर सकता है।
  • upstream से कनेक्शन न हो, अनुरोध अस्वीकार हो या कोई उपयोगी परिणाम न मिले
  • अंतिम usage रिकॉर्ड मिलने से पहले stream रुक जाए, भले कुछ सामग्री मिल चुकी हो
  • response में usage न हो या सभी मान 0 वाला खाली usage object हो

0 output tokens का अर्थ हमेशा निःशुल्क नहीं है

usage.cost इस अनुरोध पर ली गई USD राशि है। output tokens 0 होने पर भी input tokens का शुल्क लग सकता है; अंतिम राशि के लिए usage.cost या Activity रिकॉर्ड देखें।

क्विक स्टार्ट

इंटीग्रेट करने के तीन तरीके

तरीका
किसके लिए सबसे उपयुक्त
शुरू करें
कच्चा APIकोई भी भाषा, शून्य डिपेंडेंसी, अनुरोध पर पूर्ण नियंत्रण→
OpenAI / Anthropic SDKपहले से आधिकारिक SDK पर हैं — केवल base URL और key बदलें→
एजेंट फ्रेमवर्कLangChain, Vercel AI SDK, CrewAI और अन्य एजेंट ऐप्स→
सभी अनुरोधों की मॉडल तक पहुँचने से पहले स्वचालित रूप से समीक्षा की जाती है; हमारी उपयोग नीति का उल्लंघन करने वाले अनुरोध अस्वीकार कर दिए जाते हैं और 403 त्रुटि लौटाते हैं।

5 मिनट से कम समय में आरंभ करें। BazaarLink OpenAI SDK के साथ पूरी तरह से संगत है - बस इसे बदलें

100 सेकंड से अधिक लंबे अनुरोधों के लिए stream:true का उपयोग करने की सलाह दी जाती है। non-streaming अनुरोधों में लगभग 12 सेकंड बाद (यह डिफ़ॉल्ट मान है, जिसे डिप्लॉयमेंट सेटिंग से बदला जा सकता है) पहले 200 लौटाया जाता है और keepalive whitespace भेजना शुरू होता है; बाद में कोई त्रुटि होने पर उसे 200 + error JSON के रूप में लौटाया जाता है। keepalive JSON body से पहले का whitespace है, जिसे मानक JSON पार्सर अनदेखा करते हैं।

Base URL

https://api.bazaarlink.ai/v1

api.bazaarlink.ai एक केवल-API प्रवेश बिंदु है, जो वेबसाइट से अलग तैनात किया गया है। पिछला बेस URL https://bazaarlink.ai/api/v1 पूरी तरह समर्थित रहता है — मौजूदा एकीकरण को बदलने की आवश्यकता नहीं है।

OpenAI SDK का उपयोग करना

BazaarLink OpenAI SDK के साथ पूरी तरह से संगत है। बस आधार URL और API कुंजी बदलें - अन्य सभी कोड वही रहेंगे।

from openai import OpenAI

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

completion = client.chat.completions.create(
    model="openai/gpt-4o",
    messages=[
        {"role": "user", "content": "What is the meaning of life?"}
    ],
)

print(completion.choices[0].message.content)
एक API कुंजी की आवश्यकता है?
से अपनी API कुंजी प्राप्त करें API कुंजी पृष्ठ. सभी कुंजियाँ प्रारंभ होती हैं sk-bl-.
ब्राउज़र से सीधे कॉल करें (CORS)
सार्वजनिक API हर /v1 प्रतिक्रिया के साथ Access-Control-Allow-Origin: * भेजता है, इसलिए आप इसे ब्राउज़र JavaScript से fetch या OpenAI SDK के ज़रिए सीधे कॉल कर सकते हैं। अपनी API कुंजी फ्रंटएंड कोड में कभी न रखें — पेज खोलने वाला कोई भी उसे पढ़ सकता है; रद्द की जा सकने वाली, सीमित खर्च वाली कुंजी इस्तेमाल करें या कॉल को अपने बैकएंड से होकर भेजें।
मॉडल आईडी प्रारूप - provider/model-name का उपयोग करें
GET /v1/models में "claude-sonnet-4.6" जैसे ids और "anthropic/claude-sonnet-4.6" जैसे canonical aliases हैं। दोनों रूप स्वीकार हैं; सूचीबद्ध id या alias इस्तेमाल करें।
✓ claude-sonnet-4.6   anthropic/claude-sonnet-4.6

अपनी अपस्ट्रीम कुंजी लाएँ (BYOK)

अपनी अपस्ट्रीम API कुंजी को खाते या संगठन से जोड़ें। योग्य अनुरोध पहले आपकी कुंजी का उपयोग करते हैं। अपस्ट्रीम त्रुटि के बाद कोई दूसरा उपलब्ध स्रोत आज़माया जा सकता है; उपलब्ध न हो तो त्रुटि लौटती है। व्यक्तिगत कुंजियाँ कुंजी पृष्ठ पर और संगठन की कुंजियाँ संगठन सेटिंग में प्रबंधित करें। BYOK सेटिंग्स पर जाएँ →

सामग्री फ़िल्टरिंग

आपके API ट्रैफ़िक के लिए दोतरफ़ा सामग्री सुरक्षा: प्रॉम्प्ट इंजेक्शन वाले अनुरोध ब्लॉक (400) होते हैं, और अनुरोध व प्रतिक्रिया में संवेदनशील डेटा (API कुंजियाँ, कार्ड नंबर, पहचान संख्याएँ आदि) अपने आप छिपा दिया जाता है। नियम और छूट सूची अनुकूलन योग्य हैं, उपयोग आँकड़े भी उपलब्ध हैं। सामग्री फ़िल्टर सेटिंग्स पर जाएँ →

सोशल डेटा (:social)

जब आपका सवाल किसी सोशल प्लेटफ़ॉर्म से जुड़ा हो, तो मॉडल नाम के अंत में :social जोड़ें। मॉडल के जवाब देने से पहले BazaarLink उस प्लेटफ़ॉर्म से मेल खाने वाली पोस्ट, प्रोफ़ाइल या टिप्पणियाँ लाकर संदर्भ सामग्री के रूप में देता है। यदि प्लेटफ़ॉर्म का डेटा समय पर नहीं मिल पाता, तो अनुरोध सामान्य वेब खोज पर फ़ॉलबैक हो जाता है, इसलिए आपको जवाब फिर भी मिलता है।

उदाहरण

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": "GPT-6 के बारे में X पर हाल की पोस्ट" }]
  }'

ध्यान रखने योग्य बातें

  • प्रतीक्षा समय: सोशल डेटा लाइव लाया जाता है, इसलिए :social अनुरोध में जवाब शुरू होने से पहले 20 से 40 सेकंड लग सकते हैं। 40 सेकंड के बाद वेब खोज पर फ़ॉलबैक हो जाता है। क्लाइंट टाइमआउट कम से कम 60 सेकंड रखें। :online तेज़ रहता है क्योंकि वह सामान्य वेब खोज है।
  • कीमत: सोशल डेटा से जवाब पाने वाली क्वेरी :online जैसा ही खोज का दैनिक निःशुल्क कोटा इस्तेमाल करती हैं (बिना बैलेंस के प्रतिदिन 5, बैलेंस या सब्सक्रिप्शन के साथ 10, UTC 00:00 पर रीसेट)। कोटा पूरा होने के बाद हर क्वेरी का बिल Data API की मूल्य तालिका (देखें GET /v1/data/catalog) के अनुसार बनता है, जो मॉडल के अपने टोकन शुल्क के अतिरिक्त है। वेब खोज पर फ़ॉलबैक होने वाली क्वेरी का बिल :online की तरह बनता है।
  • कवरेज: :social केवल कुछ सोशल प्लेटफ़ॉर्म पढ़ता है और सूची चालू सेटिंग पर निर्भर करती है; मौजूदा सूची /solutions/data-api#social-suffix पर है। जो प्लेटफ़ॉर्म Data API कैटलॉग में है पर उस सूची में नहीं, उसे :social नहीं पढ़ता, इसलिए उसके बारे में या किसी प्लेटफ़ॉर्म के बिना पूछी गई क्वेरी का जवाब वेब खोज से दिया जाता है।
  • संगतता: POST /api/v1/chat/completions, /api/v1/messages और /api/v1/responses पर काम करता है, स्ट्रीमिंग और गैर-स्ट्रीमिंग दोनों में, :online जैसे ही उद्धरणों के साथ। :online और :social को एक मॉडल नाम में एक साथ इस्तेमाल नहीं किया जा सकता (400 invalid_web_search_options)।

OpenRouter से माइग्रेट करें

BazaarLink का API OpenRouter-संगत है — अधिकांश इंटीग्रेशन केवल दो मान बदलकर स्विच हो जाते हैं: base URL को https://api.bazaarlink.ai/v1 और API key को sk-bl- से शुरू होने वाली BazaarLink key से।

  1. आधार URL: https://openrouter.ai/api/v1 → https://api.bazaarlink.ai/v1
  2. API key: sk-or-... → sk-bl-... (/keys पर एक बनाएँ)
  3. मॉडल ID: वही provider/model फॉर्मेट (जैसे anthropic/claude-sonnet-4.6); पूरा कैटलॉग GET /v1/models पर
  4. models[] फ़ॉलबैक, स्ट्रीमिंग, टूल कॉलिंग और स्ट्रक्चर्ड आउटपुट समान अनुरोध स्वरूप का उपयोग करते हैं
  from openai import OpenAI

  client = OpenAI(
-     base_url="https://openrouter.ai/api/v1",
-     api_key="sk-or-...",
+     base_url="https://api.bazaarlink.ai/v1",
+     api_key="sk-bl-...",
  )
Note
बिलिंग USD में होती है और ताइवान ई-इनवॉइस उपलब्ध हैं। :nitro जैसे अपस्ट्रीम-विशिष्ट रूटिंग नियंत्रण अनदेखे किए जाते हैं। BazaarLink के समर्थित रूटिंग विकल्पों के लिए API संदर्भ देखें।

प्रमाणीकरण

सभी API अनुरोधों के लिए आपकी API कुंजी के साथ एक प्राधिकरण हेडर की आवश्यकता होती है।

Authorization: Bearer sk-bl-YOUR_API_KEY

से अपनी API कुंजी प्राप्त करें डैशबोर्ड. अपनी कुंजी सुरक्षित रखें - इसे क्लाइंट-साइड कोड में उजागर न करें।

सुरक्षा नोट
क्लाइंट-साइड JavaScript में कभी भी API कुंजियाँ उजागर न करें। हमेशा अपने बैकएंड सर्वर के माध्यम से प्रॉक्सी अनुरोध करें।

वैकल्पिक शीर्षलेख

HTTP-Referer
string
आपकी साइट URL, उपयोग ट्रैकिंग और विश्लेषण के लिए (वैकल्पिक)
X-Title
string
आपके ऐप का नाम, डैशबोर्ड में दिखाया गया है (वैकल्पिक)

सिद्धांत

BazaarLink को तीन मुख्य सिद्धांतों के आधार पर डिज़ाइन किया गया है:

1. एकीकृत इंटरफ़ेस

One API, एक SDK, सैकड़ों मॉडल। अपना कोड बदले बिना OpenAI, Anthropic, Google मिथुन, मेटा लामा और अन्य के बीच स्विच करें - बस मॉडल आईडी बदलें।

2. मूल्य अनुकूलन

BazaarLink स्वचालित रूप से आपके चुने हुए मॉडल के लिए सबसे अधिक लागत प्रभावी प्रदाता तक पहुंच जाता है। आप केवल उसी के लिए भुगतान करते हैं जिसका आप उपयोग करते हैं, पूर्ण इनवॉइसिंग समर्थन के साथ USD में बिल किया जाता है।

3. अनुरोध प्रक्रिया

अपस्ट्रीम स्रोत में समस्या होने पर अनुरोध किसी दूसरे उपलब्ध स्रोत को आज़मा सकता है। कोई स्रोत उपलब्ध न हो तो अनुरोध में त्रुटि लौटती है।

मल्टीमॉडल

BazaarLink मल्टीमॉडल इनपुट का समर्थन करता है - उन मॉडलों को टेक्स्ट के साथ छवियां, ऑडियो और फ़ाइलें भेजें जो उनका समर्थन करते हैं। सामग्री अपस्ट्रीम प्रदाता को भेज दी जाती है।

समर्थित तौर-तरीके

इनपुट
विवरण
उदाहरण मॉडल
Textमानक पाठ संदेशसभी मॉडल
छवियाँURL या बेस64 डेटा URI — PNG, JPEG, WebP, GIFopenai/gpt-6-lunaanthropic/claude-sonnet-4.6google/gemini-4-argon+98 और
फ़ाइलें/पीडीएफ़दस्तावेज़ बेस64 डेटा के माध्यम से URI (`data:application/pdf;base64,...`)openai/gpt-6-lunaanthropic/claude-sonnet-4.6google/gemini-4-argon+41 और
ऑडियोRaw बेस64 - कोई URL समर्थन नहीं। `format` फ़ील्ड की आवश्यकता हैgoogle/gemini-4-argonxiaomi/mimo-v2.6-flashgoogle/gemini-3.1-flash-lite-preview+15 और
वीडियोURL (CDN) या बेस64 डेटा URIgoogle/gemini-4-argonqwen/qwen3.8-maxz-ai/glm-5v-turbo+39 और

उदाहरण:

# Image — URL or base64 data URI
curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-3.5-flash","messages":[{"role":"user","content":[
        {"type":"text","text":"What is in this?"},
        {"type":"image_url","image_url":{"url":"https://example.com/photo.jpg"}}
      ]}]}'

# File / PDF — base64 data URI only, no URL
curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-3.5-flash","messages":[{"role":"user","content":[
        {"type":"file","file":{"filename":"doc.pdf","file_data":"data:application/pdf;base64,JVBER..."}},
        {"type":"text","text":"Summarize this."}
      ]}]}'

# Audio — raw base64, no URL. "format" is required
curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-3.5-flash","messages":[{"role":"user","content":[
        {"type":"text","text":"Transcribe this."},
        {"type":"input_audio","input_audio":{"data":"UklGRi...","format":"wav"}}
      ]}]}'

# Video — URL (CDN) or base64 data URI
curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-3.5-flash","messages":[{"role":"user","content":[
        {"type":"text","text":"Describe this video."},
        {"type":"video_url","video_url":{"url":"https://example.com/clip.mp4"}}
      ]}]}'

छवियां भेज रहा हूं

image_url भागों के साथ सामग्री सरणी प्रारूप का उपयोग करें। समर्थित प्रारूप: PNG, JPEG, WebP, और GIF (एनिमेटेड सहित)। आप एक ही संदेश में एकाधिक छवियां शामिल कर सकते हैं - प्रत्येक एक अलग छवि_यूआरएल भाग के रूप में:

curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-bl-YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o",
    "messages": [{"role":"user","content":[
      {"type":"text","text":"What is in this image?"},
      {"type":"image_url","image_url":{"url":"https://example.com/photo.jpg","detail":"auto"}}
    ]}]
  }'
छवियां भेज रहा हूं
हमेशा छवियों के साथ एक पाठ भाग शामिल करें। सभी प्रदाताओं के बीच सर्वोत्तम अनुकूलता के लिए टेक्स्ट-फर्स्ट ऑर्डरिंग (छवि भागों से पहले टेक्स्ट भाग) की अनुशंसा की जाती है।
छवियां भेज रहा हूं
प्रत्येक मॉडल के समर्थित इनपुट तौर-तरीकों के लिए मॉडल पृष्ठ की जाँच करें। मॉडेलिटी कॉलम दिखाता है कि प्रत्येक मॉडल कौन से इनपुट स्वीकार करता है।

सीमाएँ

BazaarLink में दो स्वतंत्र सीमाएँ लागू होती हैं: requests per minute पर rate limit, और account spending पर credit limit। Rate limit पार होने पर HTTP 429 मिलता है; credits खत्म होने पर HTTP 402 मिलता है।

दर सीमा

Rate सीमाएं प्रति उपयोगकर्ता (प्रति कुंजी नहीं) हैं, प्रति मिनट अनुरोधों में मापी जाती हैं (RPM)। कोई दैनिक सीमा नहीं है. टियर आपके खाते के क्रेडिट बैलेंस द्वारा स्वचालित रूप से निर्धारित होता है।

टियर
RPM
दैनिक उपयोग
नोट्स
निःशुल्क (<$5 क्रेडिट)20 RPMअनलिमिटेडविकास एवं परीक्षण
पेड (≥ $5 क्रेडिट)200 RPMअनलिमिटेडउत्पादन कार्यभार

जब दर सीमा पार हो जाती है तो आपको रिट्री-आफ्टर हेडर के साथ 429 प्रतिक्रिया प्राप्त होती है। अनुरोधों को पुनः प्रयास करते समय घातीय बैकऑफ़ लागू करें।

रिस्पॉन्स हेडर

Responses में x-request-id; non-streaming में x-generation-id; x-ratelimit-*; लागू होने पर retry-after; और auto या auto:free routing के लिए x-auto-resolved-model हो सकते हैं।

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-4o

क्रेडिट सीमा

402 response का मतलब है कि आपका account balance या key की spending cap शून्य पर पहुँच गई है — न कि आप बहुत तेज़ requests भेज रहे हैं। इन responses में rate limit headers नहीं होते, और अगर limit streaming के बीच में लगे तो HTTP status बदलने की बजाय SSE error event मिलेगा।

402 अपर्याप्त क्रेडिट
जब आपका balance $0 तक पहुँच जाता है, तो API HTTP 402 के साथ message "Insufficient credits. Please top up to continue." लौटाता है — real time में spending track करने के लिए responses में usage.cost monitor करें।

IP allowlist

हर API कुंजी के लिए अलग IP allowlist सेट की जा सकती है, ताकि केवल निर्धारित source IP से आने वाले अनुरोध ही उस कुंजी का उपयोग कर सकें।

कब उपयोग करें

यह fixed outbound IP वाले production server deployment के लिए उपयोगी है। यदि आपका application home network, mobile network या बदलते पते से अनुरोध भेजता है, तो पहले सुनिश्चित करें कि outbound IP स्थिर है; वरना आप खुद को बाहर lock कर सकते हैं।

कैसे सेट करें

इस पेज पर /keys खोलें, संबंधित कुंजी के "⋯" menu में "IP allowlist" चुनें, entries डालें और save करें।

वैकल्पिक रूप से, signed-in session या Management API key के साथ PATCH /api/v1/keys/:id का उपयोग करें:

PATCH https://api.bazaarlink.ai/v1/keys/KEY_ID
Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY
Content-Type: application/json

{
  "allowedCidrs": [
    "203.0.113.7",
    "198.51.100.0/24"
  ]
}

# Clear the allowlist and return to unrestricted access
{"allowedCidrs": []}

Entry format

UI में हर line पर एक value डालें। API में इन्हीं values को `allowedCidrs` array में भेजें। Bare IPv4 address, IPv4 CIDR या IPv6 literal (केवल exact match) स्वीकार किए जाते हैं।

203.0.113.7
198.51.100.0/24
2001:db8::1

व्यवहार

खाली छोड़ने (empty [] array भेजने) का अर्थ है सभी source IP को अनुमति देना। यह default है; मौजूदा कुंजियों का व्यवहार नहीं बदलता।

Source IP `cf-connecting-ip` header से लिया जाता है।

यदि list खाली नहीं है लेकिन source IP resolve नहीं हो पाता, तो request अस्वीकार कर दी जाती है (fail-closed)।

⚠️ महत्वपूर्ण: अस्वीकृति केवल सामान्य 401 लौटाती है
List से बाहर के IP या resolve न हो सकने वाले source IP वाली request को invalid key जैसा ही सामान्य HTTP 401 मिलता है; कोई अलग error message नहीं होता। यह जानबूझकर किया गया security design है, ताकि चुराई हुई key वाला व्यक्ति allowlist के अस्तित्व का पता न लगा सके। इसकी कीमत यह है कि गलत configuration invalid key जैसी ही दिखती है और debug करना बहुत कठिन होता है। Save करने से पहले सुनिश्चित करें कि आपके server का outbound IP list में मौजूद है।
⚠️ महत्वपूर्ण: IPv6 में केवल exact string match समर्थित है
IPv6 के लिए subnet calculation नहीं होती; address string बिल्कुल समान होनी चाहिए। यदि IPv6 address बदलता रहता है, तो आप बाहर lock हो सकते हैं। /0–/32 CIDR ranges केवल IPv4 के लिए समर्थित हैं।
सेटिंग कब लागू होती है
PATCH या UI save सफल होने के बाद update करने वाला instance अपना cache तुरंत साफ करता है। सामान्य स्थिति में अन्य instances लगभग 15 seconds के भीतर sync हो जाते हैं। साझा Redis अस्थायी रूप से unavailable होने पर instances के बीच invalidation तुरंत नहीं पहुँच सकती और एक घंटे की cache TTL तक देरी हो सकती है।

व्यक्तिगत सर्किट ब्रेकर

आपकी सभी API कुंजियों पर लागू होने वाली 1 मिनट और 1 घंटे की स्थिर (fixed) USD खर्च सीमा। जब विंडो की सीमा पार हो जाए तो नए अनुरोधों को HTTP 429 मिलता है; विंडो clock boundary पर स्वतः रीसेट हो जाती है।

cbEnabled
boolean
सक्रिय
cbMinuteUsd
number | null
प्रति मिनट USD सीमा · डिफ़ॉल्ट उपयोग करें
cbHourlyUsd
number | null
प्रति घंटा USD सीमा · डिफ़ॉल्ट उपयोग करें
(डिफ़ॉल्ट इनहेरिट हो रहा है)
मान कम से कम 0.01 होने चाहिए (या डिफ़ॉल्ट के लिए खाली छोड़ें)
व्यक्तिगत सर्किट ब्रेकर · समायोजित करें →

खाता सुरक्षा

पासवर्ड के अलावा, BazaarLink साइन-इन पर सुरक्षा की एक अतिरिक्त परत के लिए दो-चरणीय सत्यापन का भी समर्थन करता है।

दो-चरणीय सत्यापन (TOTP) सक्षम करें

  1. "सेटिंग्स" पेज पर जाएं, "दो-चरणीय सत्यापन (TOTP)" सेक्शन खोजें और "दो-चरणीय सत्यापन सक्षम करें" पर क्लिक करें।
  2. किसी authenticator ऐप (जैसे Google Authenticator) से स्क्रीन पर दिख रहा QR कोड स्कैन करें, या नीचे दी गई सीक्रेट को मैन्युअल रूप से दर्ज करें।
  3. authenticator द्वारा जनरेट किया गया 6-अंकीय कोड दर्ज करें और पुष्टि करें — सक्षम करना पूरा हो जाएगा।

सक्षम करने के बाद सिस्टम 8 बैकअप कोड दिखाएगा (केवल एक बार दिखाए जाते हैं) — हर कोड 10 अक्षर का है और केवल एक बार काम करता है। इन्हें तुरंत लिख लें या कॉपी करके फ़ोन के अलावा किसी सुरक्षित जगह सहेजें; फ़ोन खोने या authenticator तक पहुंच न होने पर बैकअप कोड से साइन-इन करें।

सक्षम करने के बाद साइन-इन कैसे बदलता है
इसके बाद हर साइन-इन पर पासवर्ड (या Google साइन-इन) के अलावा authenticator ऐप का कोड या एक बैकअप कोड भी दर्ज करना होगा।

खाते की सुरक्षा के अन्य तरीके

लीक हुई या गलत इस्तेमाल हुई कुंजी से होने वाले नुकसान को और कम करने के लिए इन्हें दो-चरणीय सत्यापन के साथ जोड़ें:

  • IP allowlist — API कुंजी को केवल तय किए गए स्रोत IP से इस्तेमाल करने तक सीमित करता है।
  • व्यक्तिगत सर्किट ब्रेकर — प्रति मिनट और प्रति घंटा खर्च की सीमा तय करता है, जो सीमा पार होने पर अपने आप रुक जाती है।
  • प्रति-कुंजी खर्च सीमा — API कुंजी बनाते या अपडेट करते समय दैनिक, साप्ताहिक या मासिक खर्च सीमा तय करना।

Image जनरेशन

modalities:["image"] के साथ /v1/chat/completions या OpenAI DALL·E-संगत /v1/images/generations से इमेज जनरेट करें।

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}'

पूरा फ़्लो (स्ट्रीमिंग, इमेज एडिट, SSE प्रोटोकॉल, मॉडल सूची) API रेफ़रेंस में देखें →

वीडियो जनरेशन

असिंक्रोनस 3-चरण फ़्लो (submit → poll → content). वीडियो जनरेशन में 30 सेकंड से 5 मिनट तक लगते हैं।

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" }

पूरा फ़्लो (पोलिंग, डाउनलोड, टास्क प्रकार, चेतावनियाँ) API रेफ़रेंस में देखें →

PDF इनपुट

PDF को नेटिव रूप से सपोर्ट करने वाले मॉडल (जैसे Claude, Gemini) को संदेशों में सीधे PDF दस्तावेज़ भेजें। BazaarLink फ़ाइल को सीधे मॉडल को भेजता है — सामान्य input tokens की तरह बिल होता है, कोई अतिरिक्त शुल्क या प्रोसेसिंग चरण नहीं।

समर्थित प्रारूप

  • PDF दस्तावेज़ (पाठ, चित्र, तालिकाएँ, स्कैन किए गए)
  • Base64-एन्कोडेड डेटा URL (`data:application/pdf;base64,...`)
  • बहु-पृष्ठ दस्तावेज़ केवल
  • पासवर्ड-मुक्त पीडीएफ
import base64

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

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

वीडियो इनपुट

वीडियो इनपुट सपोर्ट करने वाले मॉडल को वीडियो फ़ाइलें भेजें ताकि विश्लेषण, कैप्शन या दृश्यों और घटनाओं से जुड़े सवालों के जवाब पाए जा सकें। सीधे URL या base64 data URI से काम करता है — सार्वजनिक रूप से उपलब्ध वीडियो के लिए URL अधिक कुशल है; स्थानीय फ़ाइलों या निजी वीडियो के लिए base64।

समर्थित प्रारूप

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

पूरा API संदर्भ →

OAuth PKCE

OAuth 2.0 PKCE (कोड एक्सचेंज के लिए प्रूफ कुंजी) सार्वजनिक क्लाइंट ऐप्स (ब्राउज़र एसपीए, मोबाइल ऐप्स) को लंबे समय तक चलने वाले सर्वर गुप्त क्लाइंट-साइड को संग्रहीत किए बिना व्यक्तिगत उपयोगकर्ताओं की ओर से API कॉल करने देता है।

OAuth PKCE का उपयोग कब करें

  • एक ब्राउज़र SPA या मोबाइल ऐप बनाना जिसके लिए प्रति-उपयोगकर्ता बिलिंग की आवश्यकता हो
  • मल्टी-टेनेंट SaaS - प्रत्येक अंतिम-उपयोगकर्ता अपने स्वयं के API उपयोग के लिए भुगतान करता है
  • आप साझा गुप्त क्लाइंट-साइड (सार्वजनिक क्लाइंट) संग्रहीत नहीं कर सकते
  • आपको एकल साझा API कुंजी के बजाय प्रति-उपयोगकर्ता अलग, रद्द की जा सकने वाली कुंजी चाहिए (जो उपयोगकर्ता द्वारा रद्द किए जाने तक मान्य रहती है)

आपके उपयोगकर्ता क्या देखेंगे

अपनी साइन-इन स्क्रीन पर इन चरणों का वर्णन करें:

  1. आपके ऐप में वे "BazaarLink से साइन इन करें" चुनते हैं (या आप बटन का जो भी नाम रखें)।
  2. उनका ब्राउज़र BazaarLink का ऑथराइज़ेशन पेज खोलता है। यदि वे अभी साइन इन नहीं हैं, तो पहले साइन इन करते हैं और अपने आप इस पेज पर लौट आते हैं।
  3. पेज आपके ऐप का पता और अनुमति देने पर होने वाली बातें दिखाता है: ऐप के लिए एक नई API कुंजी बनती है, उपयोग का शुल्क उनके BazaarLink बैलेंस से कटता है, और वे कुंजी को किसी भी समय रद्द कर सकते हैं। वे कुंजी का नाम रख सकते हैं और मासिक खर्च सीमा तय कर सकते हैं (दोनों वैकल्पिक)।
  4. वे "अनुमति दें" पर क्लिक करते हैं और आपके ऐप पर वापस भेज दिए जाते हैं। यदि वे "अस्वीकार करें" पर क्लिक करते हैं, तो कोई कुंजी नहीं बनती, आपके ऐप को सूचित नहीं किया जाता और उन्हें "एक्सेस अस्वीकृत" पेज दिखता है।
  5. बाद में एक्सेस रद्द करने के लिए वे "API कुंजियाँ" पेज (https://bazaarlink.ai/keys) खोलते हैं और आपके ऐप के नाम वाली कुंजी को अक्षम या हटा देते हैं।

यह कैसे काम करता है

चरण 1 - प्रमाणीकरण आरंभ करें — एक यादृच्छिक कोड_सत्यापनकर्ता (एक लंबी यादृच्छिक स्ट्रिंग) और उसके SHA-256 हैश को कोड_चैलेंज के रूप में जेनरेट करें, फिर उपयोगकर्ता को BazaarLink प्रमाणीकरण पृष्ठ पर रीडायरेक्ट करें।

https://bazaarlink.ai/auth?callback_url=https://yourapp.com/callback&code_challenge=CODE_CHALLENGE&code_challenge_method=S256

ऑथराइज़ेशन URL के पैरामीटर

  • callback_url (आवश्यक) — अनुमति देने के बाद उपयोगकर्ता जहाँ लौटता है। नियम नीचे देखें।
  • code_challenge (आवश्यक) — आपके code_verifier का base64url-एन्कोडेड SHA-256 (43 अक्षर, बिना पैडिंग)।
  • code_challenge_method (आवश्यक) — S256 होना चाहिए।
  • state (वैकल्पिक) — आपका अपना अपारदर्शी CSRF मान, 1 से 256 प्रिंट करने योग्य ASCII अक्षर। BazaarLink इसे code के ठीक बाद &state=… के रूप में बिना बदले लौटा देता है। गलत प्रारूप वाला state होने पर प्राधिकरण पेज "अमान्य प्राधिकरण अनुरोध" दिखाता है।
  • key_label (वैकल्पिक) — अधिकतम 100 अक्षर। यह सहमति पेज पर कुंजी का नाम पहले से भर देता है (उपयोगकर्ता इसे बदल सकता है)। बहुत लंबे या खाली लेबल अनदेखे कर दिए जाते हैं।
  • 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.

समर्थित नहीं

  • workspace_id और required_workspace_id — समर्थित नहीं। कुंजी हमेशा उपयोगकर्ता के अपने खाते की होती है।
  • code_challenge_method=plain — समर्थित नहीं (केवल S256)।

callback_url के नियम

  • यह https:// होना चाहिए। http:// केवल localhost, 127.0.0.1 और [::1] (किसी भी पोर्ट) के लिए स्वीकार किया जाता है; तब सहमति पेज स्थानीय विकास की चेतावनी दिखाता है।
  • कोई फ्रैगमेंट (#) नहीं, URL में उपयोगकर्ता नाम या पासवर्ड नहीं, अधिकतम 2048 अक्षर।
  • सहमति पेज आपके callback का होस्ट नाम दिखाता है ताकि उपयोगकर्ता देख सके कि कौन सा ऐप अनुरोध कर रहा है।
  • उपयोगकर्ता के अनुमति देने के बाद ब्राउज़र code=… जुड़े हुए आपके callback_url पर भेजा जाता है (और यदि आपने state भेजा था तो state=… भी; मौजूदा क्वेरी स्ट्रिंग बनी रहती है)। code 10 मिनट तक मान्य रहता है और केवल एक बार काम करता है।

चरण 2 - API कुंजी के लिए एक्सचेंज कोड — उपयोगकर्ता द्वारा अनुरोध को अधिकृत करने के बाद, BazaarLink एक बार उपयोग होने वाले code के साथ आपके callback_url पर रीडायरेक्ट करता है। code 10 मिनट तक मान्य रहता है और केवल एक बार उपयोग हो सकता है; गलत code_verifier से वह रद्द हो जाता है। उपयोगकर्ता की API कुंजी पाने के लिए code, code_verifier और code_challenge_method (तीनों आवश्यक) POST करें।

curl https://bazaarlink.ai/api/v1/auth/keys \
  -H "Content-Type: application/json" \
  -d '{
    "code": "<CODE_FROM_CALLBACK_URL>",
    "code_verifier": "<CODE_VERIFIER>",
    "code_challenge_method": "S256"
  }'

# Response
# { "key": "sk-bl-...", "user_id": "..." }

चरण 3 - उपयोगकर्ता-स्कोप्ड कुंजी का उपयोग करें — लौटाई गई कुंजी एक सामान्य BazaarLink API कुंजी है जो अधिकृत करने वाले उपयोगकर्ता की है — उपयोग का शुल्क आपके नहीं, उस उपयोगकर्ता के बैलेंस से कटता है।

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"}]}'

JavaScript उदाहरण (ब्राउज़र)

// 1) Create a verifier + S256 challenge, then send the user to BazaarLink
const b64url = (buf) => btoa(String.fromCharCode(...new Uint8Array(buf)))
  .replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
const verifier = b64url(crypto.getRandomValues(new Uint8Array(32)));
const challenge = b64url(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier)));
sessionStorage.setItem("bl_verifier", verifier);
// "state" is optional: BazaarLink hands it back unchanged next to the code.
const state = b64url(crypto.getRandomValues(new Uint8Array(16)));
sessionStorage.setItem("bl_state", state);
location.href =
  "https://bazaarlink.ai/auth?callback_url=" + encodeURIComponent(location.origin + "/callback") +
  "&code_challenge=" + challenge + "&code_challenge_method=S256&state=" + state;

// 2) On /callback: check your own state, then exchange the one-time code for a user key
const params = new URLSearchParams(location.search);
if (params.get("state") !== sessionStorage.getItem("bl_state")) throw new Error("state mismatch");
const res = await fetch("https://bazaarlink.ai/api/v1/auth/keys", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    code: params.get("code"),
    code_verifier: sessionStorage.getItem("bl_verifier"),
    code_challenge_method: "S256",
  }),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? "exchange failed"); // 403 invalid_code: ask the user to authorize again
const { key } = await res.json(); // use as: Authorization: Bearer <key>
सुरक्षा: केवल S256
code_challenge_method को S256 (SHA-256 हैश) पर सेट करें। केवल S256 समर्थित है: plain या बिना code_challenge_method वाले अनुरोध HTTP 400 के साथ अस्वीकार कर दिए जाते हैं।
नोट
यदि उपयोगकर्ता अस्वीकार करता है, तो BazaarLink आपके callback_url पर वापस रीडायरेक्ट नहीं करता और आपके ऐप को सूचित भी नहीं करता। यह केवल "एक्सेस अस्वीकृत" पेज दिखाता है, इसलिए /auth कभी ओपन रीडायरेक्ट नहीं बन सकता। "अधिकृत नहीं" स्थिति को अपने ऐप में संभालें (जैसे टाइमआउट या पुनः प्रयास बटन)।

/auth पेज और POST /api/v1/auth/keys https://bazaarlink.ai से परोसे जाते हैं (api.bazaarlink.ai से नहीं)। मिली हुई कुंजी दोनों बेस URL पर काम करती है: https://bazaarlink.ai/api/v1 और https://api.bazaarlink.ai/v1।

यदि उपयोगकर्ता अधिकृत करते समय खर्च सीमा तय करता है, तो वह मासिक सीमा होती है और खाते की मासिक अवधि के साथ रीसेट होती है।

त्रुटियाँ

त्रुटियाँ OpenAI-शैली के प्रारूप {"error":{"message","type","code"}} में आती हैं। POST /api/v1/auth/keys ये लौटा सकता है:

  • 400 invalid_code_challenge_method — code_challenge_method अनुपस्थित है, plain है, या S256 के अलावा कुछ और है।
  • 400 — JSON बॉडी अमान्य है, या code / code_verifier अनुपस्थित है।
  • 403 invalid_code — code अज्ञात, समाप्त या पहले ही उपयोग किया हुआ है, code_verifier गलत है, या खाते को अब अनुमति नहीं है। इन सभी में जानबूझकर एक ही संदेश लौटाया जाता है, ताकि कॉल करने वाला इन्हें अलग न पहचान सके। गलत code_verifier भी code को रद्द कर देता है: उपयोगकर्ता से दोबारा अधिकृत करने को कहें।
  • 429 rate_limited — एक IP से 10 मिनट में 30 से अधिक एक्सचेंज प्रयास (Retry-After हेडर देखें)।
  • 429 key_total_cap — खाते के पास पहले से अधिकतम 200 API कुंजियाँ हैं।
  • 405 — केवल POST स्वीकार किया जाता है।

अपने सर्वर से कोड बनाएँ (प्रबंधन कुंजी)

व्यक्तिगत प्रबंधन कुंजी (Management Key) का स्वामी उपयोगकर्ता को ब्राउज़र पेज पर भेजे बिना सीधे POST /api/v1/auth/keys/code से प्रमाणीकरण कोड बना सकता है (OpenRouter-संगत)। कोड प्रबंधन कुंजी के स्वामी से जुड़ा होता है, इसलिए इसके बदले मिलने वाली कुंजी उसी स्वामी के खाते की मानक कुंजी होती है, जिसकी सीमा, अवधि, समाप्ति और नाम यहीं तय किए जाते हैं। इसका उपयोग तब करें जब आपके अपने टूल के पास पहले से प्रबंधन कुंजी हो और वह किसी ऐप को सीमित कुंजी देना चाहता हो। एक्सचेंज (POST /api/v1/auth/keys) ऊपर जैसा ही है।

  • callback_url (आवश्यक) और code_challenge + code_challenge_method=S256 (आवश्यक) — नियम प्रमाणीकरण URL जैसे ही हैं।
  • key_label (वैकल्पिक) — अधिकतम 100 अक्षर; कुंजी का नाम। डिफ़ॉल्ट: "App: <आपका callback होस्ट>"।
  • limit (वैकल्पिक) — USD में खर्च सीमा, 0 या अधिक; 0 या न देने का मतलब कोई सीमा नहीं।
  • usage_limit_type (वैकल्पिक) — daily, weekly या monthly: सीमा कितनी बार रीसेट होती है। केवल limit के साथ उपयोग होता है; डिफ़ॉल्ट monthly है।
  • expires_at (वैकल्पिक) — कुंजी कब समाप्त होगी: भविष्य का ISO 8601 UTC समय, सेकंड सहित, जैसे 2026-12-31T23:59:59Z। केवल मिनट तक के मान अस्वीकार किए जाते हैं। न देने पर कुंजी रद्द किए जाने तक मान्य रहती है।
  • workspace_id — समर्थित नहीं (400)। spawn_agent और spawn_cloud स्वीकार किए जाते हैं पर अनदेखे रहते हैं।
curl https://bazaarlink.ai/api/v1/auth/keys/code \
  -H "Authorization: Bearer sk-bl-YOUR_MGMT_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "callback_url": "https://yourapp.com/callback",
    "code_challenge": "<CODE_CHALLENGE>",
    "code_challenge_method": "S256",
    "key_label": "My app",
    "limit": 10,
    "usage_limit_type": "monthly",
    "expires_at": "2026-12-31T23:59:59Z"
  }'

# Response
# { "data": { "id": "<ONE_TIME_CODE>", "app_id": 123456789, "created_at": "2026-10-22T12:00:00.000Z" } }
# Then POST { "code": "<ONE_TIME_CODE>", "code_verifier": "<CODE_VERIFIER>", "code_challenge_method": "S256" } to /api/v1/auth/keys

प्रतिक्रिया: { "data": { "id", "app_id", "created_at" } }। id वह एक-बार उपयोग वाला कोड है जिसे एक्सचेंज करना है (10 मिनट तक मान्य, केवल एक बार)। BazaarLink में ऐप रजिस्ट्री नहीं है, इसलिए app_id आपके callback पते से निकाला गया स्थिर पूर्णांक है: एक ही पते को हमेशा वही app_id मिलता है।

  • 401 unauthorized — Bearer कुंजी नहीं दी गई, या कुंजी अज्ञात है।
  • 403 management_key_required — कुंजी व्यक्तिगत प्रबंधन कुंजी नहीं है (मानक कुंजियाँ और संगठन की प्रबंधन कुंजियाँ अस्वीकार की जाती हैं)।
  • 403 account_not_allowed — कुंजी का स्वामी निलंबित या हटाया गया है।
  • 400 — invalid_callback_url, invalid_code_challenge_method, invalid_code_challenge, invalid_expires_at, workspace_not_supported, या गलत बॉडी।
  • 429 rate_limited — एक स्वामी के लिए प्रति घंटे 30 से अधिक कोड, या एक IP से प्रति घंटे 120 से अधिक (Retry-After देखें)।

आपको मिलने वाली कुंजी

  • एक मानक BazaarLink API कुंजी (sk-bl-…), ठीक वैसी ही जैसी "API कुंजियाँ" पेज पर बनाई गई कुंजी होती है। यह उपयोगकर्ता द्वारा रद्द किए जाने तक मान्य रहती है।
  • उपयोग का शुल्क उपयोगकर्ता के BazaarLink बैलेंस से कटता है। यदि उपयोगकर्ता ने सहमति पेज पर खर्च सीमा तय की है, तो वह मासिक सीमा है।
  • यह दोनों बेस URL पर काम करती है: https://bazaarlink.ai/api/v1 और https://api.bazaarlink.ai/v1।
  • यह खाते की 200 कुंजियों की सीमा में गिनी जाती है और उपयोगकर्ता की "API कुंजियाँ" सूची में दिखती है, जहाँ वह इसे किसी भी समय अक्षम या हटा सकता है।
  • निलंबित या हटाए गए खाते ऐप को अधिकृत नहीं कर सकते, और निलंबन से पहले जारी किया गया code एक्सचेंज के समय अस्वीकार कर दिया जाता है (403 invalid_code)।

आपको क्या मिलता है

  • प्राधिकरण कोड + PKCE प्रवाह
  • प्रति-उपयोगकर्ता बिलिंग: प्रत्येक उपयोगकर्ता अपने बैलेंस से अपने उपयोग का भुगतान करता है
  • प्रत्येक उपयोगकर्ता के लिए अलग कुंजी, जो उपयोगकर्ता के "API कुंजियाँ" पेज पर सूचीबद्ध होती है और जिसे वह रद्द कर सकता है

प्रबंधन API कुंजी

प्रबंधन कुंजियाँ प्रोग्रामेटिक कुंजी प्रबंधन के लिए डिज़ाइन की गई हैं। वे मानक API कुंजियाँ बना सकते हैं, सूचीबद्ध कर सकते हैं, अद्यतन कर सकते हैं, अक्षम कर सकते हैं और हटा सकते हैं - लेकिन AI मॉडल कॉल नहीं कर सकते।

नोट
प्रबंधन कुंजियाँ AI मॉडल (chat/completions/messages/embeddings) को कॉल नहीं कर सकतीं। मॉडल एक्सेस के लिए मानक API कुंजी का उपयोग करें।

एक प्रबंधन कुंजी बनाना

पर जाएंप्रबंधन API कुंजी पृष्ठऔर "बनाएं" पर क्लिक करें - यह आपके मानक API कुंजियों से एक अलग पृष्ठ है, न कि उसी पृष्ठ पर एक प्रकार चयनकर्ता।

सूची कुंजियाँ

GET https://api.bazaarlink.ai/v1/keys
Authorization: Bearer sk-bl-YOUR_MGMT_KEY

# Response
{
  "keys": [
    {
      "id": "clxyz123...",
      "name": "Production Key",
      "keyType": "standard",
      "keyPrefix": "sk-bl-abc1",
      "keySuffix": "XyZ9",
      "enabled": true,
      "spendLimitUsd": 10.00,
      "spendLimitPeriod": "month",
      "expiresAt": null,
      "createdAt": "2026-01-01T00:00:00.000Z",
      "lastUsed": "2026-03-01T12:34:56.000Z",
      "requestCount": 1234,
      "totalTokens": 5678901
    }
  ]
}

उप-कुंजी बनाएँ

POST https://api.bazaarlink.ai/v1/keys
Authorization: Bearer sk-bl-YOUR_MGMT_KEY
Content-Type: application/json

{
  "name": "Agent Key",
  "limit": 10.00,
  "limit_reset": "monthly",
  "expires_at": "2026-12-31T23:59:59Z"
}

# limit_reset: daily | weekly | monthly
# expires_at:  ISO 8601 datetime (optional)

# Response — save the key value, it won't be shown again
{
  "id": "clxyz789...",
  "name": "Agent Key",
  "key": "sk-bl-xyz789abcdef...",
  "keyType": "standard",
  "spendLimitUsd": 10.00,
  "spendLimitPeriod": "month",
  "expiresAt": "2026-12-31T23:59:59.000Z",
  "enabled": true,
  "createdAt": "2026-03-01T00:00:00.000Z"
}

Update Key

PATCH https://api.bazaarlink.ai/v1/keys/:id
Authorization: Bearer sk-bl-YOUR_MGMT_KEY
Content-Type: application/json

{"enabled": false}              # disable key
{"spendLimitUsd": 5, "spendLimitPeriod": "week"}  # set spend limit
{"spendLimitUsd": null}         # remove spend limit
# Response: {"updated": true}

रिवोक कुंजी

DELETE https://api.bazaarlink.ai/v1/keys/:id
Authorization: Bearer sk-bl-YOUR_MGMT_KEY

# Returns 204 No Content on success

Query बैलेंस

GET https://api.bazaarlink.ai/v1/credits
Authorization: Bearer sk-bl-YOUR_MGMT_KEY

# Response
{
  "data": {
    "total_credits": 12.345,
    "total_usage": 3.210
  }
}

Query उपयोग

GET https://api.bazaarlink.ai/v1/usage?period=month
Authorization: Bearer sk-bl-YOUR_MGMT_KEY

# period: day | week | month | year

App एट्रिब्यूशन

उपयोग ट्रैकिंग, डैशबोर्ड दृश्यता और सूक्ष्म विश्लेषण सक्षम करने के लिए अनुरोध हेडर में अपने एप्लिकेशन की पहचान करें।

नोट
ये हेडर पूरी तरह से वैकल्पिक हैं और API कार्यक्षमता को प्रभावित नहीं करते हैं। हालाँकि, डिबगिंग और उपयोग एट्रिब्यूशन के लिए उन्हें सेट करने की अनुशंसा की जाती है।

उपलब्ध हेडर

HeaderDescription
HTTP-Refererआपकी साइट URL, उपयोग ट्रैकिंग और विश्लेषण के लिए (वैकल्पिक)
X-Titleआपके ऐप का नाम, डैशबोर्ड में दिखाया गया है (वैकल्पिक)
from openai import OpenAI

client = OpenAI(
    base_url="https://api.bazaarlink.ai/v1",
    api_key="sk-bl-YOUR_KEY",
    default_headers={
        "HTTP-Referer": "https://yourapp.com",  # Optional: your site URL
        "X-Title": "My Application",             # Optional: your app name
    },
)

response = client.chat.completions.create(
    model="openai/gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
)

त्रुटि कोड

त्रुटि प्रतिक्रिया प्रारूप

Error envelope endpoint के अनुसार बदलता है। HTTP status और मौजूद होने पर error.type उपयोग करें। error.code string या numeric हो सकता है या अनुपस्थित; error.message केवल दिखाने के लिए है।

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

HTTP स्थिति और त्रुटि.कोड

Error envelope endpoint के अनुसार बदलता है। HTTP status और मौजूद होने पर error.type उपयोग करें। error.code string या numeric हो सकता है या अनुपस्थित; error.message केवल दिखाने के लिए है।

कोड
नाम
विवरण
424निर्भरता विफलआपकी स्वयं कॉन्फ़िगर की गई BYOK कुंजी को upstream provider ने अस्वीकार कर दिया; BYOK सेटिंग्स में जाँचें या बदलें। यह केवल strict मोड में दिखाई देता है
400खराब अनुरोधविकृत अनुरोध, खाली संदेश सरणी, या आवश्यक फ़ील्ड अनुपलब्ध
401अनधिकृतAPI कुंजी गुम, अमान्य या अक्षम है
402भुगतान आवश्यकअपर्याप्त खाता क्रेडिट, प्रति-कुंजी खर्च सीमा पूरी हो गई, या monthly/weekly बजट सीमा पार हो गई
403निषिद्धखाता निलंबित है या उसके पास अनुमति नहीं है
404नहीं मिलाRequested model, generation, key, or other resource does not exist
409संघर्षResource is not in the required state, such as an incomplete video job
410चला गयाRequested model has been retired and must be replaced
413पेलोड बहुत बड़ा हैअनुरोध का मुख्य भाग 10 एमबी से अधिक है; सामग्री का आकार कम करें या अनुरोध को विभाजित करें
416रेंज संतोषजनक नहीं हैRequested byte range is invalid for generated video content
429बहुत अधिक अनुरोधदर सीमा पार हो गई; पुनः प्रयास करने से पहले पुनः प्रयास-आफ्टर हेडर की जाँच करें
432निःशुल्क कोटा समाप्तTavily-संगत एंडपॉइंट (/v1/search, /v1/extract, /v1/crawl, /v1/map): निःशुल्क खोज कोटा समाप्त हो गया है या शेष राशि शून्य या उससे कम है; जारी रखने के लिए क्रेडिट जोड़ें। रिस्पॉन्स बॉडी Tavily प्रारूप में होती है: {"detail":{"error":"..."}}
500सर्वर त्रुटिआंतरिक BazaarLink त्रुटि
502खराब गेटवेकोई भी अपस्ट्रीम स्रोत अनुरोध नहीं संभाल सका; अनुरोध में त्रुटि लौटती है।
503सेवा अनुपलब्धइस मॉडल के लिए कोई अपस्ट्रीम प्रदाता कॉन्फ़िगर नहीं किया गया है; व्यवस्थापक से संपर्क करें
504गेटवे टाइमआउटUpstream connection or stream stalled and timed out

मशीन-पठनीय बिलिंग कोड

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

कोड
विवरण
byok_key_invalidआपकी स्वयं कॉन्फ़िगर की गई BYOK कुंजी को upstream provider ने अस्वीकार कर दिया; BYOK सेटिंग्स में जाँचें या बदलें। यह केवल 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.

मॉडल और समापन बिंदु
मॉडल लुकअप, जीवनचक्र, मूल्य निर्धारण, तौर-तरीके और समापन बिंदु संगतता त्रुटियाँ।
कोड
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
अनुरोध और सुरक्षा
अमान्य पैरामीटर, संदर्भ, उपकरण, स्कीमा, और सामग्री-सुरक्षा अस्वीकरण।
कोड
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
Image निर्माण और संपादन
Image इनपुट, मल्टीपार्ट संपादन, आउटपुट और छवि-पाइपलाइन त्रुटियाँ।
कोड
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
अपस्ट्रीम रूटिंग
Sanitized प्रदाता कनेक्टिविटी, प्रमाणीकरण, थ्रॉटलिंग और उपलब्धता त्रुटियाँ।
कोड
HTTP स्थिति
upstream_unreachable502
upstream_auth_failed502
upstream_rate_limited429
capacity_unavailable429
upstream_unavailable502/503
byok_key_invalid424

सामग्री मॉडरेशन

सभी अनुरोधों की मॉडल तक पहुँचने से पहले स्वचालित रूप से समीक्षा की जाती है। हमारी उपयोग नीति का उल्लंघन करने वाले अनुरोध मॉडल तक पहुँचने से पहले अस्वीकार कर दिए जाते हैं और 403 त्रुटि लौटाते हैं।

अवरुद्ध की जाने वाली सामग्री श्रेणियाँ

मॉडरेशन हमारी उपयोग नीति (Acceptable Use Policy) पर आधारित है और मुख्य रूप से निम्नलिखित श्रेणियों की सामग्री को अवरुद्ध करता है:

  • यौन शोषण सामग्री
  • हिंसक धमकियाँ
  • अवैध कृत्यों के लिए संचालन संबंधी मार्गदर्शन
  • जैविक खतरे से संबंधित सामग्री

403 प्रतिक्रिया प्रारूप

मॉडरेशन द्वारा अवरुद्ध किया गया अनुरोध इस प्रारूप में त्रुटि लौटाता है:

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

अवरुद्ध अनुरोधों के लिए शुल्क नहीं लिया जाता — अस्वीकृत अनुरोध के लिए आपसे कोई शुल्क नहीं लिया जाएगा।

गलत सकारात्मक की अपील

यदि आपको लगता है कि किसी अनुरोध को गलत तरीके से अवरुद्ध किया गया है, तो अनुरोध के समय और (यदि सुविधाजनक हो) request id के साथ सहायता टीम से संपर्क करें — हम इसकी समीक्षा करेंगे।

गोपनीयता

प्रत्येक अनुरोध की स्वचालित रूप से सामग्री समीक्षा की जाती है।

उल्लंघन के रूप में पाए गए अनुरोधों की सामग्री अनुपालन साक्ष्य के रूप में सुरक्षित रखी जाती है।

अन्य अनुरोधों की पूर्ण प्रॉम्प्ट सामग्री सुरक्षित नहीं रखी जाती।

दर सीमा, बजट और आपातकालीन ब्रेक

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

नियंत्रण
HTTP स्थिति
कैसे करें इसकी पहचान
अनुरोध दर सीमा429string code या numeric code 429; Retry-After और X-RateLimit-* headers का उपयोग करें।
दर-सीमा जुर्माना ब्लॉक429न्यूमेरिक कोड 429 और एक अस्थायी प्रतिबंध संदेश; पुन:प्रयास-आफ्टर का उपयोग करें।
वैश्विक व्यय आपातकालीन ब्रेक503न्यूमेरिक कोड 503, वैश्विक खर्च-सीमा संदेश, और 30 या 300 सेकंड का पुनः प्रयास करें।
Scoped spend brake429Numeric code 429 and a spend circuit-breaker message naming the scope.
बिलिंग और बजट नियंत्रण402ऊपर सूचीबद्ध स्थिर बिलिंग स्ट्रिंग कोड का उपयोग करें।

Error envelope endpoint के अनुसार बदलता है। HTTP status और मौजूद होने पर error.type उपयोग करें। error.code string या numeric हो सकता है या अनुपस्थित; error.message केवल दिखाने के लिए है।

वीडियो और मीडिया संसाधन स्थिति

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

पुनः प्रयास नीति

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

बैकऑफ़ के साथ पुनः प्रयास करें पुनः प्रयास करने से पहले
429, 502, 503, and 504. Check the original generation job before creating another after an ambiguous network failure.
Fix करें
400, 401, 402, 403, 404, 409, 410, 413, and 416. Fix the request, credentials, balance, permissions, resource state, or Range header first.

हैंडलिंग त्रुटियाँ

import random
import time
from openai import OpenAI, APIStatusError

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

RETRYABLE = {429, 502, 503, 504}

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

स्ट्रीमिंग त्रुटि प्रारूप

त्रुटियां जो किसी भी टोकन को स्ट्रीम करने से पहले होती हैं, JSON बॉडी के साथ एक मानक HTTP त्रुटि प्रतिक्रिया लौटाती हैं।

stream शुरू होने के बाद HTTP response पहले से 200 होता है। हर SSE data frame को parse करें और शीर्ष-स्तर के error या choices[0].finish_reason === "error" को विफल, अधूरे response के रूप में मानें।

यदि stream शुरू होने के बाद विफल होता है, तो BazaarLink शीर्ष-स्तर के error ऑब्जेक्ट वाला अंतिम SSE event भेज सकता है, उसके बाद data: [DONE]। response को अधूरा मानें; आंशिक output को पूर्ण परिणाम के रूप में उपयोग न करें।

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.

टूल कॉलिंग

टूल कॉलिंग (जिसे फ़ंक्शन कॉलिंग के रूप में भी जाना जाता है) मॉडल को आपके द्वारा परिभाषित बाहरी फ़ंक्शन को लागू करने देता है। मॉडल तय करता है कि टूल को कब कॉल करना है और संरचित तर्क उत्पन्न करता है - आपका कोड फ़ंक्शन निष्पादित करता है और बातचीत जारी रखने के लिए परिणाम लौटाता है।

समर्थित मॉडल

अधिकांश फ्रंटियर मॉडल टूल कॉलिंग का समर्थन करते हैं। यहां कुछ लोकप्रिय विकल्प दिए गए हैं:

परिभाषित उपकरण

प्रत्येक उपकरण एक JSON ऑब्जेक्ट है जो एक फ़ंक्शन का वर्णन करता है जिसे मॉडल कॉल कर सकता है। पैरामीटर फ़ील्ड JSON स्कीमा का उपयोग करता है।

nameआवश्यक
string
फ़ंक्शन नाम (a-z, A-Z, 0-9, अंडरस्कोर, डैश)
descriptionआवश्यक
string
फ़ंक्शन का उपयोग कब और कैसे किया जाना चाहिए इसका स्पष्ट विवरण
parametersआवश्यक
object
JSON स्कीमा ऑब्जेक्ट फ़ंक्शन पैरामीटर को परिभाषित करता है

tool_choice विकल्प

वैल्यू
व्यवहार
"auto"Model तय करता है कि टूल को कॉल करना है या नहीं (डिफ़ॉल्ट)
"none"Model किसी भी टूल को कॉल नहीं करेगा
"required"Model को कम से कम एक टूल को कॉल करना होगा
{"type": "function", "function": {"name": "get_weather"}}Model को निर्दिष्ट फ़ंक्शन को कॉल करना होगा

पूर्ण प्रवाह

टूल कॉलिंग एक बहु-मोड़ प्रक्रिया है: (1) टूल के साथ अनुरोध भेजें → (2) मॉडल टूल_कॉल लौटाता है → (3) फ़ंक्शन निष्पादित करें → (4) परिणाम वापस भेजें → (5) मॉडल अंतिम प्रतिक्रिया उत्पन्न करता है।

curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o",
    "messages": [{"role":"user","content":"What is the weather in Taipei?"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Get current weather for a city",
        "parameters": {
          "type": "object",
          "properties": {
            "city": {"type": "string", "description": "City name"},
            "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
          },
          "required": ["city"]
        }
      }
    }],
    "tool_choice": "auto"
  }'
# Response carries tool_calls — run get_weather() yourself, then send the
# result back with role:"tool" (same shape as the Python/TS steps 3-5) to
# get the model's final answer.

समानांतर टूल कॉल

कुछ मॉडल एक ही प्रतिक्रिया में एकाधिक टूल को कॉल कर सकते हैं। प्रत्येक टूल कॉल को संभालें और सभी परिणाम लौटाएँ:

# Model may return multiple tool_calls
if message.tool_calls:
    messages = [
        {"role": "user", "content": "Weather and time in Tokyo?"},
        message,
    ]

    for tool_call in message.tool_calls:
        # Execute each function
        if tool_call.function.name == "get_weather":
            result = {"temperature": 22, "condition": "Clear"}
        elif tool_call.function.name == "get_time":
            result = {"time": "2026-02-23T15:30:00+09:00"}

        messages.append({
            "role": "tool",
            "tool_call_id": tool_call.id,
            "content": json.dumps(result),
        })

    # Send all results back at once
    final = client.chat.completions.create(
        model="openai/gpt-4o",
        messages=messages,
        tools=tools,
    )
    print(final.choices[0].message.content)

Streaming के दौरान Tool Calls

Streaming में tool calls position के अनुसार indexed partial deltas में आते हैं — हर delta का argument string index के हिसाब से जोड़ते जाएं, जब तक finish_reason "tool_calls" न बन जाए, जो call पूरा होने का संकेत है।

# Streaming: tool_calls arrive as partial deltas indexed by position —
# accumulate function.arguments per index until finish_reason == "tool_calls".
stream = client.chat.completions.create(
    model="openai/gpt-4o",
    messages=[{"role": "user", "content": "What's the weather in Taipei?"}],
    tools=tools,
    tool_choice="auto",
    stream=True,
)

tool_calls = {}
for chunk in stream:
    delta = chunk.choices[0].delta
    if delta.tool_calls:
        for tc in delta.tool_calls:
            entry = tool_calls.setdefault(tc.index, {"id": "", "name": "", "arguments": ""})
            if tc.id:
                entry["id"] = tc.id
            if tc.function.name:
                entry["name"] = tc.function.name
            if tc.function.arguments:
                entry["arguments"] += tc.function.arguments
    if chunk.choices[0].finish_reason == "tool_calls":
        for call in tool_calls.values():
            print(call["name"], json.loads(call["arguments"]))

साधारण Agent Loop

जब तक model tools माँगता रहे तब तक call करते रहने और final answer मिलते ही रुक जाने वाला generic pattern — infinite loop रोकने के लिए max_iterations इस्तेमाल करें।

# Generic loop: keep calling the model while it keeps requesting tools,
# stop once it returns a plain answer. max_iterations guards against loops.
messages = [{"role": "user", "content": "What's the weather in Taipei, and what time is it there?"}]
max_iterations = 10

for _ in range(max_iterations):
    response = client.chat.completions.create(
        model="openai/gpt-4o",
        messages=messages,
        tools=tools,
    )
    message = response.choices[0].message
    messages.append(message)

    if not message.tool_calls:
        break  # model gave a final answer

    for tool_call in message.tool_calls:
        args = json.loads(tool_call.function.arguments)
        result = TOOL_MAPPING[tool_call.function.name](**args)
        messages.append({
            "role": "tool",
            "tool_call_id": tool_call.id,
            "content": json.dumps(result),
        })
else:
    print("Warning: max_iterations reached without a final answer")

print(messages[-1].content)

Function Definition की Best Practices

  • specific, descriptive names इस्तेमाल करें — सिर्फ weather नहीं, get_weather_forecast जैसा।
  • function क्या करता है और कब इस्तेमाल करना है यह साफ description में लिखें — model सिर्फ इसी text के आधार पर call करने का फैसला करता है।
  • जहाँ हो सके enum से values सीमित करें और description में example दें ताकि गलत arguments बनने की संभावना कम हो।
  • सिर्फ वाकई जरूरी fields को required बनाएं, optional fields सच में छोड़े जा सकने योग्य होने चाहिए।

संरचित आउटपुट

मॉडल को स्कीमा से मेल खाते हुए वैध JSON वापस करने के लिए बाध्य करें। विश्वसनीय अनुप्रयोगों के निर्माण के लिए यह आवश्यक है जो मॉडल आउटपुट को प्रोग्रामेटिक रूप से पार्स करता है।

विधि 1: प्रतिक्रिया_प्रारूप (JSON स्कीमा)

सख्त JSON स्कीमा अनुपालन लागू करने के लिए:

typeआवश्यक
string
"json_schema" होना चाहिए
json_schema.nameआवश्यक
string
A नाम (कैशिंग के लिए प्रयुक्त)
json_schema.strict
boolean
सही होने पर, सटीक स्कीमा अनुपालन की गारंटी देता है
json_schema.schemaआवश्यक
object
JSON स्कीमा परिभाषा
curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o",
    "messages": [{"role":"user","content":"Review the movie Inception"}],
    "response_format": {
      "type": "json_schema",
      "json_schema": {
        "name": "movie_review",
        "strict": true,
        "schema": {
          "type": "object",
          "properties": {
            "title": {"type": "string"},
            "rating": {"type": "integer", "description": "Rating 1-10"},
            "summary": {"type": "string"},
            "pros": {"type": "array", "items": {"type": "string"}},
            "cons": {"type": "array", "items": {"type": "string"}}
          },
          "required": ["title", "rating", "summary", "pros", "cons"],
          "additionalProperties": false
        }
      }
    }
  }'

टिप्स

  • स्पष्ट, वर्णनात्मक संपत्ति नामों का उपयोग करें - मॉडल उन्हें संदर्भ के रूप में उपयोग करता है।
  • मॉडल का मार्गदर्शन करने के लिए स्कीमा गुणों में विवरण जोड़ें।
  • Set सख्त: गारंटीकृत स्कीमा अनुपालन के लिए सही (विलंबता को थोड़ा बढ़ा सकता है)।
  • स्कीमा को सरल रखें - गहराई से नेस्टेड स्कीमा आउटपुट गुणवत्ता को कम कर सकते हैं।
  • विभिन्न मॉडलों के साथ परीक्षण - कुछ दूसरों की तुलना में जटिल स्कीमा को बेहतर ढंग से संभालते हैं।

असिस्टेंट प्रीफ़िल

संगत मॉडल रूट पर आगे का उत्तर माँगने के लिए messages ऐरे के अंत में एक अधूरा assistant संदेश जोड़ें।

curl https://api.bazaarlink.ai/v1/chat/completions \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-sonnet-4.6",
    "messages": [
      {"role":"user","content":"What is the capital of France?"},
      {"role":"assistant","content":"The capital of France is"}
    ]
  }'
# Model continues: " Paris, known for the Eiffel Tower..."
यह कैसे काम करता है
BazaarLink अंतिम assistant संदेश को सुरक्षित रखकर आगे भेजता है। उत्तर जारी रखने का व्यवहार चुने गए अपस्ट्रीम मॉडल और प्रदाता द्वारा लागू होता है, इसलिए हर रूट पर इसकी गारंटी नहीं है।

मैसेज ट्रांसफॉर्म

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.

Unsupported request field
Do not rely on transforms values such as middle-out; they do not change how this request is routed or processed.

Zero डेटा प्रतिधारण

BazaarLink आपके संदेश सामग्री को डिफ़ॉल्ट रूप से संग्रहीत नहीं करता है। यह पृष्ठ बताता है कि आपका डेटा कैसे प्रबंधित किया जाता है। संवेदनशील डेटा संसाधित करने वाले अनुप्रयोगों के लिए उपयुक्त।

वर्तमान डेटा हैंडलिंग

  • संदेश सामग्री: डिफ़ॉल्ट रूप से संग्रहीत नहीं, प्रसंस्करण के बाद मेमोरी से हटा दी गई
  • बिलिंग मेटाडेटा: टोकन गिनती, टाइमस्टैम्प, मॉडल आईडी
  • Uउपयोग लॉग: केवल अनुरोध आँकड़े, कोई संदेश सामग्री नहीं
  • अपस्ट्रीम फ़ॉरवर्डिंग: अपस्ट्रीम प्रदाताओं को भेजे गए संदेश - उनकी गोपनीयता नीतियों के अधीन

प्रॉम्प्ट कैशिंग

प्रॉम्प्ट कैशिंग पहले से गणना किए गए शीघ्र टोकन का पुन: उपयोग करता है, जिससे लागत और विलंबता में काफी कमी आती है - विशेष रूप से बड़े, दोहराए गए सिस्टम संकेतों वाले अनुप्रयोगों के लिए।

Note
BazaarLink स्वचालित रूप से कैश बचत को ट्रैक करता है और उन्हें बिलिंग में दर्शाता है। प्रतिक्रिया में `cached_tokens` फ़ील्ड वास्तविक कैश हिट दिखाता है; `cacheDiscount` उस अनुरोध पर बचाई गई राशि दिखाता है।

यह कैसे काम करता है

कॉन्फ़िगरेशन की ज़रूरत है या नहीं, यह प्रोवाइडर पर निर्भर करता है। OpenAI परिवार के मॉडल लंबे, दोहराए गए प्रॉम्प्ट प्रीफ़िक्स को अपने-आप कैश कर लेते हैं — रिक्वेस्ट बदलने की ज़रूरत नहीं। Claude (Anthropic) मॉडल तभी कैश करते हैं जब रिक्वेस्ट में स्पष्ट cache_control ब्रेकपॉइंट हो; BazaarLink यह आपकी तरफ से नहीं जोड़ता, इसलिए बिना मार्कर वाली Claude रिक्वेस्ट कभी कैश नहीं होगी। BazaarLink आपके भेजे गए कैश मार्कर को जस-का-तस आगे भेजता है और usage रिस्पॉन्स में असली कैश रीड/राइट टोकन गिनती बताता है।

# OpenAI-family models: nothing to add, long repeated prefixes cache automatically.
response = client.chat.completions.create(
    model="openai/gpt-4o",
    messages=[
        {"role": "system", "content": "You are an expert..."},  # cached automatically if long/repeated
        {"role": "user", "content": "Question here"},
    ],
)

# Check cache savings in the response usage
usage = response.usage
print(f"Prompt tokens: {usage.prompt_tokens}")
print(f"Cached tokens: {usage.prompt_tokens_details.cached_tokens}")
print(f"Cache savings: {usage.prompt_tokens_details.cached_tokens / usage.prompt_tokens * 100:.1f}%")
Claude को स्पष्ट cache_control मार्कर चाहिए
जिस कंटेंट ब्लॉक को कैश करना है उसमें cache_control: {"type": "ephemeral"} जोड़ें, नीचे दिए उदाहरण की तरह। Anthropic का अपना न्यूनतम प्रॉम्प्ट लंबाई नियम भी है — उससे कम होने पर मार्कर होते हुए भी बिना किसी एरर के कैश नहीं होता। हिट की पुष्टि के लिए रिस्पॉन्स में cached_tokens (OpenAI फॉर्मेट) या cache_read_input_tokens / cache_creation_input_tokens (Anthropic फॉर्मेट) देखें।
# Claude models: you must mark the block to cache yourself.
response = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.6",
    messages=[
        {
            "role": "system",
            "content": [
                {"type": "text", "text": "You are an expert...", "cache_control": {"type": "ephemeral"}}
            ],
        },  # BazaarLink does not add cache_control on your behalf
        {"role": "user", "content": "Question here"},
    ],
)

usage = response.usage
print(f"Cache read tokens: {getattr(usage, 'cache_read_input_tokens', 0)}")
print(f"Cache write tokens: {getattr(usage, 'cache_creation_input_tokens', 0)}")

रीज़निंग टोकन

रीज़निंग मॉडल (उदाहरण के लिए, डीपसीक आर1, ओ1 सीरीज़) अपना अंतिम उत्तर देने से पहले आंतरिक रूप से सोचते हैं। इन आंतरिक टोकन को रीज़निंग टोकन कहा जाता है और इन्हें अलग से बिल किया जाता है।

Note
BazaarLink `usage.completion_tokens_details.reasoning_tokens` में रीज़निंग टोकन की रिपोर्ट करता है और उन्हें बिलिंग में अलग से दिखाता है।

प्रतिक्रियाओं से रीजनिंग टोकन पढ़ना

response = client.chat.completions.create(
    model="deepseek/deepseek-r1",
    messages=[{"role": "user", "content": "Solve: if f(x) = x^2 + 3x, what is f(5)?"}],
)

# Read reasoning tokens from usage
usage = response.usage
print(f"Completion tokens: {usage.completion_tokens}")
if hasattr(usage, "completion_tokens_details"):
    details = usage.completion_tokens_details
    print(f"Reasoning tokens: {details.reasoning_tokens}")
    print(f"Output tokens: {details.accepted_prediction_tokens}")
const response = await client.chat.completions.create({
  model: "openai/gpt-5.5",
  messages: [{ role: "user", content: "Prove that sqrt(2) is irrational." }],
  // @ts-ignore - BazaarLink extension
  reasoning_effort: "high",  // low | medium | high
});

const usage = response.usage;
console.log("Reasoning tokens:", usage?.completion_tokens_details?.reasoning_tokens);

थिंकिंग मोड नियंत्रण

कुछ मॉडल अपने "सोच" मोड को टॉगल करने का समर्थन करते हैं। थिंकिंग मोड अंतिम उत्तर देने से पहले आंतरिक तर्क टोकन उत्पन्न करता है, जिससे अधिक टोकन की कीमत पर गुणवत्ता में सुधार होता है।

मॉडल परिवारपैरामीटरडिफॉल्ट
qwen3-*enable_thinking: booleanझूठा (प्लेटफ़ॉर्म डिफ़ॉल्ट)
openai/gpt-5.5, gpt-5.6-sol, gpt-5.4reasoning_effort: "low" | "medium" | "high"medium
deepseek/deepseek-r1—हमेशा सक्षम (अक्षम नहीं किया जा सकता)
# Qwen3: explicitly enable thinking mode
response = client.chat.completions.create(
    model="qwen/qwen3.7-flash",
    messages=[{"role": "user", "content": "Prove the Pythagorean theorem"}],
    extra_body={"enable_thinking": True},  # opt-in to thinking
)

# usage.completion_tokens_details.reasoning_tokens shows thinking token count

एकीकृत तर्क वस्तु (नया प्रारूप)

BazaarLink एकीकृत तर्क वस्तु का भी समर्थन करता है, जो एक सुसंगत API के साथ सभी मॉडल परिवारों पर काम करता है:

फ़ील्डमानपर लागू होता है
reasoning.effort"xhigh" | "high" | "medium" | "low" | "none"OpenAI o-series, Grok
reasoning.max_tokensintegerAnthropic Claude, Gemini
reasoning.excludebooleanप्रतिक्रिया से सोच छुपाएं (मॉडल अभी भी कारण)
// Claude extended thinking — specify thinking budget in tokens
const response = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-4.5",
  messages: [{ role: "user", content: "Prove the Pythagorean theorem" }],
  // @ts-ignore - BazaarLink extension
  reasoning: { max_tokens: 5000 },
});

// OpenAI GPT-5.6 Sol — specify effort level
const response2 = await client.chat.completions.create({
  model: "openai/gpt-5.6-sol",
  messages: [{ role: "user", content: "Solve this math problem..." }],
  // @ts-ignore - BazaarLink extension
  reasoning: { effort: "high" },
});

// Hide thinking content from response (model still thinks)
const response3 = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-4.5",
  messages: [{ role: "user", content: "What is 2+2?" }],
  // @ts-ignore - BazaarLink extension
  reasoning: { max_tokens: 2000, exclude: true },
});

सोच की सामग्री पढ़ना

रीज़निंग मॉडल उत्तर के साथ अपनी सोच की सामग्री लौटा सकता है। नीचे सूचीबद्ध मॉडलों में सोच डिफ़ॉल्ट रूप से चालू है: कोई रीज़निंग पैरामीटर न भेजने वाला अनुरोध सोच चालू करके चलता है, सोच की सामग्री लौटाता है, और वास्तव में उपयोग हुए सोच टोकन का बिल बनता है। इसे बंद करने के लिए reasoning: { exclude: true } या include_reasoning: false भेजें। बाकी सभी मॉडल सोच की सामग्री तभी लौटाते हैं जब आप माँगें: reasoning_effort, reasoning ऑब्जेक्ट, include_reasoning: true, thinking या enable_thinking भेजें।

डिफ़ॉल्ट रूप से सोचने वाले मॉडल: gemini-4-argon, deepseek-v4.1-flash, deepseek-v4.1-flash-1017

इसे कैसे माँगें

अनुरोध में इनमें से कोई एक भेजें: reasoning_effort (low, medium या high), reasoning ऑब्जेक्ट (effort, max_tokens), include_reasoning: true, thinking: { type: "enabled" } या enable_thinking: true। reasoning.exclude: true या include_reasoning: false भेजने पर सोच की सामग्री बंद हो जाती है (मॉडल फिर भी reasoning करता है)।

फ़ील्डस्थानअर्थ
reasoningchoices[].message.reasoningसोच की सामग्री (स्ट्रिंग)
reasoning_detailschoices[].message.reasoning_detailsसोच की सामग्री आइटमों की सूची के रूप में, हर आइटम में केवल type और text
reasoningchoices[].delta.reasoningस्ट्रीमिंग: सोच की सामग्री टुकड़ों में आती है (delta.reasoning और delta.reasoning_details), delta.content के उत्तर-पाठ से पहले
Note
पैरामीटर न भेजने पर: ऊपर सूचीबद्ध मॉडल डिफ़ॉल्ट रूप से सोचते हैं, इसलिए आपको सोच की सामग्री मिलती है और सोच टोकन (usage.completion_tokens_details.reasoning_tokens) का भुगतान करना होता है। बाकी सभी मॉडलों में पैरामीटर नहीं, तो सोच की सामग्री भी नहीं: केवल उत्तर (message.content) मिलता है, बिल्कुल पहले जैसा। सूचीबद्ध मॉडल पर सोच बंद करने के लिए reasoning.exclude: true या include_reasoning: false भेजें: कोई सोच नहीं चलती और सोच टोकन का बिल नहीं बनता। अन्य रीज़निंग मॉडलों पर exclude केवल पाठ छिपाता है; उनके reasoning tokens फिर भी गिने जाते हैं।

GET /v1/models से देखें कि कौन-सा मॉडल कौन-से स्तर सपोर्ट करता है: हर reasoning मॉडल reasoning.supported_efforts, reasoning.default_effort और reasoning.mandatory सूचीबद्ध करता है (उदाहरण: gemini-4-argon high, medium और low सपोर्ट करता है)।

उदाहरण: gemini-4-argon

response = client.chat.completions.create(
    model="gemini-4-argon",
    messages=[{"role": "user", "content": "Which is larger, 9.11 or 9.9?"}],
    reasoning_effort="high",  # or: extra_body={"include_reasoning": True}
)

message = response.choices[0].message
print(message.reasoning)          # the thinking text (only returned because we asked)
print(message.content)            # the answer
const stream = await client.chat.completions.create({
  model: "gemini-4-argon",
  messages: [{ role: "user", content: "Which is larger, 9.11 or 9.9?" }],
  stream: true,
  // @ts-ignore - BazaarLink extension
  reasoning: { effort: "high" },
});

for await (const chunk of stream) {
  const delta: any = chunk.choices[0]?.delta;
  if (delta?.reasoning) process.stdout.write(delta.reasoning); // thinking text
  if (delta?.content) process.stdout.write(delta.content);     // answer
}

/v1/responses पर reasoning: { effort, summary: "auto" } से माँगें; सोच की सामग्री output ऐरे के reasoning आइटम में लौटती है। /v1/messages पर thinking: { type: "enabled", budget_tokens } भेजने से thinking ब्लॉक मिलते हैं।

मूल्य निर्धारण
थिंकिंग टोकन को पूर्णता टोकन के रूप में बिल किया जाता है। कुछ प्रदाता सोच मोड के लिए उच्च दर वसूलते हैं - सोच सक्रिय होने पर Qwen3 की कीमत 2x मानक मूल्य निर्धारण है। BazaarLink अप्रत्याशित लागतों से बचने के लिए Qwen3 को सक्षम_थिंकिंग = गलत पर डिफ़ॉल्ट करता है।

विलंबता और प्रदर्शन

एआई API प्रतिक्रिया विलंबता को अनुकूलित करना उपयोगकर्ता अनुभव के लिए महत्वपूर्ण है। नीचे मुख्य कारक दिए गए हैं जो BazaarLink आर्किटेक्चर में विलंबता और अनुकूलन के लिए सर्वोत्तम प्रथाओं को प्रभावित करते हैं।

Note
BazaarLink हर request का `duration_ms` (end-to-end latency) और `throughput` (tokens/sec) record करता है — GET /v1/generation?id=... से query करें, या Activity Export CSV में देखें।

कारक जो विलंबता को प्रभावित करते हैं

  • मॉडल का आकार: बड़े मॉडल (70B+) आमतौर पर उत्पन्न करने में धीमे होते हैं
  • प्रदाता लोड: प्रदाताओं और दिन के समय के अनुसार भिन्न होता है
  • टोकन गिनती: उच्च max_tokens का मतलब है पूरा होने में लंबा समय
  • स्ट्रीमिंग बनाम नॉन-स्ट्रीमिंग: स्ट्रीम: ट्रू पहला टोकन तेजी से वितरित करता है
  • Context लंबाई: बहुत लंबे संदर्भ प्री-प्रोसेसिंग समय को बढ़ाते हैं

अनुकूलन युक्तियाँ

  • कथित विलंबता में सुधार के लिए स्ट्रीमिंग (स्ट्रीम: सत्य) को प्राथमिकता दें
  • विलंबता-संवेदनशील परिदृश्यों के लिए छोटे मॉडल (flash/mini/haiku) चुनें
  • बार-बार अनुरोधों के लिए विलंबता को कम करने के लिए शीघ्र कैशिंग सक्षम करें
import time

# Measure time to first token with streaming
start = time.time()
first_token_time = None

stream = client.chat.completions.create(
    model="google/gemini-3.5-flash",  # Fast model
    messages=[{"role": "user", "content": "Hello!"}],
    stream=True,
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content and not first_token_time:
        first_token_time = time.time() - start

print(f"Time to first token: {first_token_time:.3f}s")
# Look up per-request latency and throughput after the fact, using the
# generation ID from the response (or the final streamed chunk).
curl "https://api.bazaarlink.ai/v1/generation?id=BAZAARLINK_REQUEST_ID" \
  -H "Authorization: Bearer $BAZAARLINK_API_KEY"

# Response
{
  "data": {
    "id": "85e6f35c71a31f19-SJC",
    "model": "google/gemini-3.5-flash",
    "duration_ms": 842,
    "throughput": 61.2,
    "usage": { "prompt_tokens": 12, "completion_tokens": 48, "total_tokens": 60 }
  }
}

अपटाइम अनुकूलन

अपस्ट्रीम त्रुटि के बाद अनुरोध दूसरा उपलब्ध स्रोत आज़मा सकता है। कोई स्रोत उसे न संभाल सके तो त्रुटि लौटती है। सर्किट ब्रेकर बार-बार प्रयास सीमित करते हैं और प्रदाता की स्थिति मॉनिटर की जाती है।

Note
BazaarLink सभी अपस्ट्रीम प्रदाताओं के लिए उपलब्धता को ट्रैक करता है। जब किसी प्रदाता की त्रुटि दर एक सीमा से अधिक हो जाती है, तो सर्किट ब्रेकर स्वचालित रूप से ट्रिगर हो जाता है और अनुरोधों को अगले उपलब्ध प्रदाता तक भेज देता है।

उपलब्धता तंत्र

  • सर्किट ब्रेकर: विफल प्रदाताओं का स्वत: पता लगाता है और उन्हें अलग करता है
  • अपस्ट्रीम स्रोत में समस्या होने पर अनुरोध किसी दूसरे उपलब्ध स्रोत को आज़मा सकता है। कोई स्रोत उपलब्ध न हो तो अनुरोध में त्रुटि लौटती है।
  • प्रदाता स्वास्थ्य निगरानी: प्रति प्रदाता त्रुटि दर और विलंबता को लगातार ट्रैक करता है
  • Retry तर्क: क्षणिक त्रुटियाँ (5xx) स्वचालित रूप से पुनः प्रयास की जाती हैं

सर्किट ब्रेकर

# If an upstream source returns an error, the request can try another available source.
# Requests handled by a platform model are billed at that model's catalog price.

response = client.chat.completions.create(
    model="openai/gpt-4o",       # Primary model
    messages=[{"role": "user", "content": "Hello!"}],
    extra_body={
        "models": [              # Local fallback chain, tried in order
            "openai/gpt-4o",
            "anthropic/claude-sonnet-4.6",
            "google/gemini-3.5-flash",
        ],
    },
)

# Check whether another source handled the request (in usage logs)
# "is_failover": true indicates the primary provider was bypassed
Provider health monitoring सिर्फ internal ops के लिए है
GET /api/admin/provider-health ops dashboard के लिए internal endpoint है, admin auth चाहिए। यह पूरा operational data return करता है (हर provider का request volume, error rate, latency percentile, failover stats वगैरह) — यह general customers के लिए public API नहीं है, इसलिए यहाँ असली fields नहीं दोहराए गए।

गार्डरेल

Harmful content filter करने और compliance policies लागू करने के लिए API requests में content-safety mechanism जोड़ें। BazaarLink अभी सिर्फ organization level पर customizable content-filter guardrails देता है; personal (non-org) API keys के लिए कोई equivalent setting नहीं है — content safety पूरी तरह upstream model provider के अपने built-in safety systems पर निर्भर करती है।

मौजूदा Scope
Personal API keys में कोई built-in custom guardrails नहीं हैं — content safety पूरी तरह upstream provider के अपने safety systems पर निर्भर करती है। अगर आपको customizable content-filter rules चाहिए (block/redact/flag, keyword और regex rules, built-in PII templates), तो organization बनाएं और organization API key इस्तेमाल करें — setting "Content Filter Guardrails" में है।

Planned Features (personal और org keys दोनों में अभी तक उपलब्ध नहीं)

गार्डरेल
विवरण
PII पता लगानाव्यक्तिगत रूप से पहचान योग्य जानकारी का पता लगाएं और उसे संशोधित करें
विषय प्रतिबंधमॉडल प्रतिक्रियाओं को केवल स्वीकृत विषयों तक सीमित करें
आउटपुट सत्यापनवापस लौटने से पहले कस्टम नियमों के विरुद्ध मान्य मॉडल आउटपुट

वर्तमान व्यवहार

Personal API keys: सभी upstream providers के अपने content safety systems हैं — content filter trigger करने वाले model responses finish_reason: "content_filter" के साथ आते हैं, और BazaarLink कोई additional filtering नहीं करता। Organization API keys: org_admin "Content Filter Guardrails" में custom rules (block/redact/flag) set कर सकते हैं, जो text model तक पहुँचने से पहले लागू होते हैं।

Cursor IDE एकीकरण

BazaarLink को Cursor के OpenAI Override URL के रूप में सेट करें। Responses API ऑटो-कन्वर्जन, टूल फॉर्मेट सामान्यीकरण और Claude मॉडल के लिए bz- प्रीफिक्स सम्मेलन के साथ ड्रॉप-इन सेटअप।

त्वरित सेटअप

Cursor में Settings → Models खोलें, फिर:

  1. Override OpenAI Base URL को https://api.bazaarlink.ai/v1 पर सेट करें
  2. Override OpenAI API Key को अपनी sk-bl-... BazaarLink key पर सेट करें
  3. अपना मॉडल नाम जोड़ें — Claude के लिए नीचे bz- prefix देखें।
बैकवर्ड कम्पैटिबिलिटी
पुराना /cursor संगतता एंडपॉइंट अब भी काम करता है, दोनों होस्ट पर (https://api.bazaarlink.ai/v1/cursor और https://bazaarlink.ai/api/v1/cursor)। यह /v1/chat/completions का एक पतला री-एक्सपोर्ट है — नए सेटअप के लिए ऊपर दिया गया बेस URL उपयोग करें।

bz- prefix (Claude मॉडल के लिए)

Cursor की client-side validation claude- से शुरू होने वाले किसी भी मॉडल नाम को Cursor की अपनी Anthropic integration से होकर भेजती है, आपके Override URL को बायपास करती है। Cursor को BazaarLink पर भेजने के लिए, मॉडल नाम के सामने bz- जोड़ें। Server prefix हटा देता है और alias map से बाकी resolve करता है।

Cursor में टाइप करेंResolve होता है
bz-claude-sonnet-4.6anthropic/claude-sonnet-4.6
bz-claude-opus-4.7anthropic/claude-opus-4.7
gpt-4oopenai/gpt-4o
gemini-3.5-flashgoogle/gemini-3.5-flash

Dot vs hyphen variants normalize होते हैं: bz-claude-sonnet-4.6 और bz-claude-sonnet-4-6 दोनों एक ही मॉडल पर resolve होते हैं।

CURSOR_MODEL_MAP env var (ऑपरेटर ओवरराइड)

स्व-होस्टेड BazaarLink परिनियोजन के लिए, यह env var सेट करके Cursor-साइड मॉडल नामों को कैटलॉग canonical id पर री-मैप करें:

CURSOR_MODEL_MAP=gpt-claude-sonnet:anthropic/claude-sonnet-4.6,gpt-opus:anthropic/claude-opus-4.7

अब Cursor में टाइप किया gpt-claude-sonnet server-side पर anthropic/claude-sonnet-4.6 पर map होता है। यह तब उपयोगी है जब आप चाहते हैं कि Cursor को मॉडल GPT-family लगे (ताकि Override URL से route हो) लेकिन आप वास्तव में Claude serve करें।

जो स्वचालित रूप से होता है

जब request /v1/chat/completions पर पहुंचता है, BazaarLink ये compatibility transforms transparently apply करता है — client-side पर कुछ नहीं करना है:

  • Responses API bodies auto-detect — अगर body में messages के बजाय input है, इसे Chat Completions shape में convert किया जाता है (Cursor GPT-family models के लिए Responses API format भेजता है)।
  • Flat tool definitions wrap करता है — Cursor Agent { name, description, parameters } बिना function wrapper के भेजता है। हम wrap करते हैं ताकि Anthropic Tool '' not found in provided tools के साथ reject न करे।
  • Malformed tool_choice को coerce करता है — Cursor { type: "auto" } भेजता है (object form, function नहीं)। OpenAI spec auto/none/required के लिए string form चाहता है, इसलिए हम coerce करते हैं।
  • Non-OpenAI providers पर route करते समय OpenAI-only fields हटाता है — parallel_tool_calls, logprobs, top_logprobs, logit_bias, service_tier, user को forward करने से पहले हटा दिया जाता है (अन्यथा Anthropic 400 लौटाता है)।
  • max_output_tokens → max_tokens map करता है और Responses-API-only fields (previous_response_id, truncation, background, store) हटाता है। reasoning field Chat-Completions-native bodies के लिए preserve होता है।

Cursor Agent मोड

Tool calling standard Chat Completions tool-call flow से काम करता है। Cursor tools (Shell, Read, Write, Grep, आदि) tool_choice: "auto" के साथ भेजता है; BazaarLink आपके चुने provider को forward करता है, जो tool call करना है या नहीं तय करता है। Tool calls standard OpenAI tool_calls deltas के रूप में return होते हैं; Cursor locally execute करता है और conversation जारी रखता है। gpt-4o (native OpenAI) या bz-claude-sonnet-4.6 चुनें, दोनों एक जैसे काम करते हैं।

Upstream rejects को debug करना
यदि आप provider 4xx errors देखते हैं, admin Provider Health panel check करें। हर 4xx response पूरे upstream error body और हमारे forward किए request body summary के साथ persist होती है — किसी भी 🔴 row पर click करें JSON expand करने के लिए।

मॉडल रूटिंग

BazaarLink अनुरोधों को सही अपस्ट्रीम प्रदाता तक रूट करने के लिए provider/model-name प्रारूप का उपयोग करता है। यह आपको एकल API एंडपॉइंट के माध्यम से सभी प्रमुख मॉडलों तक पहुंच प्रदान करता है।

मॉडल आईडी प्रारूप

{provider}/{model-name}

# Examples
openai/gpt-5.4-mini
anthropic/claude-sonnet-4.6
google/gemini-3-flash-preview
deepseek/deepseek-v4.1-flash

रूटिंग प्राथमिकता

जब आप एक अनुरोध भेजते हैं, तो BazaarLink अपस्ट्रीम प्रदाता को इस क्रम में हल करता है:

  1. सटीक मिलान - पूर्ण मॉडल आईडी से मेल खाने वाले मॉडल मार्ग की तलाश करता है
  2. Provider वाइल्डकार्ड - प्रदाता/* मार्गों पर वापस आ जाता है (उदा. openai/*)
  3. वैश्विक वाइल्डकार्ड - *वाइल्डकार्ड मार्गों पर वापस आ जाता है
  4. Default provider key — केवल ज्ञात catalog model के लिए enabled और default चिह्नित key का उपयोग

पर सभी उपलब्ध मॉडल ब्राउज़ करें मॉडल पेज.

ऑटो राउटर

Auto Router v3 अनुरोध को 14 task tiers में से एक में score करता है और उस tier की मौजूदा primary तथा fallback chain उपयोग करता है। Paid और free tables admin console में अलग-अलग प्रबंधित होते हैं।

  • auto — paid routing table; सफल वास्तविक model के published price पर billing होती है।
  • auto:free — free routing table; free quota के भीतर cost $0 है। quota समाप्त होने पर balance वाले accounts paid fallback बंद न होने पर paid auto पर जा सकते हैं।

कैसे उपयोग करें

स्वचालित रूटिंग सक्षम करने के लिए मॉडल को "ऑटो" (भुगतान) या "ऑटो: फ्री" (फ्री) पर सेट करें:

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"}]}'

v3 tier कैसे चुनता है

General tiers simple, standard, complex और reasoning हैं। Specialized tiers coding, vision, image, video, data, search, social, email, calendar और trading हैं। Low-confidence boundary result एक स्तर ऊपर किया जाता है।

  • Tier scoring: messages, tools, length, keywords और structure से 14 tiers में से एक चुना जाता है
  • Hard overrides: vision, formal reasoning और specialized tasks सीधे tier चुन सकते हैं
  • Route lookup: मौजूदा primary और अधिकतम पाँच fallbacks पढ़ता है; disabled tier 503 लौटाता है
  • Execution: primary के बाद configured fallback chain क्रम से आज़माई जाती है
  • Response ट्रैकिंग: हल किया गया मॉडल प्रतिक्रिया निकाय और X-ऑटो-रिज़ॉल्व्ड-मॉडल हेडर में लौटाया जाता है

वर्तमान model tables

नीचे वही live configuration है जो inference और admin उपयोग करते हैं। हर tier की primary, fallback order और enabled state बिना deployment बदली जा सकती है।

auto

Tier
Primary
Fallbacks
State
simpleopenai/gpt-5.4-nano
google/gemini-3.1-flash-lite-previewanthropic/claude-haiku-4.5
enabled
standardgoogle/gemini-3-flash-preview
openai/gpt-5.4-minianthropic/claude-haiku-4.5
enabled
complexgoogle/gemini-3.1-pro-preview
anthropic/claude-sonnet-4.6openai/gpt-5.4-pro
enabled
reasoninganthropic/claude-opus-4.7
openai/gpt-5.4-progoogle/gemini-3.1-pro-preview
enabled
codingopenai/gpt-5.3-codex
anthropic/claude-sonnet-4.6openai/gpt-5.4-pro
enabled
visionopenai/gpt-5.4-image-2
—
enabled
imageopenai/gpt-5.4-image-2
—
enabled
videobytedance/seedance-2.0-fast
bytedance/seedance-2.0anthropic/claude-sonnet-4.6
enabled
dataopenai/gpt-5.4-pro
anthropic/claude-sonnet-4.6google/gemini-3.1-pro-preview
enabled
searchperplexity/sonar-pro
perplexity/sonar-reasoning-proopenai/gpt-5.4-pro
enabled
socialopenai/gpt-5.4-nano
google/gemini-3.1-flash-lite-previewanthropic/claude-haiku-4.5
enabled
emailopenai/gpt-5.4-nano
google/gemini-3.1-flash-lite-previewanthropic/claude-sonnet-4.6
enabled
calendaropenai/gpt-5.4-nano
google/gemini-3.1-flash-lite-preview
enabled
tradinganthropic/claude-opus-4.7
openai/gpt-5.4-progoogle/gemini-3.1-pro-preview
enabled

auto:free

Tier
Primary
Fallbacks
State
simpledeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
standarddeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
complexdeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
reasoningdeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
codingdeepseek/deepseek-v4-flash-0731free
reflection/beamnvidia/nemotron-3.5-lightning-free
enabled
visionopenai/gpt-5.4-image-2
—
disabled
imageopenai/gpt-5.4-image-2
—
disabled
videogoogle/gemini-2.5-flash-lite
—
disabled
datadeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
searchdeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
socialdeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
emaildeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
calendardeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled
tradingdeepseek/deepseek-v4-flash-0731free
nvidia/nemotron-3.5-lightning-freereflection/beam
enabled

चुनिंदा मॉडल दर-सीमित मुफ़्त टियर प्रदान करते हैं। मुफ़्त पात्रता प्लेटफ़ॉर्म द्वारा प्रति मॉडल दी जाती है — मॉडल को उसकी सामान्य ID से कॉल करें; :free प्रत्यय एक वैकल्पिक उपनाम है (सशुल्क मॉडल में जोड़ने से वह मुफ़्त नहीं होता)।

मुफ़्त कोटा खत्म होने के बाद
मुफ़्त कोटा समाप्त होने के बाद, खाते में शेष राशि होने पर अतिरिक्त अनुरोध मॉडल की बताई गई सशुल्क दर पर बिल किए जाते हैं। इसके बजाय 429 पाने के लिए `X-Free-Fallback: false` भेजें या key सेटिंग में सशुल्क स्तर पर जाने का विकल्प बंद करें। शेष राशि न होने पर अतिरिक्त अनुरोध 429 लौटाते हैं। जब कोई अनुरोध वाकई इस तरह डाउनग्रेड होता है, तो प्रतिक्रिया में x-bl-free-fallback: daily या x-bl-free-fallback: rpm हेडर आता है जो बताता है कि कौन-सी सीमा ट्रिगर हुई — इससे आप बिल देखने से पहले ही अनुरोध के समय स्विच का पता लगा सकते हैं। जो अनुरोध डाउनग्रेड नहीं हुआ, उसमें यह हेडर नहीं होगा।
X-Auto-Resolved-Model
वास्तविक चुना गया model X-Auto-Resolved-Model header और response body के model field में लौटता है।

मॉडल वेरिएंट

ग्राहक के रूटिंग फ़ील्ड अनदेखे किए जाते हैं
provider (पूरा ऑब्जेक्ट), transforms, route, शीर्ष-स्तर का service_tier और preset अपस्ट्रीम अनुरोध से पहले हटा दिए जाते हैं और अपस्ट्रीम या मूल्य स्तर नहीं चुन सकते। Chat Completions और Responses endpoints पर models array स्थानीय फ़ॉलबैक सूची के रूप में समर्थित है: BazaarLink हर मॉडल को अपनी रूटिंग से हल करता है और उस मॉडल का ग्राहक मूल्य लागू करता है; सूची अपस्ट्रीम को नहीं भेजी जाती। ग्राहक के :nitro, :floor और :exacto प्रत्यय अनदेखे होते हैं। :eco BazaarLink का इकोनॉमी टियर बना रहता है और आंतरिक रूप से BazaarLink :floor पर मैप होता है। :free अलग कैटलॉग मॉडल वैरिएंट है।

स्वतंत्र मॉडल आईडी

:free, :extended और :thinking जैसे कैटलॉग वैरिएंट अलग क्षमताओं या कैटलॉग कीमत वाले आइटम पहचान सकते हैं। अपस्ट्रीम रूट और ग्राहक मूल्य BazaarLink कैटलॉग तथा सर्वर-साइड नियमों से तय होते हैं।

:free
:extended
:thinking
:nitro
:floor
:exacto
वेब खोज की अतिरिक्त लागत
plugins, :online या web_search_options से अनुरोधित वेब खोज का मौजूदा व्यवहार बना रहता है, लेकिन अपस्ट्रीम अतिरिक्त शुल्क लग सकता है। यह शुल्क अनुरोध में उपयोग की गई कुंजी पर लगता है: BazaarLink की प्लेटफ़ॉर्म कुंजी या आपकी BYOK कुंजी।
:online

मुफ़्त मॉडल

चुनिंदा मॉडल दर-सीमित मुफ़्त टियर प्रदान करते हैं। मुफ़्त पात्रता प्लेटफ़ॉर्म द्वारा प्रति मॉडल दी जाती है — मॉडल को उसकी सामान्य ID से कॉल करें; :free प्रत्यय एक वैकल्पिक उपनाम है (सशुल्क मॉडल में जोड़ने से वह मुफ़्त नहीं होता)।

  • सामान्य मॉडल ID (जैसे deepseek/deepseek-v4-flash) से कॉल करें। मुफ़्त कोटा के भीतर अनुरोध स्वतः निःशुल्क सेवित होते हैं।
  • मुफ़्त उपयोग प्रति उपयोगकर्ता प्रति मिनट अनुरोध और दैनिक सीमा से सीमित है। सीमाएँ खाता स्तर (बिना क्रेडिट / क्रेडिट सहित) के अनुसार बदलती हैं।
  • मुफ़्त कोटा पार करने पर यदि आपके पास क्रेडिट है, तो अनुरोध सूचीबद्ध कीमत पर सशुल्क टियर पर स्वतः जारी रहते हैं। स्वचालित फ़ॉलबैक बंद करने और 429 पाने के लिए X-Free-Fallback: false भेजें। क्रेडिट न होने पर कोटा-पार अनुरोध 429 लौटाते हैं।
  • GET /v1/models हर मुफ़्त-टियर मॉडल के लिए एक :free प्रविष्टि सूचीबद्ध करता है; auto:free हमेशा किसी मुफ़्त मॉडल पर रूट होता है।

अभी मुफ़्त कोटा वाले मॉडल

मुफ़्त कोटा इस्तेमाल करने के लिए इन मॉडल ID को सीधे कॉल करें। सूची बदलती रहती है — नवीनतम सेट के लिए API से पूछें।

qwen/qwen3.7-flash
reflection/beam-free
nvidia/nemotron-3.5-lightning-free
reflection/beam
stealth/glyph-cluster
deepseek/deepseek-v4-flash-0731free

मुफ़्त कोटा सीमाएँ

मद
मान
प्रति मिनट अनुरोध (RPM)10 / min
दैनिक अनुरोध बजट60 / day
खाता स्तर गुणक — बिना क्रेडिट× 1
खाता स्तर गुणक — क्रेडिट सहित× 2

आपका दैनिक बजट = ऊपर दिया दैनिक अनुरोध बजट × आपका खाता स्तर गुणक, हर मुफ़्त मॉडल के लिए अलग गिना जाता है। auto:free पर अतिरिक्त रूप से प्रति-IP समानांतर सीमा भी लागू होती है। अलग-अलग मॉडलों पर प्लेटफ़ॉर्म सख़्त या ढीली सीमाएँ रख सकता है; प्रभावी मान मॉडल पेज के "मुफ़्त कोटा" खंड में दिखते हैं। मुफ़्त कोटा "यूनिट" में गिना जाता है, केवल अनुरोधों की संख्या में नहीं: एक अनुरोध द्वारा खपत की गई यूनिटें prompt की context लंबाई के साथ बढ़ती हैं। इसलिए समान दैनिक कोटा में, लंबे context वाले अनुरोधों की वास्तविक उपयोग संख्या छोटे prompt की तुलना में काफ़ी कम होती है।

मुफ़्त कोटा खत्म होने के बाद

मुफ़्त कोटा समाप्त होने के बाद, खाते में शेष राशि होने पर अतिरिक्त अनुरोध मॉडल की बताई गई सशुल्क दर पर बिल किए जाते हैं। इसके बजाय 429 पाने के लिए `X-Free-Fallback: false` भेजें या key सेटिंग में सशुल्क स्तर पर जाने का विकल्प बंद करें। शेष राशि न होने पर अतिरिक्त अनुरोध 429 लौटाते हैं।

जब कोई अनुरोध वाकई इस तरह डाउनग्रेड होता है, तो प्रतिक्रिया में x-bl-free-fallback: daily या x-bl-free-fallback: rpm हेडर आता है जो बताता है कि कौन-सी सीमा ट्रिगर हुई — इससे आप बिल देखने से पहले ही अनुरोध के समय स्विच का पता लगा सकते हैं। जो अनुरोध डाउनग्रेड नहीं हुआ, उसमें यह हेडर नहीं होगा।

# Return 429 instead of switching to paid routing
-H "X-Free-Fallback: false"

संगठन प्रबंधन

BazaarLink organizations use a three-tier architecture: Organization → Team → Member. Credits are stored at the org level; each Team and member can have a monthly spend cap. API requests check member → team → org credits in sequence.

अपने संगठन का प्रबंधन करें
टीम जोड़ने, सदस्यों को आमंत्रित करने, या संगठन सेटिंग्स बदलने के लिए, सेटिंग्स खोलें और एक संगठन चुनें

त्रि-स्तरीय बजट प्रणाली

On every API request, three budget layers are checked in order. Exceeding any layer returns HTTP 429:

  1. सदस्य का मासिक बजट (OrgMember.monthlyBudget)
  2. टीम मासिक बजट (टीम.मासिक बजट)
  3. Org क्रेडिट शेष (संगठन.क्रेडिट)

Usage रिपोर्ट

The Reports page in the org portal provides monthly spend analytics across four dimensions:

  • अवलोकन: कुल खर्च, मार्जिन दर, दैनिक रुझान चार्ट
  • टीम द्वारा: प्रति-टीम खर्च, शेयर%, मॉडल विश्लेषण, बजट उपयोग
  • By मॉडल: प्रति-मॉडल खर्च, औसत मूल्य ($/1M टोकन)
  • By सदस्य: प्रति सदस्य खर्च - केवल org_admin

सभी दृश्य प्रत्यक्ष एक्सेल संगतता के लिए BOM उपसर्ग के साथ CSV निर्यात का समर्थन करते हैं।

संगठन बनाएं और प्रबंधित करें

  1. Go to Settings → Organizations → Create New Organization
  2. Create Teams in the org portal (optional: cost center code and monthly budget)
  3. Invite members by email, assign a role and Team
  4. Issue API keys for members — usage is automatically tagged to the correct Team / member
  5. View the Reports page for monthly spend broken down by Team, Model, or Member
  6. टीम, मॉडल या सदस्य द्वारा विभाजित मासिक खर्च के लिए रिपोर्ट पृष्ठ देखें

सदस्य भूमिकाएँ

org_adminFull control: members, teams, billing, settings
बिलिंग_व्यूअरRead-only access to financial reports (cannot see per-member detail)
team_adminManage members and budget within their own team
सदस्यUse the API, subject to team and org budget limits

एक संगठन और क्या प्रबंधित कर सकता है?

सदस्यों और टीमों से परे, संगठन प्रबंधन क्षेत्र प्रदान करता है:

  • 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

सामग्री फ़िल्टरिंग

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
वर्तमान में टेक्स्ट इनपुट तक सीमित है
Images, audio, video, some structured or multimodal content, and model output are not inspected.

प्रबंधन API (v1)

The /v1/orgs/ endpoints accept both Bearer management key (sk-bl-...) and session cookie, enabling server-to-server org management without a browser session.

प्रमाणीकरण
All /v1/orgs/ endpoints require org_admin role. Pass Authorization: Bearer sk-bl-<key> or a session cookie. Management keys can be created from Settings → API Keys.

संगठन

GET/v1/orgs

उन सभी organizations को list करें जिनसे caller belong करता है, role और joinedAt के साथ।

GET/v1/orgs/:orgId

Org detail प्राप्त करें जिसमें team और member counts शामिल हैं।

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

टीम

GET/v1/orgs/:orgId/teams

Teams को member counts के साथ list करें, name के अनुसार ordered।

POST/v1/orgs/:orgId/teams
nameआवश्यक
string
Team display name (org के अंदर unique होना चाहिए)
costCenterCode
string
लेखा लागत केंद्र कोड
monthlyBudget
number | null
USD में team monthly spend cap
PATCH/v1/orgs/:orgId/teams/:teamId

Partial update — केवल वे fields शामिल करें जिन्हें change करना है।

DELETE/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}'

सदस्य

GET/v1/orgs/:orgId/members

सभी members को nested user (id/name/email) और team info के साथ list करें।

POST/v1/orgs/:orgId/members
emailआवश्यक
string
किसी existing BazaarLink user का Email
role
string
org_admin | बिलिंग_दर्शक | टीम_एडमिन | सदस्य (डिफ़ॉल्ट: सदस्य)
teamId
string
किसी team को assign करें (अगर role team_admin है तो required)
monthlyBudget
number | null
USD में per-member monthly spend cap

404 यदि ईमेल पते में कोई BazaarLink खाता नहीं है। 409 यदि पहले से ही सदस्य है। डिफ़ॉल्ट भूमिका: सदस्य. यदि लक्ष्य अंतिम org_admin है तो

PATCH/v1/orgs/:orgId/members/:memberId

role, teamId, या monthlyBudget का Partial update।

DELETE/v1/orgs/:orgId/members/:memberId

400 लौटाता है।

# Add a member
curl https://api.bazaarlink.ai/v1/orgs/{orgId}/members \
  -X POST \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "alice@example.com", "role": "member", "monthlyBudget": 50}'

# Remove a member
curl https://api.bazaarlink.ai/v1/orgs/{orgId}/members/{memberId} \
  -X DELETE \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY"

रिपोर्ट API

Query monthly spend data programmatically. Accessible to org_admin and billing_viewer. Accepts both web session and Bearer management key.

Query params: year (default current), month (default current, 1–12).

Endpoint
विवरण
GET /api/orgs/:orgId/reports/overviewकुल spend, margin rate, daily trend
GET /api/orgs/:orgId/reports/by-teamप्रति-टीम खर्च, शेयर%, मॉडल विश्लेषण, बजट उपयोग
GET /api/orgs/:orgId/reports/by-modelPer-model spend, average price ($/1M tokens)
GET /api/orgs/:orgId/reports/by-memberPer-member spend — केवल org_admin
GET /api/orgs/:orgId/reports/exportCSV download; ?view=overview|by-team|by-model|by-member जोड़ें
# Monthly overview via management key
curl "https://bazaarlink.ai/api/orgs/{orgId}/reports/overview?year=2026&month=3" \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY"

# By-team breakdown
curl "https://bazaarlink.ai/api/orgs/{orgId}/reports/by-team?year=2026&month=3" \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY"

# Export CSV (downloads file)
curl "https://bazaarlink.ai/api/orgs/{orgId}/reports/export?year=2026&month=3&view=by-team" \
  -H "Authorization: Bearer sk-bl-YOUR_MANAGEMENT_KEY" \
  -o report.csv

Error Response Reference

401API key invalid या revoked
403RBAC denial (role insufficient) या model Allowed Models whitelist में नहीं
402तीन budget layers में से कोई exceed हुआ; response body में scope (member / team / org) और reset time
429Spend Circuit Breaker tripped; Retry-After header में recovery time (seconds)
503प्लेटफ़ॉर्म-व्यापी आपातकालीन ब्रेक या अस्थायी सेवा आउटेज खर्च करें

अनुमत मॉडल (Whitelist)

नियंत्रित करें कि आपके संगठन, टीमें या व्यक्तिगत सदस्य कौन-से मॉडल call कर सकते हैं। महंगे या unvetted मॉडल block करने, मॉडल standards लागू करने, या किसी टीम को एक ही provider तक सीमित करने के लिए उपयोगी।

यह कैसे काम करता है

  • तीन स्वतंत्र layers — Organization, Team, Member — प्रत्येक की अपनी list होती है (database में String[])।
  • जब तीनों layers खाली हों, तो हर मॉडल अनुमत है (default behavior)।
  • जब एक या अधिक layers non-empty हों, तो effective list non-empty layers का intersection होती है — मॉडल को pass करने के लिए हर restricted layer पर अनुमत होना चाहिए।
  • बदलाव कुछ ही seconds में प्रभावी होते हैं (60s in-memory + 5min Redis cache; update पर दोनों clear हो जाते हैं)।

पैटर्न प्रारूप

  • Exact match — जैसे openai/gpt-4o (केवल यह exact मॉडल)।
  • Provider wildcard — जैसे openai/* (openai/ prefix के अंतर्गत कोई भी मॉडल)।
  • केवल lowercase। प्रति list अधिकतम 200 entries, प्रति entry 100 chars।

कहाँ manage करें

Org Portal → Allowed Models। org_admin org / team / member lists edit कर सकते हैं; team_admin अपनी टीम और उसके सदस्यों को edit कर सकते हैं।

Block होने पर Error response

किसी disallowed मॉडल को call करने पर HTTP 403 इस body के साथ return होता है:

HTTP/1.1 403 Forbidden
Content-Type: application/json

{
  "error": {
    "message": "Model is not allowed for this account",
    "code": "model_not_allowed"
  }
}

प्रबंधन API

सभी endpoints Web Session या Bearer Management Key (sk-bl-...) accept करते हैं। PATCH पूरी list को replace करता है; clear करने के लिए [] pass करें।

# Org-level list
GET    /api/orgs/:orgId/allowed-models
PATCH  /api/orgs/:orgId/allowed-models

# Team-level list
GET    /api/orgs/:orgId/teams/:teamId/allowed-models
PATCH  /api/orgs/:orgId/teams/:teamId/allowed-models

# Member-level list
GET    /api/orgs/:orgId/members/:memberId/allowed-models
PATCH  /api/orgs/:orgId/members/:memberId/allowed-models

# Example: restrict an org to OpenAI + a specific Anthropic model
curl -X PATCH https://bazaarlink.ai/api/orgs/$ORG_ID/allowed-models \
  -H "Authorization: Bearer sk-bl-..." \
  -H "Content-Type: application/json" \
  -d '{"allowedModels": ["openai/*", "anthropic/claude-sonnet-4.6"]}'

सर्किट ब्रेकर (खर्च किल स्विच)

एक dual-window spend cap जो upstream cost spike होने पर आगे की requests को block कर देता है। runaway scripts, infinite loops, या stolen-key abuse को असली पैसे खर्च करने से पहले रोकने के लिए designed है।

यह कैसे काम करता है

  • प्रत्येक scope के लिए Redis में दो fixed windows track होती हैं: 1-minute और 1-hour upstream cost (USD)।
  • यदि किसी भी window का spend उसके threshold तक पहुँच जाए, तो उस scope की सभी आगामी requests reject कर दी जाती हैं जब तक window रीसेट नहीं हो जाती।
  • Defaults: $5 / minute, $20 / hour. Default रूप से disabled है — enable करने के लिए khud चालू करना होगा।
  • Counters Redis में TTL के साथ रहते हैं — recovery automatic है, org/team/member trips के लिए manual reset की ज़रूरत नहीं।

Scopes (member, team को override करता है; team, org को override करता है)

हर layer अपने thresholds set कर सकती है। Resolution order है member → team → org → platform default — प्रत्येक field (cbEnabled, cbMinuteUsd, cbHourlyUsd) के लिए पहला non-null value जीतता है।

  • Org level — संगठन के अंतर्गत सभी keys पर लागू। Org Portal → Circuit Breaker में set करें।
  • Team level — उस team को tagged सभी keys पर लागू। उन keys के लिए org को override करता है।
  • Member level — केवल उस member को tagged keys पर लागू। team और org दोनों को override करता है।

ट्रिप व्यवहार

Trip होने पर requests fail fast हो जाती हैं (कोई upstream call नहीं किया जाता)। Response HTTP 429 इस body के साथ होता है:

HTTP/1.1 429 Too Many Requests
Content-Type: application/json

{
  "error": {
    "message": "Spend circuit breaker tripped at member scope (minute window: $5.2341 ≥ $5.00). Try again later or contact your organization owner."
  }
}
Global बनाम scoped
एक अलग global platform-wide circuit breaker (operator-controlled, org portal में दिखाई नहीं देता) HTTP 503 के साथ Retry-After header return करता है। Operators इसे multi-tenant abuse से platform की सुरक्षा के लिए set करते हैं — आपकी org settings से इसे override नहीं किया जा सकता।

ऑडिट लॉग

हर trip event और हर configuration change record होता है:

  • Trip events — actions org.cb.tripped / team.cb.tripped / org_member.cb.tripped। प्रति scope+window प्रति घंटे एक entry तक deduplicated, ताकि सतत trip log में बाढ़ न ला दे।
  • Config changes — actions org.cb.update / team.cb.update / org_member.cb.update। before/after values के साथ-साथ actor capture करते हैं।

प्रबंधन API

Org admins API के माध्यम से settings पढ़ और update कर सकते हैं। सभी endpoints Web Session या Bearer Management Key (sk-bl-...) accept करते हैं। PATCH body में fields का कोई भी subset भेजें; null किसी field को clear करता है और parent layer पर fall back करता है।

# Org-level config
GET    /api/orgs/:orgId/circuit-breaker
PATCH  /api/orgs/:orgId/circuit-breaker

# Team-level config
GET    /api/orgs/:orgId/teams/:teamId/circuit-breaker
PATCH  /api/orgs/:orgId/teams/:teamId/circuit-breaker

# Member-level config
GET    /api/orgs/:orgId/members/:memberId/circuit-breaker
PATCH  /api/orgs/:orgId/members/:memberId/circuit-breaker

# Example: tighten the org-level cap to $2/min, $10/hr
curl -X PATCH https://bazaarlink.ai/api/orgs/$ORG_ID/circuit-breaker \
  -H "Authorization: Bearer sk-bl-..." \
  -H "Content-Type: application/json" \
  -d '{"cbMinuteUsd": 2, "cbHourlyUsd": 10, "cbEnabled": true}'

# GET response (org scope)
{
  "settings":         { "cbEnabled": true, "cbMinuteUsd": 2,  "cbHourlyUsd": 10  },
  "resolvedSettings": { "cbEnabled": true, "cbMinuteUsd": 2,  "cbHourlyUsd": 10  },
  "liveSpend":        { "minuteSpend": 0.4123, "hourSpend": 3.8721 }
}

API कुंजी घूर्णन

API कुंजियों को नियमित रूप से बदलना सुरक्षा का अच्छा अभ्यास है। नई कुंजी बनाएँ, अपने इंटीग्रेशन को अपडेट करके जाँचें, फिर पुरानी कुंजी रद्द करें। इस प्रक्रिया में शून्य डाउनटाइम की गारंटी नहीं है।

नोट
API कुंजियाँ किसी भी समय डैशबोर्ड से या प्रबंधन API के माध्यम से निरस्त की जा सकती हैं। निरस्तीकरण तत्काल है - उस कुंजी का उपयोग करने वाले सभी अनुरोध तुरंत विफल हो जाएंगे।

रोटेशन चरण

  1. एक नई API कुंजी बनाएं
  2. नई कुंजी का उपयोग करने के लिए अपने अनुप्रयोग या पर्यावरण चर अपडेट करें
  3. सत्यापित करें कि नई कुंजी सही ढंग से काम कर रही है
  4. पुरानी कुंजी अक्षम करें या हटाएँ
# Key CRUD via Bearer auth requires a MANAGEMENT key (keyType: "management").
# Standard keys get 403 on /v1/keys — create a management key first,
# or rotate keys from the dashboard UI instead.

# Step 1: Create new key (management key auth)
POST https://api.bazaarlink.ai/v1/keys
Authorization: Bearer $BL_MANAGEMENT_KEY
{"name": "Production v2"}
# → saves new key: sk-bl-NEW_KEY_VALUE

# Step 2: Update your application
# export BAZAARLINK_API_KEY=sk-bl-NEW_KEY_VALUE

# Step 3: Verify new key works
curl https://api.bazaarlink.ai/v1/models \
  -H "Authorization: Bearer sk-bl-NEW_KEY_VALUE"

# Step 4: Revoke old key (management key auth again)
DELETE https://api.bazaarlink.ai/v1/keys/:old_key_id
Authorization: Bearer $BL_MANAGEMENT_KEY

एक्टिविटी निर्यात

वित्तीय ऑडिट, लागत विश्लेषण, या अनुपालन रिपोर्टिंग के लिए अपना पूरा API उपयोग इतिहास CSV के रूप में डाउनलोड करें।

CSV निर्यात

लॉग इन करें और लॉग्स पेज पर जाएं। अपना पूरा इतिहास CSV फ़ाइल के रूप में डाउनलोड करने के लिए ऊपरी-दाएँ कोने में निर्यात CSV बटन पर क्लिक करें। कोई API कॉल की आवश्यकता नहीं है।

CSV कॉलम

Column
Description
dateISO 8601 timestamp (UTC)
modelModel ID (e.g. openai/gpt-4o)
prompt_tokensInput token count
completion_tokensOutput token count
total_tokensTotal tokens (prompt + completion)
reasoning_tokensReasoning tokens (o-series / thinking models)
cached_tokensPrompt cache hit tokens
cost_ntdताइवान डॉलर में लिया गया शुल्क
duration_msEnd-to-end latency in milliseconds
finish_reasonstop / length / content_filter / error
statusBazaarLink response status code
app_nameX-Title header value (app attribution)

JSON उपयोग API

प्रोग्रामेटिक एक्सेस के लिए, अवधि, मॉडल या कुंजी द्वारा समूहीकृत क्वेरी एकत्रित आँकड़े:

# Query usage data (grouped / aggregated)
GET https://api.bazaarlink.ai/v1/usage
Authorization: Bearer sk-bl-YOUR_KEY

# With period filtering (day | week | month | year)
GET https://api.bazaarlink.ai/v1/usage?period=month

# Response
{
  "period": "month",
  "since": "2025-01-01T00:00:00.000Z",
  "credits": 10.5000,
  "totals": {
    "spend": 0.1812,
    "requests": 309,
    "tokens": 161200,
    "promptTokens": 95000,
    "completionTokens": 66200
  },
  "byModel": [{ "model": "openai/gpt-4o", "spend": 0.0028, "tokens": 1200, "requests": 5 }],
  "byKey":   [{ "keyName": "My Agent", "spend": 0.0028, "tokens": 1200, "requests": 5 }],
  "byApp":   [{ "appName": "MyApp", "spend": 0.0015, "tokens": 600, "requests": 3 }],
  "timeSeries": [{ "date": "2025-01-15", "model": "openai/gpt-4o", "cost": 0.0012, "tokens": 500, "requests": 2 }]
}

Usage लेखांकन

Query API के माध्यम से विस्तृत उपयोग आँकड़े, जिसमें टोकन खपत, लागत विश्लेषण और अनुरोध इतिहास शामिल है।

नोट
Usage डेटा USD में बिल किया जाता है। व्यक्तिगत अनुरोध रिकॉर्ड लॉग पेज पर या CSV निर्यात के माध्यम से उपलब्ध हैं। एकत्रित आँकड़े (अवधि, मॉडल या कुंजी के अनुसार) बियरर टोकन ऑथ के साथ `/v1/usage` एंडपॉइंट के माध्यम से उपलब्ध हैं।

रिस्पॉन्स फ़ील्ड संदर्भ

FieldTypeDescription
modelstringModel ID used (e.g., openai/gpt-4o)
providerstringस्थिर BazaarLink मान: bazaarlink
prompt_tokensnumberInput tokens consumed
completion_tokensnumberOutput tokens generated
total_tokensnumberTotal tokens (prompt + completion)
reasoning_tokensnumberReasoning tokens (for thinking models)
cached_tokensnumberPrompt tokens served from cache
costnumberइस अनुरोध के लिए ग्राहक से ली गई USD राशि
duration_msnumberEnd-to-end latency in milliseconds
throughputnumberGeneration speed in tokens/sec
finish_reasonstringstop | length | content_filter | error
statusnumberBazaarLink response status code
app_namestring | nullApplication name (X-Title header)
key_namestringAPI key name used for the request
import httpx

# Aggregated stats (Bearer token — period: day | week | month | year)
response = httpx.get(
    "https://api.bazaarlink.ai/v1/usage",
    headers={"Authorization": "Bearer sk-bl-YOUR_KEY"},
    params={"period": "month"},
)

data = response.json()
totals = data["totals"]
print("This month: US$%.4f  (%d requests)" % (totals["spend"], totals["requests"]))

# Cost breakdown by model
for m in data["byModel"]:
    print("  %s: US$%.4f  (%d reqs, %d tokens)" % (m["model"], m["spend"], m["requests"], m["tokens"]))

रिपोर्ट फीडबैक

समस्याओं, बगों या सुझावों की रिपोर्ट करके BazaarLink को बेहतर बनाने में हमारी सहायता करें। हम सभी फीडबैक चैनलों की सक्रिय रूप से निगरानी करते हैं।

रिपोर्ट कैसे करें

चैनल
के लिए सर्वोत्तम
प्रतिक्रिया समय
संपर्क पृष्ठसामान्य प्रतिक्रिया, सुविधा अनुरोध1-2 व्यावसायिक दिन
ईमेलबग रिपोर्ट, तकनीकी मुद्दे24 घंटे के भीतर
API प्रतिक्रिया शीर्षलेखऑटो-रिपोर्ट की गई त्रुटियां और मेट्रिक्सस्वचालित

क्या शामिल करें

  • Request ID (प्रतिक्रिया आईडी फ़ील्ड से)
  • मॉडल का उपयोग किया गया और पैरामीटर भेजे गए
  • अपेक्षित बनाम वास्तविक व्यवहार
  • टाइमस्टैम्प और जारी करने की आवृत्ति
  • त्रुटि संदेश या HTTP स्थिति कोड

प्रतिक्रिया सबमिट करने के लिए हमारे संपर्क पृष्ठ पर जाएँ।

FAQ

BazaarLink सीधे OpenAI को कॉल करने से कैसे भिन्न है?
BazaarLink सभी प्रमुख मॉडलों में NTD-उद्धृत मूल्य निर्धारण, एकीकृत चालान, चीनी समर्थन और एक एकल API के साथ USD बिलिंग प्रदान करता है। आप एक ही कोड के साथ OpenAI, Anthropic, Google और बहुत कुछ एक्सेस कर सकते हैं।
क्या मुझे अपना मौजूदा कोड बदलने की ज़रूरत है?
बस आधार URL और API कुंजी बदलें। अन्य सभी सेटिंग्स (मॉडल आईडी को छोड़कर) अपरिवर्तित रहेंगी।
क्या BazaarLink मेरे संदेशों को संग्रहीत करता है?
डिफ़ॉल्ट रूप से, हम संदेश सामग्री संग्रहीत नहीं करते हैं। हम केवल बिलिंग उद्देश्यों के लिए टोकन गणना और टाइमस्टैम्प लॉग करते हैं।
मैं एकीकृत चालान (統一發票) कैसे प्राप्त करूं?
ताइवान ई-इनवॉइस केवल वर्तमान में उपलब्ध इनवॉइस-योग्य भुगतान चैनल या पुष्टि की गई एंटरप्राइज़ बिलिंग व्यवस्था में मिलता है। भुगतान से पहले चेकआउट देखें या टैक्स आईडी, कोटेशन और मासिक बिलिंग के लिए बिक्री टीम से संपर्क करें।
कौन सी भुगतान विधियाँ समर्थित हैं?
सभी प्रमुख क्रेडिट कार्ड स्वीकार किए जाते हैं (वीज़ा, मास्टरकार्ड, अमेरिकन एक्सप्रेस)।
कौन सी OpenAI SDK सुविधाएँ समर्थित हैं?
चैट पूर्णताएं, स्ट्रीमिंग, टूल कॉलिंग, संरचित आउटपुट (प्रतिक्रिया_प्रारूप), और सहायक प्रीफ़िल सभी कार्य। सुविधाएं अपस्ट्रीम प्रदाता को भेज दी जाती हैं।
क्या मैं BazaarLink का उपयोग LangChain या CrewAI जैसे एजेंट फ्रेमवर्क के साथ कर सकता हूँ?
हाँ! कोई भी ढांचा जो OpenAI API का समर्थन करता है, BazaarLink के साथ काम करता है। बस आधार URL सेट करें और अपनी BazaarLink API कुंजी का उपयोग करें। उदाहरण के लिए एजेंटिक उपयोग अनुभाग देखें।
Support
Support
Hi! How can we help you?
Send a message and we'll get back to you soon.