BazaarLink bietet ein einheitliches, OpenAI-kompatibles Anfrage- und Antwortschema für verschiedene Modelle und Anbieter. Sie integrieren einmal und können Modelle wechseln, ohne Ihre Anwendung neu zu schreiben.
Kundenfelder für das Routing werden ignoriert
provider (das gesamte Objekt), transforms, route, service_tier auf oberster Ebene und preset werden vor der Weiterleitung entfernt und können weder Upstream noch Preisstufe auswählen. Bei den Endpunkten Chat Completions und Responses wird das models-Array als lokale Fallback-Liste unterstützt: BazaarLink löst jedes Modell über das eigene Routing auf und berechnet dessen Kundenpreis; die Liste wird nicht an Upstreams weitergeleitet. Kundenseitig angegebene Suffixe :nitro, :floor und :exacto werden ignoriert. :eco bleibt BazaarLinks Economy-Tier und wird intern auf BazaarLink :floor abgebildet. :free bleibt eine separate Katalogmodellvariante.
Zusatzkosten für die Websuche
Die bisherige Websuche über plugins, :online oder web_search_options bleibt erhalten und kann zusätzliche Upstream-Kosten verursachen. Diese werden dem für die Anfrage verwendeten Schlüssel belastet: dem BazaarLink-Plattformschlüssel oder Ihrem BYOK-Schlüssel.
OpenAPI-Spezifikation
Die vollständige BazaarLink API ist als OpenAPI-Spezifikation in YAML und JSON dokumentiert:
Verwenden Sie die Spezifikationen mit Swagger UI, Postman oder einem OpenAPI-kompatiblen Codegenerator, um die API zu erkunden oder Clientbibliotheken zu erzeugen.
Anfragen
Anfrageformat für Chat Completions
Der Anfragekörper für Chat Completions wird an folgenden Endpunkt gesendet:
POST/v1/chat/completions
Die vollständige Liste unterstützter Felder finden Sie unter Parameter。
Erzwingen Sie, dass das Modell gültiges JSON gemäß einem Schema zurückgibt. Dies ist essenziell für zuverlässige Anwendungen, die Modellausgaben programmatisch verarbeiten.
json_object — einfacher JSON-Modus; das Modell liefert gültiges JSON.
json_schema — strikter Schema-Modus; die Ausgabe muss dem angegebenen JSON Schema entsprechen.
Plugins
BazaarLink leitet das plugins-Array an die gewählte Upstream-Route weiter. Die Verfügbarkeit hängt von Modell und Anbieter ab; die Modellvariante :online aktiviert zusätzlich das web-Plugin.
Fügen Sie als letzten Eintrag eine unvollständige assistant-Nachricht hinzu, um auf kompatiblen Modellrouten eine Fortsetzung anzufordern.
Funktionsweise
BazaarLink behält die letzte assistant-Nachricht bei und leitet sie weiter. Das Fortsetzungsverhalten wird vom ausgewählten Upstream-Modell und Anbieter implementiert und ist daher nicht auf jeder Route garantiert.
TypeScript
1
2
3
4
5
6
7
8
const response = await client.chat.completions.create({
model: "anthropic/claude-sonnet-4.6",
messages: [
{ role: "user", content: "What is the meaning of life?" },
// Intentional partial response; compatible routes continue from here.
{ role: "assistant", content: "My best answer is" }
]
});
Antworten
BazaarLink normalisiert Completion-Antworten verschiedener Modelle und Anbieter in ein einheitliches, OpenAI-kompatibles Format.
Format der Completion-Antwort
choices ist immer ein Array. Streaming-Antworten verwenden delta, nicht gestreamte Antworten message. Nutzungs- und Kostendaten werden, sofern verfügbar, mitgeliefert.
finish_reason verwendet von BazaarLink normalisierte Werte wie stop, length, tool_calls, content_filter und error.
JSON
1
2
3
{"finish_reason":"stop"}
Kosten und Statistiken abfragen
Rufen Sie GET /v1/generation mit der opaken BazaarLink-Anfrage-ID aus Antwort-id oder x-request-id auf; nicht gestreamte Antworten liefern dieselbe ID auch in x-generation-id. Statistiken können erst Sekunden später verfügbar sein; wiederholen Sie 404 kurzzeitig.
Die unbezahlte Registrierung akzeptiert name, eine optionale description und einen optionalen referral_code. Die 201-Antwort enthält API-Schlüssel, Guthaben, ein sieben Tage gültiges Claim-Token mit Ablaufzeit, Upgrade-URL, Empfehlungscode, free_model auto:free, Base-URL und Dokumentationslink. Sie verwendet den bestehenden kostenlosen Modellmechanismus; die kostenlose Websuche erfordert eine verifizierte E-Mail und steht unbezahlten Agents nicht zur Verfügung.
Die bezahlte Registrierung beginnt mit HTTP-402-Anforderungen: scheme exact, network eip155:196, asset USD-T0 und payTo. Senden Sie die Anfrage mit X-PAYMENT erneut, um dieselben Registrierungsfelder plus payment { txHash, network, amountUsd } zu erhalten. Bezahlte Agents folgen den normalen Regeln für bezahlte Konten; bestehende Konten können /api/x402/topup verwenden.
Ein Mensch kann ein unbezahltes Agent-Konto innerhalb der sieben Tage gültigen Token-Laufzeit über /claim übernehmen. Es gilt ein Limit von einer Registrierung pro IP und 24 Stunden sowie ein Cloud-Anbieter-Limit; abgelehnte Anfragen liefern 429 mit Retry-After.
POSThttps://api.bazaarlink.ai/api/x402/topup
Chat Completions
Der primäre Endpunkt. Kompatibel mit der OpenAI Chat Completions API.
POST/v1/chat/completions
Anfragetext
modelerforderlich
string
Verwenden Sie eine unter GET /v1/models aufgeführte id oder alias, z. B. "claude-sonnet-4.6" oder "anthropic/claude-sonnet-4.6".
messageserforderlich
Message[]
Array von Nachrichtenobjekten mit role und content
stream
boolean
Bei true wird ein Server-Sent Events Stream zurückgegeben. Standard: false
temperature
number
Sampling-Werte werden ohne Bereichsprüfung weitergegeben. Das Modell kann nicht unterstützte Werte begrenzen oder ignorieren.
max_tokens
integer
Maximale Anzahl zu generierender Tokens
max_completion_tokens
integer
Alias für max_tokens (OpenAI o-series kompatibel). Beide werden akzeptiert; der angegebene Wert gilt
Tokens basierend auf Vorkommen bestrafen. Bereich: [-2, 2]. Standard: 0
repetition_penalty
number
Token-Wiederholung aus der Eingabe reduzieren. Bereich: (0, 2]. Standard: 1
min_p
number
Minimale Wahrscheinlichkeit relativ zum Top-Token. Bereich: [0, 1]. Standard: 0
top_a
number
Dynamisches Top-P basierend auf dem Token mit höchster Wahrscheinlichkeit. Bereich: [0, 1]. Standard: 0
seed
integer
Integer-Seed für deterministische Generierung. Nicht für alle Modelle garantiert
n
integer
Anzahl der zu generierenden Completions. Standard: 1
user
string
Endbenutzer-Kennung für Überwachung und Missbrauchserkennung. Hat keine Auswirkung auf die Abrechnung. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
stop
string | string[]
Stoppsequenzen — Generierung stoppt bei Auftreten
logit_bias
object
Token-IDs zu Bias-Werten [-100, 100] zuordnen, die vor dem Sampling addiert werden. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
logprobs
boolean
Log-Wahrscheinlichkeiten jedes Ausgabe-Tokens zurückgeben. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
top_logprobs
integer
Anzahl der wahrscheinlichsten Tokens pro Position (erfordert logprobs: true). Bereich: 0–20. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
tools
Tool[]
Liste der Tools (Funktionen), die das Modell aufrufen kann
tool_choice
string | object
Steuert die Tool-Nutzung: "auto", "none" oder bestimmtes Tool
parallel_tool_calls
boolean
Parallele Funktionsaufrufe aktivieren, wenn Tools bereitgestellt werden. Standard: true. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
Fordert striktes, JSON-Schema-konformes Output bei Providern an, die dies unterstützen. Wird unverändert weitergegeben
reasoning
object
Provider-spezifische Reasoning-/Thinking-Konfiguration. Wird unverändert weitergegeben
reasoning_effort
string
OpenAI o-Serie Reasoning-Aufwand: "low", "medium" oder "high". Wird unverändert weitergegeben
include_reasoning
boolean
true liefert den Denkinhalt in message.reasoning (beim Streaming in delta.reasoning); false schaltet das Denken bei den Modellen ab, die standardmäßig denken (siehe Abschnitt Reasoning), sodass kein Denken berechnet wird. Ohne reasoning_effort, reasoning oder thinking denken und liefern nur diese Modelle standardmäßig; andere Modelle nur auf Anfrage
user, logprobs, top_logprobs, logit_bias und parallel_tool_calls erreichen nur Modelle der OpenAI-Familie
Diese fünf Parameter werden aus der Upstream-Anfrage entfernt, sobald das aufgelöste Modell nicht als OpenAI-eigenes Modell erkannt wird — das Senden an anthropic/claude-*, google/gemini-* oder ein anderes Nicht-OpenAI-Ziel liefert 200 zurück, wobei der Parameter stillschweigend ignoriert wird, kein Fehler. Wenn Sie einen dieser Parameter setzen und die Wirkung ausbleibt, prüfen Sie, ob das Zielmodell von OpenAI stammt.
BazaarLink gibt eine standardisierte Antwort zurück und entfernt upstream-spezifische Felder. usage.cost ist der für diese Anfrage berechnete USD-Betrag.
Für lange Anfragen von mehr als 100 Sekunden wird stream:true empfohlen. Bei nicht gestreamten Anfragen wird nach etwa 12 Sekunden (Standardwert, über die Deployment-Einstellungen anpassbar) zunächst 200 zurückgegeben und mit dem Senden von Keepalive-Leerzeichen begonnen. Tritt danach ein Fehler auf, wird er als 200 + error-JSON zurückgegeben. Keepalive besteht aus Leerzeichen vor dem JSON-Body, die Standard-JSON-Parser ignorieren.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
typeResponse = {
id: string;
object: "chat.completion" | "chat.completion.chunk";
created: number; // Unix timestampmodel: string;
choices: (NonStreamingChoice | StreamingChoice)[];
usage?: ResponseUsage;
};
typeNonStreamingChoice = {
index: number;
finish_reason: "stop" | "length" | "tool_calls" | "content_filter" | null;
message: {
role: "assistant";
content: string | null;
tool_calls?: ToolCall[];
reasoning?: string; // thinking text: when the request asked for it, or by default for the models listed in the reasoning docs sectionreasoning_details?: Array<{ type: string; text?: string }>;
};
};
typeStreamingChoice = {
index: number;
finish_reason: string | null;
delta: {
role?: string;
content?: string | null;
tool_calls?: ToolCall[];
reasoning?: string;
reasoning_details?: Array<{ type: string; text?: string }>;
};
};
typeResponseUsage = {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
cost: number; // USD amount charged to the customer for this requestprompt_tokens_details?: {
cached_tokens: number; // Tokens served from prompt cache (reduced cost)cache_write_tokens?: number; // Tokens written to cache in this requestaudio_tokens?: number;
};
completion_tokens_details?: {
reasoning_tokens?: number; // Thinking/reasoning tokens (e.g. o3, Qwen3, DeepSeek R1)image_tokens?: number;
};
};
typeToolCall = {
id: string;
type: "function";
function: { name: string; arguments: string };
};
Bilderzeugung
Generieren Sie Bilder aus Textprompts mit Modellen wie DALL·E und GPT-4o. Verwenden Sie den `modalities`-Parameter, um Bildausgabe vom Chat-Completions-Endpunkt anzufordern. Die Bildbearbeitung (Ändern eines vorhandenen Bildes) verwendet POST /v1/images/edits —— kompatibel mit OpenAI images.edit, multipart/form-data mit Ihrem/Ihren Quellbild(ern). Bearbeitungsfähige Modelle haben die Modalität text+image->image (z. B. qwen/qwen-image-3); reine Generierungsmodelle sind text->image —— prüfen Sie die Modalität jedes Modells in GET /v1/models.
Response format
/v1/images/generations liefert standardmäßig OpenAI-kompatibles synchrones JSON (seit 2026-07-25) — client.images.generate() funktioniert ohne Wrapper. Mit stream: true erhalten Sie stattdessen den SSE-Event-Stream, der bei Modellen mit langer Generierungszeit Fortschritt liefert.
Nicht-Streaming-Anfragen, die länger als 20 Sekunden dauern, werden zuerst mit HTTP 200 beantwortet (danach halten Leerzeichen die Verbindung offen); ein später auftretender Fehler kommt daher als „200 mit Fehlertext“: Prüfen Sie das oberste `error`-Objekt (wir fügen außerdem `"object": "error"` und `"http_status"` hinzu). Ist das Lese-Timeout Ihres Clients lang (die OpenAI-SDKs verwenden standardmäßig 10 Minuten), senden Sie `X-BazaarLink-Sync-Wait: 90` (ganze Sekunden, 1–90, Standard 20), um für Fehler bis zu dieser Zeit den echten Statuscode zu erhalten; im Python-SDK `default_headers={"X-BazaarLink-Sync-Wait": "90"}`, im Node-SDK `defaultHeaders: { "X-BazaarLink-Sync-Wait": "90" }`. Senden Sie unter Windows das JSON aus einer UTF-8-Datei mit `curl --data-binary @body.json`: Text, der in der Konsole nach `-d` eingegeben wird, ist nicht UTF-8 und wird sofort mit 400 `invalid_utf8` abgelehnt.
A. /v1/chat/completions (nativ, empfohlen)
POST/v1/chat/completions
The canonical streaming path. Recommended for any new integration.
1
2
3
4
5
6
7
8
9
curl -N https://api.bazaarlink.ai/v1/chat/completions \
-H "Authorization: Bearer $BL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-5.4-image-2",
"messages": [{"role":"user","content":"a red cat on a sofa"}],
"modalities": ["image","text"],
"stream": true
}'
Bild-zu-Bild: Fügen Sie einen image_url-Teil in das content-Array ein. Unterstützt Daten-URIs oder https-Bild-URLs (http:// wird abgelehnt), bis zu 8 Bilder, ~10MB pro Daten-URI. Die Nachricht mit den Bildern muss auch einen Text-Teil enthalten (die Bearbeitungsanweisung). Einige Modelle unterstützen zusätzlich image_config (z.B. {"strength": 0.7}, 0–1 — niedrigere Werte bleiben näher am Quellbild), das unverändert an das Upstream durchgereicht wird.
1
2
3
4
5
6
7
8
9
10
11
12
curl -N https://api.bazaarlink.ai/v1/chat/completions \
-H "Authorization: Bearer $BL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-5.4-image-2",
"messages": [{"role":"user","content":[
{"type":"image_url","image_url":{"url":"data:image/png;base64,..."}},
{"type":"text","text":"change the background to a night city"}
]}],
"modalities": ["image"],
"stream": true
}'
Bildbearbeitung (OpenAI-kompatibel)
POST/v1/images/edits
client.images.edit() des OpenAI SDK funktioniert direkt (Multipart-Upload, synchrone JSON-Antwort mit data: [{ url }]). Gleiche Limits wie Bild-zu-Bild: bis zu 8 Bilder, je 10MB; mask und response_format=b64_json werden noch nicht unterstützt.
1
2
3
4
5
curl https://api.bazaarlink.ai/v1/images/edits \
-H "Authorization: Bearer $BL_API_KEY" \
-F model="openai/gpt-5.4-image-2" \
-F image=@cat.png \
-F prompt="change the background to a night city"
B. /v1/images/generations (DALL·E-kompatibel)
POST/v1/images/generations
OpenAI DALL-E request shape. Sync JSON ({ created, data: [{ url }] }) is the default and works with client.images.generate() out of the box; pass stream: true to get the SSE event stream documented below instead.
1
2
3
4
5
6
7
8
curl https://api.bazaarlink.ai/v1/images/generations \
-H "Authorization: Bearer $BL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-image-1",
"prompt": "a red cat on a sofa",
"size": "1024x1024"
}'
modelerforderlich
string
Modell-ID, z. B. google/gemini-2.5-flash-image
prompterforderlich
string
Text-Prompt
size
string
Ausgabegröße (automatisch gemappt)
n
integer
Anzahl der Bilder (Standard 1)
1
2
3
4
5
6
# Streaming variant — progressive delivery for long generations
curl -N https://api.bazaarlink.ai/v1/images/generations \
-H "Authorization: Bearer $BL_API_KEY" \
-H "Accept: text/event-stream" \
-H "Content-Type: application/json" \
-d '{"model":"openai/gpt-5.4-image-2","prompt":"a red cat on a sofa","stream":true}'
SSE event protocol
SSE-Kommentarzeilen und unbekannte oder ping-Ereignisse ignorieren; dokumentierte image-, usage- und done-Ereignisse verarbeiten.
Asynchroner Drei-Schritt-Ablauf (submit → poll → content). Die Videogenerierung dauert 30 s–5 min und passt damit nicht zur synchronen Anfrage/Antwort-Semantik von chat-completions — deshalb stellt BazaarLink dafür einen eigenen /v1/videos-Endpunkt mit Job-ID-Muster bereit: submit liefert eine vjob_*-ID → Status pollen → nach Abschluss die Bytes abrufen. Der Aufruf eines Videomodells über /chat/completions oder /images/generations gibt 400 zurück (code: wrong_endpoint_for_video). Die Abrechnung erfolgt bei completed anhand der tatsächlichen usage.cost.
Video-Aufgaben
Ein Endpunkt deckt mehrere Aufgaben ab. Welche Aufgabe ausgeführt wird, entscheiden die gesendeten Felder —— ein einzelnes Modell kann Bild-zu-Video, Keyframes und Fortsetzung. Nicht jedes Modell unterstützt jede Aufgabe; eine nicht unterstützte Anfrage gibt 400 zurück.
Text-zu-Video
prompt
Allein aus einem Text-Prompt generieren – keine Eingabemedien.
Bild-zu-Video
frame_images: [ first frame ]
Ihr Bild IST das Motiv: Es wird zum ersten Frame und wird animiert, treu zum Original. Z. B. ein Foto einer Katze → dieselbe Katze dreht in derselben Szene den Kopf.
Keyframes (erstes + letztes)
frame_images: [ first, last ]
Geben Sie ein Start- und ein Endbild an; das Modell interpoliert die Bewegung dazwischen.
Fortsetzung
input_video
Einen vorhandenen Clip verlängern. Die angeforderte Dauer muss größer als die Länge des Quellvideos sein.
Referenz-zu-Video
input_references: [ images ]
Ihre Bilder sind REFERENZEN, keine Frames: Das Modell behält Motiv/Stil bei und erzeugt eine völlig neue Szene. Z. B. ein Katzenfoto + "tanzt in einem Wald" → ein neues Video, in dem das Aussehen der Katze erhalten bleibt, Szene und Bewegung aber neu sind (1–9 Referenzen). Unterschied zu Bild-zu-Video: i2v bleibt dem exakten Bild treu; r2v inszeniert das Motiv in neuem Material.
Video-Bearbeitung
input_video + prompt
Ein vorhandenes Video bearbeiten – Szene, Stil oder Bewegung ändern. Abgerechnet nach Eingabevideo-Sekunden + Ausgabesekunden.
Referenzbilder für Referenz-zu-Video —— Motiv-/Stilführung, keine exakten Frames.
input_video
string|object
Quellvideo-URL für Fortsetzung und Video-Bearbeitung. Muss vom Upstream öffentlich abrufbar sein.
aspect_ratio
string
Seitenverhältnis, z. B. 16:9 oder 9:16. Wird ignoriert, wenn ein Eingabebild das Verhältnis vorgibt.
watermark
boolean
Wasserzeichen hinzufügen. Standard: false.
callback_url
string
Webhook-URL, die beim Erreichen des Endzustands aufgerufen wird — nur HTTPS, SSRF-geprüft. Keine Signatur in v1; als Hinweis behandeln und über GET /videos/{id} bestätigen.
Zulässige Auflösungen unterscheiden sich je Modell —— ein nicht unterstützter Wert gibt 400 mit den unterstützten Werten zurück.
Eingabebilder/-videos müssen über eine öffentliche URL erreichbar sein. Hotlink-geschützte Hosts (z. B. einige Wikis) schlagen fehl.
Eingabemedien durchlaufen die Upstream-Inhaltsmoderation und können gelegentlich abgelehnt werden.
Bei der Fortsetzung muss die angeforderte Dauer die Länge des Quellvideos überschreiten.
Das Ausgabe-Seitenverhältnis folgt dem Eingabebild —— ein quadratisches Bild ergibt ein quadratisches Video.
Die Video-Bearbeitung wird nach den Sekunden des Eingabevideos plus den Sekunden der erzeugten Ausgabe abgerechnet.
input_video (Bearbeitung / Fortsetzung) muss eine ÖFFENTLICHE URL sein. Hier erzeugte Videos werden hinter Ihrem API-Schlüssel bereitgestellt, sodass der Upstream sie nicht abrufen kann —— hosten Sie Ihr Quellvideo unter einer öffentlich erreichbaren URL.
Webhook-Payloads sind unsigniert — bestätigen Sie Status/Betrag über GET /videos/{id}, bevor Sie handeln; die dortigen unsigned_urls sind absolut (anders als die relativen Pfade der Poll-Antwort).
Unterstützte Videomodelle
Model ID
Modality
Tasks
minimax/hailuo-3-max
text+image->video
t2v, i2v
google/veo-3.1
text+image->video
t2v, i2v
bytedance/seedance-2.5
text+image+audio+video->video
—
x-ai/grok-imagine-video-1.5-lite
text+image->video
t2v, i2v
bytedance/seedance-2.0
text+image+audio+video->video
t2v, i2v
bytedance/seedance-1-5-pro
text+image->video
t2v, i2v
bytedance/seedance-2.0-fast
text+image+audio+video->video
t2v, i2v
Sprachsynthese
Wandelt Text mit einer Modell-ID aus /v1/models?output_modalities=speech in Audio um. Abgerechnet wird zum Preis pro Million Zeichen der Modellseite. Das komplette Audio wird gepuffert und danach als Binärdaten zurückgegeben; schrittweises Streaming wird nicht unterstützt. Routing-Steuerfelder wie provider, transforms, route, service_tier und preset werden ignoriert.
multipart/form-data mit model und file oder JSON model und input_audio:{data,format} (rohes base64). Formate: wav, mp3, mp4, m4a, ogg, flac, webm, aac. Dekodiertes Audio: 25 MiB; Anfragekörper: 50 MiB für base64. audio.transcription_max_seconds_by_model setzt das Limit pro Modell; sonst gelten audio.transcription_max_seconds und danach 60 Sekunden. Längeres Audio wird vor der Verarbeitung mit 413 audio_too_long abgelehnt und nicht berechnet. response_format: nur json oder verbose_json; timestamp_granularities word/segment nur mit verbose_json. stream nicht unterstützt (400 unsupported_parameter); Audio zu groß: 413 audio_too_large. provider wird ignoriert. Datenbankpreise pro usage.seconds oder Eingabe-/Ausgabe-token; Minutenpreis = 60 × Sekundenpreis. usage.cost ist der Kundenbetrag in USD.
query und documents liefern sortierte index- und relevance_score-Werte. Abrechnungseinheit: search, zum Modellpreis mal usage.search_units statt Dokumentanzahl. Streaming (stream) wird nicht unterstützt.
POST/v1/rerank
1
2
3
4
curl https://api.bazaarlink.ai/v1/rerank \
-H "$BAZAARLINK_AUTH_HEADER" \
-H "Content-Type: application/json" \
-d '{"model":"your-rerank-model-id","query":"capital of France","documents":["Paris is the capital of France.","Berlin is in Germany."],"top_n":1}'
POST/v1/chat/completions
audio oder input_audio mit /v1/chat/completions und einem Audiomodell verwenden. Die konfigurierten Eingabe-/Ausgabe-Tokenpreise gelten einheitlich für alle gemeldeten Text- und Audiotokens.
POST /v1/audio/speech ist OpenAI-compatible: JSON senden und die Audiodatei als Binärdaten empfangen. Zur ElevenLabs-Familie gehören elevenlabs/eleven-v4, eleven-v4-turbo, eleven-v3, eleven-v3-conversational, eleven-multilingual-v2, eleven-flash-v2.5, eleven-flash-v2, eleven-turbo-v2.5 und eleven-turbo-v2. Die aktuelle Liste steht unter GET /v1/models?output_modalities=speech. GET /v1/models liefert standardmäßig nur Textmodelle; hängen Sie ?output_modalities=speech (oder all) an, um sie aufzulisten.
POST/v1/audio/speech
Parameter
Parameter
Typ
Erforderlich
Beschreibung
model
string
Ja
ID des Sprachmodells, z. B. elevenlabs/eleven-flash-v2.5.
input
string
Ja
Zu synthetisierender Text: bis zu 4.096 Zeichen pro Anfrage (10.000 bei elevenlabs/eleven-v4 und eleven-v4-turbo). Längeren Text auf mehrere Anfragen verteilen.
voice
string
Ja
Zu verwendende Stimme; das Format hängt vom Modell ab. Siehe Stimmregeln unten.
response_format
string
Nein
mp3 (Standard) oder pcm. opus, aac, flac und wav nimmt die API an, ElevenLabs-Modelle lehnen sie derzeit aber mit 400 ab.
speed
number
Nein
Sprechgeschwindigkeit von 0.25 bis 4.0. Nicht jedes Modell wendet sie an.
instructions
string
Nein
Stilanweisungen für die Stimme. Nicht jedes Modell wendet sie an.
stability
number
Nein
Stabilität der Stimme, 0–1 (Standard 0,5). Niedriger klingt ausdrucksstärker, höher gleichmäßiger. Wirkt bei elevenlabs/*-Modellen, wenn die Anfrage über unsere direkte Sprachroute bedient wird; der Antwort-Header X-Voice-Settings zeigt applied oder ignored.
similarity_boost
number
Nein
Ähnlichkeit zur Originalstimme, 0–1 (Standard 0,75). Wird von Eleven v3 nicht verwendet.
style
number
Nein
Stilübertreibung, 0–1 (Standard 0). Werte über 0 erhöhen die Latenz. Wird von Eleven v4 nicht verwendet.
use_speaker_boost
boolean
Nein
Verstärkt die Ähnlichkeit zum ursprünglichen Sprecher (Standard true); erhöht die Latenz leicht.
clone_strength
number
Nein
Klon-Stärke, 0–1 (für die meisten Stimmen wird 0 empfohlen). Nur für Ihre eigenen professionellen Klonstimmen (voice_…), die für Eleven v4 trainiert wurden.
language_code
string
Nein
Zweibuchstabiger Sprachcode in Kleinbuchstaben (ISO 639-1), z. B. ar, ja oder en, um die Sprechsprache festzulegen. Wird von multilingual-v2-Modellen nicht verwendet.
audio_effects
object
Nein
Optionales Audioeffekt-Objekt: filter_preset_id (z. B. phone, old_radio), environment_id (Hallraum, z. B. small_room, hall), background_noise_id (z. B. cafe), distance (0–1), send_level (Hallanteil, 0–1) und pan (−1…1). IDs bestehen aus Kleinbuchstaben, Ziffern und Unterstrichen; keine Zusatzkosten. Hall oder ein pan ungleich 0 erzeugt Stereo und ist mit pcm-Ausgabe nicht kombinierbar.
Die sieben Stimmeinstellungen oben sind optional; ohne sie ändert sich nichts. Ein Wert außerhalb des Bereichs ergibt 400 und wird weder gesendet noch berechnet. Der Antwort-Header X-Voice-Settings zeigt, ob Ihre Einstellungen verwendet wurden: applied = verwendet; ignored = eine Ersatzroute hat geantwortet, Ihre Einstellungen wurden nicht verwendet (das Audio wird trotzdem erzeugt); kein Header = Sie haben keine Stimmeinstellungen gesendet. Beispiel: stability 0 liest ausdrucksstärker, stability 1 gleichmäßiger.
Stimmregeln
ElevenLabs-Modelle (elevenlabs/…) akzeptieren einen dieser Stimmennamen (Groß-/Kleinschreibung egal): george, sarah, adam, alice, bella, bill, brian, callum, charlie, chris, daniel, eric, harry, jessica, laura, liam, lily, matilda, river, roger, will. Bei ElevenLabs-Modellen darf voice fehlen (Standard george). Jeder andere Wert liefert 400 invalid_voice. Ihre eigene Stimme (voice_…) ist im Abschnitt „Eigene Stimmen“ unten beschrieben.
OpenAI-style Stimmnamen wie alloy, echo oder nova funktionieren nur bei Modellen, die sie aufführen. Prüfen Sie die Stimmen auf der Modellseite.
Eigene Stimmen (Klonen) werden schrittweise freigeschaltet: siehe den Abschnitt „Eigene Stimmen“ unten (POST /v1/voices). Bis sie für Ihr Konto aktiviert sind, nutzen Sie einen der 21 Preset-Namen oben oder eine öffentliche Stimm-ID.
alloy bei einem ElevenLabs-Modell schlägt fehl
Erhält ein ElevenLabs-Modell eine Stimme, die weder Voice-ID noch einer der unterstützten Namen ist (z. B. alloy oder Rachel), antwortet es mit 400 invalid_voice; die Meldung nennt die akzeptierten Namen. Fehlgeschlagene Anfragen werden nicht berechnet.
Integrierte Stimmen
Setzen Sie voice auf einen der Namen unten (Kleinbuchstaben). Jede Stimme hat einen kurzen Hörbeispiel-Clip, und GET /api/v1/audio/voices liefert die vollständige Liste (Geschlecht, Altersgruppe, Akzent, Stil und Vorschau-URLs).
?lang= (en, zh-TW, zh-CN; Standard: Accept-Language) bestimmt nur die Sprache von description. Die Vorschau-URLs ändern sich nicht: preview_urls.en (wie preview_url) ist der englische Clip, preview_urls.zh (wie preview_url_zh) der chinesische.
Stimme
Beschreibung
Vorschau
george
Male, middle-aged, British accent. Mature and steady, suited to narration and storytelling.
sarah
Female, young adult, American accent. Professional and clear, suited to broadcast-style reading.
adam
Male, middle-aged, American accent. Everyday and approachable, suited to short social videos.
alice
Female, middle-aged, British accent. Professional and informative, suited to explainers and teaching.
bella
Female, middle-aged, American accent. Professional and informative, suited to explainers and teaching.
bill
Male, senior, American accent. Crisp and direct, suited to advertising voice-overs.
brian
Male, middle-aged, American accent. Polished and refined, suited to social and brand content.
callum
Male, middle-aged, American accent. Expressive, suited to characters and animation.
charlie
Male, young adult, Australian accent. Energetic and lively, suited to conversation.
chris
Male, middle-aged, American accent. Relaxed and casual, suited to conversation.
daniel
Male, middle-aged, British accent. Formal and measured, suited to news-style and educational reading.
eric
Male, middle-aged, American accent. Polished and warm, suited to conversation.
harry
Male, young adult, American accent. Rough and gritty, suited to character voices.
jessica
Female, young adult, American accent. Bright and cute, suited to conversation.
laura
Female, young adult, American accent. Playful with attitude, suited to social content.
liam
Male, young adult, American accent. Confident and upbeat, suited to social content.
lily
Female, middle-aged, British accent. Confident and clear, suited to explainers and teaching.
matilda
Female, middle-aged, American accent. Upbeat and friendly, suited to explainers and teaching.
river
Neutral voice, middle-aged, American accent. Calm and even, suited to conversation.
roger
Male, middle-aged, American accent. Polished and confident, suited to conversation.
will
Male, young adult, American accent. Laid-back and easygoing, suited to conversation.
Emotions- und Aktions-Tags (Audio-Tags)
Schreiben Sie Tags in eckigen Klammern direkt in input, zum Beispiel [laughs], [whispers], [excited], [sighs], [crying], [curious] oder [softly]. Sie werden unverändert an das Modell gesendet und bestimmen, wie die folgenden Worte gesprochen werden. Lassen Sie die Tags auch bei deutschem Text auf Englisch.
1
2
3
4
5
curl https://api.bazaarlink.ai/v1/audio/speech \
-H "Authorization: Bearer $BAZAARLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"elevenlabs/eleven-v3","input":"[laughs] That was actually funny. [whispers] Do not tell anyone.","voice":"george","response_format":"mp3"}' \
--output audio-tags.mp3
Unterstützt von elevenlabs/eleven-v3 und der Familie elevenlabs/eleven-v4. Andere Sprachmodelle interpretieren Tags nicht und lesen die Klammern unter Umständen vor; probieren Sie zuerst einen kurzen Satz.
Tags zählen als Zeichen von input und werden wie der übrige Text berechnet.
Ausgabeformate
Ohne response_format gilt mp3 (Content-Type audio/mpeg); pcm (audio/pcm, rohes 16-Bit-PCM) funktioniert ebenfalls. Die API nimmt opus, aac, flac und wav an, ElevenLabs-Modelle lehnen sie derzeit jedoch mit 400 ab. Speichern Sie die Datei anhand des Content-Type-Headers.
Abrechnung
Sprachsynthese wird pro Eingabezeichen berechnet. Der Zeichenpreis steht auf der Modellseite unter /models sowie unter GET /v1/models als pricing.character. Modellseiten zeigen ihn pro Million Zeichen.
Ungültige Anfrage: model, input oder voice fehlt; input über 4.096 Zeichen; speed außerhalb 0.25–4.0; nicht unterstütztes response_format; Unknown voice; unknown_model (ID unter /models prüfen).
401
API-Schlüssel fehlt oder ist ungültig. Senden Sie Authorization: Bearer mit Ihrem BazaarLink-Schlüssel.
402
Guthaben reicht nicht aus. Aufladen und erneut versuchen.
403
Ein Verwaltungsschlüssel kann keine Modelle aufrufen, oder das Konto ist gesperrt. Verwenden Sie einen regulären API-Schlüssel.
429
Ratenlimit erreicht. Warten Sie gemäß Retry-After und versuchen Sie es erneut.
502
Der Modelldienst ist vorübergehend nicht verfügbar oder die Audioübertragung wurde unterbrochen. Erneut versuchen; fehlgeschlagene Anfragen werden nicht berechnet.
POST /v1/audio/transcriptions ist OpenAI-compatible: Audio als multipart/form-data hochladen oder base64 input_audio als JSON senden und Text empfangen. Zu den Modellen gehören elevenlabs/scribe-v2 und elevenlabs/scribe-v2-medical. Die aktuelle Liste steht unter GET /v1/models?output_modalities=transcription. GET /v1/models liefert standardmäßig nur Textmodelle; hängen Sie ?output_modalities=transcription (oder all) an, um sie aufzulisten.
POST/v1/audio/transcriptions
Parameter
Parameter
Typ
Erforderlich
Beschreibung
model
string
Ja
ID des Transkriptionsmodells, z. B. elevenlabs/scribe-v2.
json (Standard) liefert {text}; verbose_json ergänzt Sprache, Dauer und segments/words.
language
string
Nein
Optionaler Sprachhinweis wie en oder zh. Leer lassen für automatische Erkennung.
prompt
string
Nein
Optionaler Kontext für Namen und Begriffe. Nicht jedes Modell wendet ihn an.
timestamp_granularities[]
string[]
Nein
word und/oder segment. Nur bei response_format=verbose_json angewendet, sonst ignoriert. Zeitstempel auf Wortebene werden derzeit nicht zurückgegeben; Segmente schon.
Ausgabeformate
response_format akzeptiert nur json oder verbose_json (text, srt und vtt werden nicht unterstützt). stream wird nicht unterstützt. Die Audiodauer ist pro Modell begrenzt, standardmäßig auf 60 Sekunden. Längeres Audio wird vor der Verarbeitung mit 413 audio_too_long abgelehnt und nicht berechnet. Teilen Sie längere Aufnahmen auf.
Abrechnung
Transkription wird pro Audiosekunde berechnet. Der Sekundenpreis steht auf der Modellseite unter /models und unter GET /v1/models als pricing.second; der Minutenpreis beträgt das 60-Fache. Die Antwort zeigt die berechneten Sekunden unter usage und den Betrag unter usage.cost.
Ungültige Anfrage: model oder file fehlt, leeres Audio, response_format nicht json/verbose_json, stream=true (unsupported_parameter) oder timestamp_granularities nicht word/segment.
401
API-Schlüssel fehlt oder ist ungültig.
402
Guthaben reicht nicht aus. Aufladen und erneut versuchen.
413
audio_too_large: Dekodiertes Audio ist größer als 25 MiB. audio_too_long: Audio über dem Modelllimit (standardmäßig 60 Sekunden) wird vor der Verarbeitung abgelehnt und nicht berechnet. Komprimieren oder teilen Sie die Datei.
429
Ratenlimit erreicht. Retry-After abwarten und erneut versuchen.
502
Der Modelldienst ist vorübergehend nicht verfügbar oder die Audioübertragung wurde unterbrochen. Versuchen Sie es erneut; fehlgeschlagene Anfragen werden nicht berechnet.
Nur auf Antrag verfügbar. Eigene Stimmen werden Konto für Konto freigeschaltet: Wenden Sie sich zum Beantragen an den Kundensupport. Solange Ihr Konto nicht freigeschaltet ist, antwortet jede /v1/voices-Anfrage mit 403 voice_cloning_not_enabled (und mit 404 not_found, solange die Funktion für alle abgeschaltet ist). Die Grenzen und der Preis auf dieser Seite sind Standardwerte und können sich ändern.
Laden Sie eine kurze Aufnahme einer Stimme hoch, die Sie verwenden dürfen, und erhalten Sie eine eigene Stimm-ID (voice_…). Übergeben Sie diese ID als voice an POST /v1/audio/speech. Eine Stimme kann nur von der Person genutzt werden, die sie erstellt hat.
Endpunkte
POST/v1/voices
Stimme erstellen (multipart/form-data)
GET/v1/voices
Eigene Stimmen auflisten (limit 1–100, after = Stimm-ID für die nächste Seite)
GET/v1/voices/{id}
Eine eigene Stimme abrufen
DELETE/v1/voices/{id}
Stimme löschen (wirkt sofort)
POST/v1/voices/report
Stimme melden (kein API-Schlüssel nötig)
Stimme erstellen: Felder
Feld
Typ
Pflicht
Beschreibung
name
string
Ja
Name der Stimme, 1–60 Zeichen.
files
file[]
Ja
1 bis 5 Aufnahmen der Stimme (mp3, wav, m4a, ogg, flac, webm).
consent
boolean
Ja
Muss true sein: Sie bestätigen, dass Sie diese Stimme klonen und verwenden dürfen (siehe Einwilligung).
consent_statement_version
string
Ja
Die Version der bestätigten Einwilligungserklärung. Aktuell "v1".
description
string
Nein
Optional, bis zu 200 Zeichen.
remove_background_noise
boolean
Nein
Optionaler Boolean, Standard false. Entfernt vor dem Klonen Hintergrundgeräusche aus den Aufnahmen.
Die Anfrage ist synchron: Bei 201 ist die Stimme sofort nutzbar. Senden Sie einen Idempotency-Key-Header (beliebiger eindeutiger String) und verwenden Sie ihn bei einer Wiederholung erneut, damit eine Wiederholung nie eine zweite Stimme erstellt oder berechnet.
Antwort
201 mit id (voice_…), object ("voice"), name, description, status ("ready"), created_at (Unix-Sekunden) und usage.cost_usd (die berechnete Erstellungsgebühr). Weitere Informationen darüber, wie die Stimme erzeugt wird, verlassen unsere Systeme nicht.
GET /v1/voices liefert nur Ihre eigenen Stimmen: { "object": "list", "data": [ … ], "has_more": false }. Die Stimm-ID einer anderen Person antwortet genau wie eine nicht vorhandene ID mit 404 voice_not_found.
GET /v1/voices/{id} liefert eine Stimme (dieselben Felder wie oben, ohne usage).
DELETE /v1/voices/{id} liefert { "id": "voice_…", "object": "voice", "deleted": true } und wirkt sofort: Sprachanfragen mit dieser Stimme schlagen sofort fehl. Löschen ist kostenlos; die Erstellungsgebühr wird nicht erstattet.
Grenzen (Standardwerte)
Bis zu 3 Stimmen pro Person.
1 bis 5 Audiodateien pro Stimme, jeweils bis 10 MB und insgesamt 25 MB; Formate: mp3, wav, m4a, ogg, flac, webm. Etwa 30 Sekunden bis 5 Minuten saubere Sprache insgesamt funktionieren am besten.
Bis zu 3 Erstellungen pro Tag (UTC-Tag).
Ihr Konto braucht eine bestätigte E-Mail-Adresse und ein Guthaben von mindestens US$5.
Namen und Beschreibungen, die Personen des öffentlichen Lebens nachahmen oder wie offizielle bzw. Mitarbeiterstimmen klingen, werden abgelehnt (invalid_voice_name).
Aufnahmen dienen nur zum Erstellen der Stimme und werden von uns nicht gespeichert. Wir behalten Stimmnamen, Eigentümer, Einwilligungsnachweis und Zeitstempel.
Preis
Das Erstellen einer Stimme kostet einmalig (Standard US$1.00); der berechnete Betrag steht in usage.cost_usd, und berechnet wird nur, wenn die Stimme erfolgreich erstellt wurde. Eine eigene Stimme in der Sprachausgabe kostet pro Zeichen dasselbe wie die anderen Stimmen des Modells. Löschen ist kostenlos.
Einwilligung
Jede Erstellung muss consent=true und consent_statement_version="v1" senden. Wird die Erklärung aktualisiert, antwortet die Erstellung mit 400 consent_version_mismatch, und Sie bestätigen mit der neuen Version erneut.
Entwurf der Erklärung, die Sie bestätigen (der endgültige Wortlaut wird geprüft und kann sich ändern):
I confirm that I own the voice in these recordings or have the written permission of the person whose voice it is, that this person is an adult and has agreed to have their voice cloned and synthesized, and that I will not use the voice to impersonate a real person, to deceive, to harass, or for political persuasion, fraud or any unlawful purpose. I understand the voice can be removed and my account suspended if I break these rules.
Eine eigene Stimme verwenden
Übergeben Sie die Stimm-ID als voice an POST /v1/audio/speech (voice=voice_…) zusammen mit einem Sprachmodell der Familie elevenlabs/*. Eingabegrenze, Formate und Preis pro Zeichen sind die des Modells. Eine ID, die nicht existiert, gelöscht oder gesperrt wurde oder einer anderen Person gehört, antwortet mit 400 invalid_voice; eine eigene Stimme lässt sich mit anderen Modellen nicht verwenden.
Wenn eine Stimme Sie oder andere ohne Erlaubnis nachahmt, melden Sie sie: POST /v1/voices/report (kein API-Schlüssel nötig) mit einem JSON-Body aus voice_id (voice_…) oder sample_url, reason (impersonation, fraud, harassment, minor, political oder other) und optional details und contact (E-Mail-Adresse). Die Antwort ist immer 202. Wir prüfen Meldungen und entfernen Stimmen, die gegen die Regeln verstoßen; Konten können gesperrt werden.
Klonen Sie keine Stimmen von Personen des öffentlichen Lebens, Prominenten, Politikern oder Personen, die nicht zugestimmt haben. Nutzen Sie eine geklonte Stimme nicht, um den Eindruck zu erwecken, man spreche mit der echten Person, und nicht zum Täuschen, Belästigen, zur politischen Beeinflussung oder für Betrug.
Fehler
Status
Code
Bedeutung
400
bad_request
Fehlerhafte Anfrage: kein multipart/form-data, keine Audiodatei, description zu lang oder limit außerhalb von 1–100.
400
consent_required
consent=true fehlt.
400
consent_version_mismatch
Die Version der Einwilligungserklärung ist veraltet; bestätigen Sie mit der aktuellen Version erneut.
400
invalid_voice_name
Der Name ist leer, länger als 60 Zeichen oder nicht erlaubt.
400
too_many_files
Mehr als 5 Audiodateien.
401
invalid_api_key
API-Schlüssel fehlt oder ist ungültig.
402
insufficient_balance
Guthaben zu niedrig (Erstellungsgebühr oder Mindestguthaben).
403
email_unverified
Bestätigen Sie zuerst Ihre E-Mail-Adresse.
403
voice_cloning_not_enabled
Ihr Konto ist für eigene Stimmen noch nicht freigeschaltet; wenden Sie sich zum Beantragen an den Kundensupport.
403
voice_cloning_disabled
Eigene Stimmen sind für diesen Dienst derzeit nicht aktiviert.
404
voice_not_found
Diese Stimme gibt es nicht (oder sie gehört nicht Ihnen).
404
not_found
Nicht gefunden, einschließlich jeder /v1/voices-Anfrage, solange die Funktion für Ihr Konto nicht aktiviert ist.
405
method_not_allowed
Diese Methode ist auf diesem Pfad nicht verfügbar.
409
duplicate_request
Derselbe Idempotency-Key wird noch verarbeitet; warten Sie und versuchen Sie es erneut.
413
file_too_large
Eine Datei ist größer als 10 MB oder alle Dateien zusammen größer als 25 MB.
415
unsupported_file_type
Audiotyp nicht unterstützt; verwenden Sie mp3, wav, m4a, ogg, flac, webm.
422
voice_rejected
Die Prüfung des Stimmanbieters hat die Aufnahme nicht akzeptiert (zum Beispiel eine bekannte oder eingebaute Stimme oder eine bekannte KI-synthetisierte Stimme). Die Stimme wird nicht gespeichert und es wurde nichts berechnet. Verwenden Sie eine klare Aufnahme Ihrer eigenen Stimme oder einer Stimme, die Sie verwenden dürfen.
429
voice_create_rate_limited
Tageslimit für Erstellungen erreicht; versuchen Sie es morgen (UTC) erneut.
429
voice_limit_reached
Sie haben die maximale Anzahl eigener Stimmen erreicht.
502
upstream_failed
Die Stimme konnte nicht erstellt werden; es wurde nichts berechnet. Versuchen Sie es mit einem neuen Idempotency-Key erneut.
503
voice_capacity_full
Die Kapazität für eigene Stimmen ist vorübergehend erschöpft; es wurde nichts berechnet. Versuchen Sie es später erneut.
504
upstream_timeout
Der Stimmdienst hat nicht rechtzeitig geantwortet; es wurde nichts berechnet. Versuchen Sie es mit demselben Idempotency-Key erneut.
Daten-API
Bald verfügbar — Öffentliche Social- und Commerce-Daten über drei BazaarLink-Endpunkte. Dieser Dienst ist standardmäßig deaktiviert. Bis zur Aktivierung liefern Anfragen service_paused.
Social-Datenanfrage senden
POST/v1/data/social
Anfrageparameter
Code
Typ
Erforderlich
Bedeutung
platform
string
Ja
Plattform-ID aus dem Katalog, etwa twitter oder instagram.
action
string
Ja
Von der Plattform unterstützte Aktion; verfügbare Kombinationen finden Sie im Katalog.
params
object
Nein
Aktionsspezifische Eingaben. Verwenden Sie required_params und optional_params aus dem Katalog.
mode
sync | async
Nein
Optional. async gibt einen abzufragenden Job zurück; ausschließlich asynchrone Aktionen geben auch bei Auslassung einen Job zurück.
Eine ausschließlich asynchrone Aktion oder mode async liefert HTTP 202 mit einer undurchsichtigen Job-ID. Fragen Sie GET /v1/data/jobs/{id} ab: HTTP 202 bedeutet ausstehend, HTTP 200 liefert die abgeschlossene data.social-Antwort. Ein Job läuft nach 15 Minuten ab (HTTP 410 job_expired). Unbekannte Jobs und Jobs eines anderen Kontos liefern HTTP 404 not_found. Ein abgeschlossener Job wird beim ersten erfolgreichen Abruf einmal berechnet.
{"object":"data.catalog","product":"BazaarLink Data API","platforms":[{"platform":"twitter","actions":[{"action":"search","label":"Keyword search","required_params":["keyword"],"optional_params":["sort"],"max_limit":200,"async":false,"price_usd":0.0048}]},{"platform":"instagram","actions":[{"action":"discover","label":"Discover","required_params":["keyword"],"optional_params":[],"max_limit":null,"async":true,"price_usd":0.0096}]}]}
Abrechnung
Die Preise sind nach Plattform und Aktion gestaffelt. GET /v1/data/catalog zeigt den Kundenpreis für jede aktivierte Aktion. Ein erfolgreicher Aufruf wird einmal berechnet; fehlgeschlagene Aufrufe und Aufrufe ohne Ergebnisse sind kostenlos. Data API und Websuche teilen sich ein tägliches kostenloses Kontingent.
Evaluate a state against named questions with a decisions-output model. This alpha endpoint returns non-streaming JSON. Find available model ids with GET /v1/models?output_modalities=decisions; use this endpoint for Clef instead of chat/completions. Input tokens are billed at the selected model's customer price. Sufficient credits are required. Set BAZAARLINK_API_KEY to your API key; the sample builds its complete Authorization header in BAZAARLINK_AUTH_HEADER.
export BAZAARLINK_AUTH_HEADER="Authorization: $(printf '%s %s' 'Bearer' "$BAZAARLINK_API_KEY")"
curl https://api.bazaarlink.ai/v1/alpha/decisions \
-H "$BAZAARLINK_AUTH_HEADER" \
-H "Content-Type: application/json" \
-d '{
"model": "cloudflare/clef-flash",
"state": "The support agent issued a full refund.",
"questions": {
"refunded": {
"type": "noul",
"instructions": "Was a refund issued?"
}
}
}'
Video-Eingaben
Senden Sie Videodateien an Modelle mit Videoeingabe-Unterstützung zur Analyse, Beschriftung oder Beantwortung von Fragen zu Szenen und Ereignissen. Funktioniert mit einer direkten URL oder einem base64-Daten-URI — eine URL ist effizienter für öffentlich zugängliche Videos, base64 für lokale Dateien oder private Videos.
Unterstützte Formate
MP4 (H.264)MPEGMOVWebM
1
2
3
4
5
6
7
8
9
10
11
12
13
response = client.chat.completions.create(
model="google/gemini-3.5-flash",
messages=[{
"role": "user",
"content": [
{
"type": "video_url",
"video_url": {"url": "https://example.com/video.mp4"},
},
{"type": "text", "text": "What is happening in this video?"},
],
}],
)
Senden Sie PDF-Dokumente direkt in Nachrichten an Modelle mit nativer PDF-Unterstützung (z. B. Claude, Gemini). BazaarLink leitet die Datei direkt an das Modell weiter — abgerechnet als normale Input-Tokens, ohne Zusatzkosten oder zusätzlichen Verarbeitungsschritt.
Ein OpenAI Responses API-kompatibler Endpunkt für zustandslose Multi-Turn-Konversationen, Tool Calling und multimodale Eingaben. Ideal für Agenten und Frameworks, die das OpenAI Python SDK ≥ 1.x mit client.responses.create() verwenden.
POST/v1/responses
Note
Akzeptiert die gleiche Authentifizierung und das gleiche Model-Routing wie Chat Completions.
Anfragetext
modelerforderlich
string
Verwenden Sie eine unter GET /v1/models aufgeführte id oder alias, z. B. "claude-sonnet-4.6" oder "anthropic/claude-sonnet-4.6".
inputerforderlich
string | Item[]
Benutzereingabe — ein einfacher String (einzelne Nachricht) oder ein Array von Eingabeelementen für Multi-Turn-/multimodale Konversationen.
instructions
string
Anweisungen auf Systemebene, äquivalent zu einer Systemnachricht. Muss bei jeder Anfrage erneut gesendet werden.
stream
boolean
Bei true werden Responses API SSE-Stream-Events zurückgegeben. Event-Typen: response.created, response.output_text.delta, response.completed.
max_output_tokens
integer
Maximale Anzahl der zu generierenden Ausgabe-Tokens (einschließlich Reasoning-Tokens für o-series-Modelle).
temperature
number
Sampling-Werte werden ohne Bereichsprüfung weitergegeben. Das Modell kann nicht unterstützte Werte begrenzen oder ignorieren.
Tool-(Funktions-)Definitionen — gleiches JSON-Schema-Format wie Chat Completions (akzeptiert sowohl die flache Responses-Form als auch die verschachtelte Form). OpenAIs eigene integrierte gehostete Tools (web_search_preview, file_search, computer_use_preview) werden nicht unterstützt; Websuche ist über plugins: [{id:"web"}] verfügbar — nur auf manchen Modellrouten unterstützt.
tool_choice
string | object
Steuert die Tool-Nutzung: "auto", "none" oder bestimmtes Tool
parallel_tool_calls
boolean
Parallele Funktionsaufrufe aktivieren, wenn Tools bereitgestellt werden. Standard: true. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
Dieser Endpunkt ist zustandslos — die Übergabe eines Nicht-null-Werts liefert sofort 400 (invalid_prompt); er wird nie akzeptiert und ignoriert. Verwenden Sie stattdessen den zustandslosen Modus: Übergeben Sie den vollständigen Konversationsverlauf im input-Array.
curl https://api.bazaarlink.ai/v1/responses \
-H "Authorization: Bearer $BAZAARLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-5.4-mini",
"instructions": "You are a helpful assistant.",
"input": "What is the capital of Taiwan?"
}'
Antwortformat
BazaarLink gibt eine standardisierte Antwort zurück und entfernt Upstream-spezifische Felder. Die opake BazaarLink-Anfrage-ID in der Antwort stimmt mit x-request-id überein; verwenden Sie sie mit GET /v1/generation. Nicht gestreamte Antworten enthalten dieselbe ID auch in x-generation-id. usage.cost ist der dem Kunden berechnete USD-Betrag. Statistiken können erst einige Sekunden nach Abschluss verfügbar sein; wiederholen Sie 404 kurzzeitig.
Ersetzen Sie messages durch input (String oder Array), verwenden Sie instructions statt einer system-role-Nachricht und lesen Sie output[0].content[0].text statt choices[0].message.content.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Chat Completions (before)
response = client.chat.completions.create(
model="openai/gpt-5.4-mini",
messages=[
{"role": "system", "content": "You are helpful."},
{"role": "user", "content": "Hello"},
]
)
text = response.choices[0].message.content
# Responses API (after)
response = client.responses.create(
model="openai/gpt-5.4-mini",
instructions="You are helpful.",
input="Hello"
)
text = response.output[0].content[0].text
Einschränkungen
previous_response_id oder store: true wird mit 400 (Fehlercode invalid_prompt) abgelehnt — nicht akzeptiert und ignoriert. Verwenden Sie stets den zustandslosen Modus: Übergeben Sie den vollständigen Konversationsverlauf im input-Array.
OpenAIs eigene integrierte gehostete Tools (web_search_preview, file_search, computer_use_preview) werden nicht unterstützt. Websuche ist über plugins: [{id:"web"}] verfügbar — nur auf manchen Modellrouten unterstützt.
background: true wird akzeptiert, aber ignoriert — jede Anfrage läuft synchron bis zum Abschluss.
Messages (Anthropic)
Anthropic-kompatible Messages API für das Claude SDK. Richten Sie das SDK auf BazaarLink und verwenden Sie einen BazaarLink-API-Schlüssel. Antwortfelder und Abrechnungsmetadaten folgen dem unten dokumentierten BazaarLink-Vertrag.
BazaarLink gibt eine standardisierte Antwort zurück und entfernt Upstream-spezifische Felder. Die opake BazaarLink-Anfrage-ID in der Antwort stimmt mit x-request-id überein; verwenden Sie sie mit GET /v1/generation. Nicht gestreamte Antworten enthalten dieselbe ID auch in x-generation-id. usage.cost und usage.bz_cost enthalten denselben dem Kunden berechneten USD-Betrag. Statistiken können erst einige Sekunden nach Abschluss verfügbar sein; wiederholen Sie 404 kurzzeitig.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{"id":"85e6f35c71a31f19-SJC","type":"message","role":"assistant","model":"anthropic/claude-opus-4.6","content":[{"type":"text","text":"Hello! How can I help you today?"}],"stop_reason":"end_turn","usage":{"input_tokens":10,"output_tokens":12,"cache_read_input_tokens":0,"cache_creation_input_tokens":0,"cost":0.00042,"bz_cost":0.00042}}
Fehlerhüllen unterscheiden sich je nach Fehlerfall. Verzweigen Sie nach HTTP-Status und, falls vorhanden, error.type. error.code kann eine Zeichenfolge, ein numerischer HTTP-Status oder nicht vorhanden sein. Hinweise zur Behandlung finden Sie im Fehlerabschnitt.
Modelle
Alle verfügbaren Modelle mit Preis- und Fähigkeitsinformationen auflisten. Für diesen Endpunkt ist keine Authentifizierung erforderlich.
// /v1/models — Response SchematypeModelsResponse = {
data: Model[];
};
typeModel = {
id: string; // Model ID (e.g. "openai/gpt-4o")name: string; // Human-readable namecontext_length: number | null; // Max context window in tokensmodality: string | null; // e.g. "text->text", "text+image->text"architecture?: {
input_modalities?: string[];
output_modalities?: Array<
"text" | "image" | "embeddings" | "audio" |
"video" | "rerank" | "speech" | "transcription"
>;
};
pricing: {
prompt: string; // Input price per 1M tokens (USD)completion: string; // Output price per 1M tokens (USD)input_cache_read?: string; // Cache read price per token (USD); only when the model publishes oneinput_cache_write?: string; // Cache write price per token (USD); only when the model publishes oneimage_output?: string; // Image output price per token (USD); only token-billed image models (display only)
};
description?: string | null; // Model descriptiontop_provider?: {
max_completion_tokens?: number;
};
supported_parameters?: string[]; // e.g. ["tools", "response_format", "reasoning"]pricing_tiers?: { // Present only for models with input-length tiersabove_prompt_tokens: number; // Ascending; strict "greater than" thresholdprompt: string; // USD per token, override tiercompletion: string; // USD per token, override tierinput_cache_read?: string; // USD per token, only when the tier overrides itinput_cache_write?: string; // USD per token, only when the tier overrides it
}[];
};
Gestaffelte Preise nach Eingabelänge
Manche Modelle wechseln zu einer anderen Preistabelle, sobald der Prompt einen Token-Schwellenwert überschreitet — die gesamte Tabelle ändert sich, nicht nur die Tokens über dem Schwellenwert. Die Schwellenwerte sind strikt: Ein Prompt mit genau N Tokens wird noch mit der Stufe unter N abgerechnet; die höhere Stufe gilt erst, wenn die Eingabe-Tokens größer als N sind.
pricing_tiers ist ein Geschwisterfeld von pricing und ist nur vorhanden, wenn ein Modell Override-Stufen oberhalb des Basispreises hat. Einträge sind nach above_prompt_tokens aufsteigend sortiert; prompt/completion sind USD pro Token (gleiche Einheit wie pricing.prompt/pricing.completion). pricing.prompt und pricing.completion bleiben immer die Basis-(niedrigste) Stufe.
Die meisten Modelle haben keine Stufen — dort fehlt der Schlüssel pricing_tiers in der Antwort einfach.
Jev bewertet einen JSON-Zustand anhand benannter Fragen und gibt Antworten vom Typ boolean, choice oder score zurück. Verwenden Sie es, wenn eine Anwendung klare Kriterien in maschinenlesbare Ergebnisse umwandeln soll.
Nur für Bewertung und Beurteilung
Jev unterstützt keinen Chat. Senden Sie Jev-Anfragen an POST /v1/evaluations; eine Anfrage an POST /v1/chat/completions liefert HTTP 400.
POST/v1/evaluations
Rufen Sie diesen Endpunkt mit Ihrem BazaarLink-API-Schlüssel auf. Vollständige URL: https://api.bazaarlink.ai/v1/evaluations.
Feldreferenz
model
string
Optional. Ohne Angabe gilt typesafe-ai/jev. Jede andere Modell-ID führt zu HTTP 400 mit dem Code model_not_available.
state
string | object | array
Erforderlich. Geben Sie den auszuwertenden Zustand als JSON-Zeichenfolge, Objekt oder Array an. Überschreiten der gemeinsam serialisierten state- und questions-Daten 32.000 tokens, lautet der Fehlercode context_length_exceeded.
questions
record<string, Question>
Erforderlich. Ein nicht leeres Objekt mit benannten Fragen. Jeder Fragenname wird zum Schlüssel im Antwortobjekt answers.
type
boolean | choice | score
Für jede Frage erforderlich: boolean, choice oder score.
instructions
string | object | array
Für jede Frage erforderlich. Eine JSON-Zeichenfolge, ein Objekt oder Array, das die gewünschte Entscheidung beschreibt.
criteria
object | array
Abhängig vom Typ: bei boolean optional; falls angegeben, ein Objekt mit ausschließlich den Schlüsseln true oder false. Für choice ist ein nicht leeres Objekt erforderlich, für score ein geordnetes Array mit mindestens zwei Einträgen.
Antworttypen
boolean — criteria ist optional; falls angegeben, sind nur die Schlüssel true und false zulässig. Die Antwort enthält einen numerischen probability-Wert.
choice — criteria muss ein nicht leeres Objekt sein, das Optionsnamen JSON-Kriterien zuordnet. Die Antwort enthält choice als Zeichenfolge; probabilities sind nach Optionsnamen indiziert.
score — criteria muss ein geordnetes Array mit mindestens zwei Einträgen sein. score ist eine Zahl und der Erwartungswert der Indizes 0..N-1 in criteria-Reihenfolge; probabilities sind mit diesen Indizes als Zeichenfolgen indiziert.
Anfragebeispiele
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
curl --fail-with-body https://api.bazaarlink.ai/v1/evaluations \
-H "Authorization: Bearer $BAZAARLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "typesafe-ai/jev",
"state": "The support agent issued a full refund and apologised for the delay.",
"questions": {
"refunded": {
"type": "boolean",
"instructions": "Was a refund issued?"
},
"tone": {
"type": "choice",
"instructions": "Tone of the agent?",
"criteria": {
"apologetic": "The agent apologises",
"neutral": "No emotional language",
"hostile": "The agent is rude"
}
},
"quality": {
"type": "score",
"instructions": "How complete was the resolution?",
"criteria": [
"poor",
"partial",
"complete"
]
}
}
}'
Beispiel für eine erfolgreiche Antwort
Die Beispielantwort enthält id, object, model, answers, usage, rounding und warnings. answers ist nach Fragennamen indiziert. usage enthält input_tokens, output_tokens und total_tokens; rounding zeigt probabilityDecimals und scoreDecimals. warnings ist ein Array und in diesem Beispiel leer. In answers verwenden die probabilities von choice Optionsnamen als Schlüssel; die probabilities von score verwenden Kriterienindizes als Zeichenfolgenschlüssel.
Eine Jev-Anfrage an einen Chat-Endpunkt liefert HTTP 400. Die folgenden Felder und Werte entsprechen dem Handler; message ist als Platzhalter dargestellt und der tatsächliche Text kommt vom Server.
Beim Streaming werden Nutzungsdaten im letzten Chunk vor der [DONE]-Nachricht zurückgegeben, zusammen mit einem choices-Array mit leerem delta und finish_reason: "stop".
Keep-alive & letzter Chunk
Streams können SSE-Kommentarzeilen und unbekannte oder ping-Keep-alive-Ereignisse enthalten. Ignorieren Sie diese und verarbeiten Sie data-Frames; der letzte data-Frame kann vor data: [DONE] usage enthalten.
1
2
3
4
5
6
7
: keepalive <- SSE comment line — ignore, do NOT JSON.parse
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"Hi"},"index":0}]}
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{},"finish_reason":"stop","index":0}],"usage":{...}}
data: [DONE]
Stream-Abbruch
Streaming-Anfragen können abgebrochen werden, indem die Client-Verbindung geschlossen wird — z. B. durch Aufruf von AbortController.abort() oder Schließen des Stream-Objekts. BazaarLink stoppt das Weiterleiten weiterer Chunks und bricht die ausgehende Anfrage an den Provider ab, sobald der Abbruch erkannt wird.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
importOpenAIfrom"openai";
const client = newOpenAI({
baseURL: "https://api.bazaarlink.ai/v1",
apiKey: "sk-bl-YOUR_API_KEY",
});
const controller = newAbortController();
const stream = await client.chat.completions.create(
{
model: "anthropic/claude-sonnet-4.6",
messages: [{ role: "user", content: "Write a long story." }],
stream: true,
},
{ signal: controller.signal }
);
forawait (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content;
if (content) process.stdout.write(content);
}
// e.g. on a "Stop" button click:
controller.abort();
Keine Kosten für einen unterbrochenen Stream
Endet ein Stream, bevor der letzte usage-Chunk eintrifft — auch bei einem clientseitigen Abbruch — gibt es keine belastbare Token-Zählung für diese Anfrage, weshalb BazaarLink die vollständige Reservierung erstattet. Für bereits an Ihren Client ausgelieferte Inhalte vor dem Abbruch werden Sie nicht berechnet.
Kein garantierter sofortiger Stopp beim Provider
Das Schließen der Verbindung stoppt sofort die Weiterleitung und Abrechnung weiterer Token durch BazaarLink, ob der vorgelagerte Provider die Generierung auf seinen eigenen Servern jedoch augenblicklich einstellt, hängt vom jeweiligen Provider ab — manche rechnen noch kurz weiter, nachdem die Verbindung getrennt wurde.
Fehler mitten im Stream
Kein choices-Feld bei Fehler-Frames
Tritt ein Fehler auf, nachdem das Streaming bereits begonnen hat (z. B. Abbruch der Upstream-Verbindung), erhalten Sie einen SSE-Datenframe der Form {error:{message,type,code}} statt des üblichen {choices:[...]} — ohne Änderung des HTTP-Status, da die Header bereits gesendet wurden. Prüfen Sie auf ein error-Feld, bevor Sie choices[0].delta lesen. Abgerechnet werden nur die bereits gestreamten Tokens (anteilige Abrechnung).
1
2
3
4
5
data: {"id":"85e6f35c71a31f19-SJC","choices":[{"delta":{"content":"The capital of "},"index":0}]}
data: {"error":{"message":"The request could not be completed.","type":"upstream_error","code":502}}
data: [DONE]
Embeddings
Embeddings sind numerische Darstellungen von Text, die semantische Bedeutung erfassen — sie wandeln Text in Vektoren (Zahlenfolgen) um, die für vielfältige Machine-Learning-Aufgaben genutzt werden können. BazaarLink bietet einen einheitlichen, zur OpenAI Embeddings API kompatiblen Endpunkt, über den Sie Embedding-Modelle mehrerer Anbieter über eine einzige Schnittstelle aufrufen können.
Embedding-Antworten verwenden eine opake BazaarLink-Anfrage-ID, die mit x-request-id übereinstimmt; verwenden Sie sie mit GET /v1/generation. Die nicht gestreamte Antwort gibt dieselbe ID auch in x-generation-id zurück. usage.cost ist der für diese Anfrage berechnete USD-Betrag. Statistiken können erst Sekunden später verfügbar sein; wiederholen Sie 404 kurzzeitig.
Was sind Embeddings?
Embeddings wandeln Text in hochdimensionale Vektoren um, bei denen semantisch ähnliche Texte im Vektorraum näher beieinanderliegen — zum Beispiel hätten "Katze" und "Kätzchen" ähnliche Embeddings, während "Katze" und "Flugzeug" weit auseinanderlägen. Diese Vektordarstellungen ermöglichen es Maschinen, Beziehungen zwischen Textabschnitten zu verstehen, und bilden damit die Grundlage vieler KI-Anwendungen.
Typische Anwendungsfälle
Anwendungsfall
Beschreibung
RAG (Abruf-erweiterte Generierung)Systeme entwickeln, die vor der Antwortgenerierung relevanten Kontext aus einer Wissensdatenbank abrufen — Embeddings finden die relevantesten Dokumente für den Kontext des LLM.
Semantische SucheDokumente und Anfragen in Embeddings umwandeln und dann die relevantesten Dokumente über Vektorähnlichkeit finden — versteht Bedeutung statt nur Schlüsselwörter abzugleichen und liefert bessere Ergebnisse als reine Schlüsselwortsuche.
EmpfehlungssystemeEmbeddings für Artikel (Produkte, Beiträge, Videos) und Nutzerpräferenzen erzeugen, um ähnliche Artikel zu empfehlen — Vektorvergleich findet semantisch verwandte Artikel auch ohne gemeinsame Schlüsselwörter.
Clustering & KlassifizierungÄhnliche Dokumente gruppieren oder Text klassifizieren, indem Embedding-Muster analysiert werden — Dokumente mit ähnlichen Embeddings gehören meist zum selben Thema oder zur selben Kategorie.
DuplikaterkennungDuplikate oder nahezu identische Inhalte durch Vergleich der Embedding-Ähnlichkeit finden — funktioniert auch bei umformuliertem Inhalt.
AnomalieerkennungUngewöhnliche oder abweichende Inhalte erkennen, indem Embeddings identifiziert werden, die deutlich vom typischen Muster des Datensatzes abweichen.
POST/v1/embeddings
Note
Unterstützt eine Upstream-Quelle das angeforderte Embeddings-Modell nicht, kann die Anfrage eine andere verfügbare Quelle versuchen. Gibt es keine passende Quelle, wird ein Fehler zurückgegeben.
Parameter
modelerforderlich
string
Das zu verwendende Embedding-Modell, z. B. "openai/text-embedding-3-small".
inputerforderlich
string | string[] | ContentItem[]
Zu embeddender Text — ein einzelner String, ein Array von Strings für einen Batch-Aufruf, oder (bei unterstützenden Modellen) ein Array von {content:[...]}-Elementen mit Text- und image_url-Teilen.
dimensions
integer
Angeforderte Ausgabevektorgröße. Wird nur von Modellen mit variabler Dimension unterstützt (z. B. die OpenAI text-embedding-3-Familie); wird unverändert an den Upstream-Anbieter weitergeleitet und von nicht unterstützenden Modellen ignoriert.
encoding_format
string
Angefordertes Embedding-Encoding, z. B. "float" oder "base64". Wird unverändert an den Upstream-Anbieter weitergeleitet — die Unterstützung hängt vom Modell ab.
provider
object
Unsupported. The entire object is ignored and removed before forwarding; it cannot select an upstream or price tier.
Einfache Anfrage
1
2
3
4
5
6
7
8
9
10
11
12
13
from openai import OpenAI
client = OpenAI(
base_url="https://api.bazaarlink.ai/v1",
api_key="sk-bl-YOUR_API_KEY",
)
response = client.embeddings.create(
model="openai/text-embedding-3-small",
input="The quick brown fox jumps over the lazy dog",
)
print(response.data[0].embedding) # 1536-dimensional vector
Batch-Verarbeitung
Senden Sie ein Array von Strings, um mehrere Texte in einer einzigen Anfrage zu embedden — günstiger und schneller als ein Aufruf pro Text.
1
2
3
4
5
6
7
8
9
10
11
response = client.embeddings.create(
model="openai/text-embedding-3-small",
input=[
"Machine learning is a subset of artificial intelligence",
"Deep learning uses neural networks with multiple layers",
"Natural language processing enables computers to understand text",
],
)
for i, item inenumerate(response.data):
print(f"Embedding {i}: {len(item.embedding)} dimensions")
Multimodale Eingabe (Bild + Text)
Modelle mit Bildeingabe-Unterstützung (output_modalities enthält "embeddings", inputModalities enthält "image") akzeptieren Eingabe-Elemente in der Form {content:[{type:"text",...}, {type:"image_url",...}]} — so können Sie ein Bild allein oder gemeinsam mit Text embedden.
Modellabhängig
Nur manche Embedding-Modelle akzeptieren Bildeingaben — prüfen Sie die unterstützten Modalitäten eines Modells auf der Modelle-Seite, bevor Sie image_url-Inhalte senden. Reine Textmodelle lehnen diese Form ab.
Es gibt keinen eigenen Endpunkt zum Auflisten von Embedding-Modellen — rufen Sie GET /v1/models auf und filtern Sie clientseitig nach Einträgen, deren output_modalities "embeddings" enthält, oder durchsuchen Sie die Modelle-Seite.
Einschränkungen
Kein Streaming — Embeddings werden immer als vollständige Antwort zurückgegeben, anders als bei Chat Completions.
Jedes Modell hat eine maximale Eingabelänge; Text darüber hinaus wird upstream gekürzt oder abgelehnt.
Embeddings für identische Eingaben sind deterministisch — keine Temperature oder Zufälligkeit im Spiel.
Best Practices
Wählen Sie ein Modell nach Geschwindigkeit/Qualität/Kosten — kleinere Modelle (z. B. qwen/qwen3-embedding-4b) sind günstiger und schneller; größere (z. B. openai/text-embedding-3-large) embedden meist mit höherer Genauigkeit.
Fassen Sie mehrere Texte in einer Anfrage zusammen statt einem Aufruf pro Text — weniger Roundtrips, geringerer Overhead.
Cachen Sie Ergebnisse — Embeddings für dieselbe Eingabe ändern sich nie, speichern Sie sie statt sie neu zu erzeugen.
Vergleichen Sie mit Kosinus-Ähnlichkeit, nicht mit euklidischem Abstand — sie ist skaleninvariant und funktioniert besser bei hochdimensionalen Vektoren.
Achten Sie auf die Kontextlänge jedes Modells — lange Dokumente müssen vor dem Embedding evtl. in Abschnitte zerlegt werden.
Parameter
Sampling-Parameter bestimmen den Token-Generierungsprozess. BazaarLink leitet unterstützte Parameter an den Upstream-Anbieter weiter; nicht unterstützte Parameter werden stillschweigend ignoriert.
Sampling-Parameter
Reine Passthrough — keine lokalen Standardwerte
Sampling-Werte werden ohne Bereichsprüfung weitergegeben. Das Modell kann nicht unterstützte Werte begrenzen oder ignorieren.
temperature
number
Sampling-Werte werden ohne Bereichsprüfung weitergegeben. Das Modell kann nicht unterstützte Werte begrenzen oder ignorieren.
Fordert striktes, JSON-Schema-konformes Output bei Providern an, die dies unterstützen. Wird unverändert weitergegeben
reasoning
object
Provider-spezifische Reasoning-/Thinking-Konfiguration. Wird unverändert weitergegeben
reasoning_effort
string
OpenAI o-Serie Reasoning-Aufwand: "low", "medium" oder "high". Wird unverändert weitergegeben
include_reasoning
boolean
true liefert den Denkinhalt in message.reasoning (beim Streaming in delta.reasoning); false schaltet das Denken bei den Modellen ab, die standardmäßig denken (siehe Abschnitt Reasoning), sodass kein Denken berechnet wird. Ohne reasoning_effort, reasoning oder thinking denken und liefern nur diese Modelle standardmäßig; andere Modelle nur auf Anfrage
stop
string | string[]
Stoppsequenzen — Generierung stoppt bei Auftreten
tools
Tool[]
Liste der Tools (Funktionen), die das Modell aufrufen kann
tool_choice
string | object
Steuert die Tool-Nutzung: "auto", "none" oder bestimmtes Tool
parallel_tool_calls
boolean
Parallele Funktionsaufrufe aktivieren, wenn Tools bereitgestellt werden. Standard: true. Nur für Modelle der OpenAI-Familie — siehe Hinweis unten.
Credits
Fragen Sie den aktuellen Guthabenstand und die Lebensdauer API Nutzung ab.
Rufen Sie GET /v1/generation mit der opaken BazaarLink-Anfrage-ID aus Antwort-id oder x-request-id auf; nicht gestreamte Antworten liefern dieselbe ID auch in x-generation-id. Statistiken können erst Sekunden später verfügbar sein; wiederholen Sie 404 kurzzeitig.
Errors: 400 (fehlende ID), 401 (Authentifizierung), 404 (Generation nicht gefunden).
API Schlüsselinformationen
Fragen Sie die Ratenbegrenzungsstufe des aktuellen API-Schlüssels und die aggregierten Nutzungszähler ab (das Antwortformat folgt den branchenüblichen Konventionen für Schlüsselinformationen API).
is_free_tier = true, wenn das Guthaben < 10 $ ist. Die Fenster sind in UTC: täglich = aktueller Tag, wöchentlich = Mo–So, monatlich = 1.–EOM. Wenn für den Schlüssel ein Ausgabenlimit pro Schlüssel festgelegt ist (über den Limit-Parameter des Schlüssels creation/update), spiegelt limit / limit_remaining / limit_reset dieses Limit und die Nutzung des entsprechenden Zeitraums wider; andernfalls ist limit null und limit_remaining fällt auf den Guthabenstand Ihres Kontos zurück. expires_at ist die Ablaufzeit des Schlüssels (null, wenn keine). is_management_key und is_provisioning_key sind Aliase für dasselbe Konzept – beide gelten für einen Verwaltungsschlüssel.
BYOK
BazaarLink bietet kein Programm zum Bringen Ihres eigenen Schlüssels (BYOK), daher gibt dieser Endpunkt keine byok_usage-Felder zurück.
Fehlerhüllen unterscheiden sich je Endpunkt. Verwenden Sie HTTP-Status und, falls vorhanden, error.type. error.code kann ein String oder eine Zahl sein und fehlen; error.message dient nur der Anzeige.
1
2
3
4
5
6
7
{"error":{"message":"Insufficient credits. Please top up to continue.","type":"invalid_request_error","code":"insufficient_credits"}}
HTTP Status und Fehlercode
Fehlerhüllen unterscheiden sich je Endpunkt. Verwenden Sie HTTP-Status und, falls vorhanden, error.type. error.code kann ein String oder eine Zahl sein und fehlen; error.message dient nur der Anzeige.
Code
Name
Beschreibung
424Abhängigkeit fehlgeschlagenIhr selbst eingerichteter BYOK-Schlüssel wurde vom Upstream-Anbieter abgelehnt. Prüfen oder wechseln Sie ihn in den BYOK-Einstellungen. Dieser Fehler tritt nur im Strict-Modus auf
400Bad RequestFehlerhafte Anfrage, leeres messages-Array oder fehlende Pflichtfelder
401Nicht autorisiertAPI-Schlüssel fehlt, ist ungültig oder deaktiviert
402Zahlung erforderlichUnzureichendes Kontoguthaben, Schlüssel-Ausgabenlimit erreicht oder monatliches/wöchentliches Budgetlimit überschritten
403VerbotenKonto ist gesperrt oder hat keine Berechtigung
404Nicht gefundenRequested model, generation, key, or other resource does not exist
409KonfliktResource is not in the required state, such as an incomplete video job
410GegangenRequested model has been retired and must be replaced
413Payload zu großRequest-Body überschreitet 10 MB; reduzieren Sie die Inhaltsgröße oder teilen Sie die Anfrage auf
416Range nicht erfüllbarRequested byte range is invalid for generated video content
429Zu viele AnfragenRate Limit überschritten; prüfen Sie den Retry-After-Header vor dem erneuten Versuch
432Gratiskontingent erschöpftTavily-kompatible Endpunkte (/v1/search, /v1/extract, /v1/crawl, /v1/map): Das kostenlose Suchkontingent ist aufgebraucht oder das Guthaben beträgt null oder weniger; laden Sie Guthaben auf, um fortzufahren. Der Body hat Tavily-Format: {"detail":{"error":"..."}}
500ServerfehlerInterner BazaarLink-Fehler
502Bad GatewayKeine Upstream-Quelle konnte die Anfrage verarbeiten. Es wird ein Fehler zurückgegeben.
503Dienst nicht verfügbarKein Upstream-Anbieter für dieses Modell konfiguriert; Admin kontaktieren
504Gateway-TimeoutUpstream connection or stream stalled and timed out
Maschinenlesbare Abrechnungscodes
A 402 can represent different controls. Use these stable codes to choose the correct action.
Code
Beschreibung
byok_key_invalidIhr selbst eingerichteter BYOK-Schlüssel wurde vom Upstream-Anbieter abgelehnt. Prüfen oder wechseln Sie ihn in den BYOK-Einstellungen. Dieser Fehler tritt nur im Strict-Modus auf.
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.
Modell und Endpunkt
Modellsuch-, Lebenszyklus-, Preis-, Modalitäts- und Endpunktkompatibilitätsfehler.
Code
HTTP-Status
unknown_model400
invalid_model_id400
model_not_found404
model_retired410
model_endpoint_mismatch400
embedding_on_chat_endpoint400
model_not_priced400
invalid_modality_for_model400
Anfrage und Sicherheit
Ungültige Parameter, Kontext, Tools, Schemata und Inhaltssicherheitsverweigerungen.
Code
HTTP-Status
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
Bildgenerierung und -bearbeitung
Bildeingabe-, mehrteilige Bearbeitungs-, Ausgabe- und Bild-Pipeline-Fehler.
Code
HTTP-Status
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
Upstream-Routing
Sanitized Provider-Konnektivität, Authentifizierung, Drosselung und Verfügbarkeitsfehler.
Code
HTTP-Status
upstream_unreachable502
upstream_auth_failed502
upstream_rate_limited429
capacity_unavailable429
upstream_unavailable502/503
byok_key_invalid424
Inhaltsmoderation
Alle Anfragen werden automatisch geprüft, bevor sie an das Modell gesendet werden. Anfragen, die gegen unsere Nutzungsrichtlinien verstoßen, werden abgelehnt, bevor sie das Modell erreichen, und geben einen 403-Fehler zurück.
Kategorien, die blockiert werden
Die Moderation basiert auf unserer Acceptable Use Policy und blockiert vor allem folgende Inhaltskategorien:
Sexuell ausbeuterische Inhalte
Gewaltandrohungen
Anleitungen zu rechtswidrigen Handlungen
Inhalte im Zusammenhang mit biologischen Gefahren
403-Antwortformat
Eine durch Moderation blockierte Anfrage gibt einen Fehler in folgendem Format zurück:
1
2
3
4
5
6
7
{"error":{"message":"Your prompt was blocked by content moderation.","type":"invalid_request_error","code":"content_filter"}}
Blockierte Anfragen werden nicht abgerechnet — für eine abgelehnte Anfrage entstehen keine Kosten.
Einspruch bei Fehlalarmen
Wenn Sie glauben, dass eine Anfrage fälschlicherweise blockiert wurde, wenden Sie sich mit dem Zeitpunkt der Anfrage und (falls verfügbar) der Request-ID an den Support — wir prüfen den Fall.
Datenschutz
Jede Anfrage wird automatisch auf Einhaltung der Inhaltsrichtlinien geprüft.
Bei Anfragen, die als Verstoß eingestuft werden, wird der Inhalt als Nachweis für die Einhaltung der Richtlinien aufbewahrt.
Bei anderen Anfragen wird der vollständige Prompt-Inhalt nicht gespeichert.
Ratengrenzen, Budgets und Notbremsen
These controls can reject an otherwise valid request and require different recovery actions.
Control
HTTP-Status
So identifizieren Sie es
Anforderungsratenbegrenzung429Zeichenfolgen-Code oder numerischer Code 429; verwenden Sie die Header Retry-After und X-RateLimit-*.
Rate-Limit-Strafblock429Numerischer Code 429 und eine vorübergehende Einschränkungsnachricht; Verwenden Sie Retry-After.
Globale Ausgaben-Notbremse503Numerischer Code 503, Nachricht zum globalen Ausgabenlimit und Wiederholungsversuch nach 30 oder 300 Sekunden.
Scoped spend brake429Numeric code 429 and a spend circuit-breaker message naming the scope.
Abrechnungs- und Budgetkontrollen402Verwenden Sie die oben aufgeführten stabilen Abrechnungszeichenfolgencodes.
Fehlerhüllen unterscheiden sich je Endpunkt. Verwenden Sie HTTP-Status und, falls vorhanden, error.type. error.code kann ein String oder eine Zahl sein und fehlen; error.message dient nur der Anzeige.
Video- und Medienressourcenstatus
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-Richtlinie
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.
Wiederholen Sie den Vorgang mit Backoff
429, 502, 503, and 504. Check the original generation job before creating another after an ambiguous network failure.
Fix vor dem erneuten Versuch
400, 401, 402, 403, 404, 409, 410, 413, and 416. Fix the request, credentials, balance, permissions, resource state, or Range header first.
Fehlerbehandlung
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import random
import time
from openai import OpenAI, APIStatusError
client = OpenAI(
base_url="https://api.bazaarlink.ai/v1",
api_key="sk-bl-YOUR_API_KEY",
max_retries=0, # Avoid double retries; this example handles them.
)
RETRYABLE = {429, 502, 503, 504}
for attempt inrange(5):
try:
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Hello!"}],
)
breakexcept APIStatusError as error:
if error.status_code notin RETRYABLE or attempt == 4:
raise
retry_after = error.response.headers.get("Retry-After")
delay = (
float(retry_after)
if retry_after
elsemin(8, 0.5 * (2 ** attempt)) + random.uniform(0, 0.25)
)
time.sleep(delay)
Streaming-Fehlerformate
Fehler, die vor dem Streamen von Tokens auftreten, geben eine Standard-HTTP-Fehlerantwort mit einem JSON-Body zurück.
After a stream starts, the HTTP response is already 200. Parse each SSE data frame and treat a top-level error or choices[0].finish_reason === "error" as a failed, incomplete response.
Wenn ein Stream nach dem Start fehlschlägt, kann BazaarLink ein letztes SSE-Ereignis mit einem error-Objekt auf oberster Ebene senden, gefolgt von data: [DONE]. Behandeln Sie die Antwort als unvollständig und verwenden Sie Teilausgaben nicht als fertiges Ergebnis.
1
2
3
4
5
data: {"error":{"message":"The request could not be completed.","type":"upstream_error","code":502}}
data: [DONE]
// Branch on error.code; error.type can vary by failure path.
Versionierung
BazaarLink stellt einen einzigen stabilen API-Pfad bereit, /v1 — es gibt keine datumsgebundenen Versionen oder Versions-Header zu verwalten. Die API entwickelt sich fortlaufend weiter statt über nummerierte Releases.
Nicht-brechende Änderungen
Diese werden ohne vorherige Ankündigung veröffentlicht:
Neue Endpunkte
Neue Modelle im Katalog
Neue optionale Anfrageparameter
Neue Antwortfelder
Neue Schemas mit optionalen Feldern
Zusätzliche Antwortstatus-/Fehlercodes
Clients defensiv schreiben
Ignorieren Sie Antwortfelder, die Sie nicht kennen, und scheitern Sie nicht an unbekannten Werten in enum-artigen Feldern — neue kommen hinzu, wenn Katalog und Funktionsumfang wachsen.
Breaking Changes
Diese sind selten und umfassen:
Entfernen oder Umbenennen eines Endpunkts, Parameters oder Antwortfelds
Ändern des Typs eines Felds
Verpflichtendmachen eines optionalen Parameters
Wenn sie vorkommen, betrifft ein Breaking Change einen bestimmten Endpunkt statt der gesamten /api/v1-Oberfläche — es gibt keinen einzelnen Versionssprung, der alle Integrationen gleichzeitig brechen könnte. Wir veröffentlichen noch kein formelles Changelog mit einem Breaking-Tag (siehe „Aktuell bleiben" unten) — bei integrationskritischen Fällen wenden Sie sich vorab an den Support, statt sich auf undokumentiertes Verhalten zu verlassen.
Deprecation-Richtlinie
Das eine routinemäßige „Breaking"-Ereignis, mit dem Sie rechnen sollten: einzelne Modelle werden abgeschaltet, wenn Upstream-Anbieter sie deprecaten. Fragen Sie den aktuellen Status eines Modells über GET /v1/models ab.
1
2
3
4
5
6
7
GET https://api.bazaarlink.ai/v1/models
Authorization: Bearer sk-bl-YOUR_API_KEY
# A model within 30 days of its deprecation date shows in the catalog# with an "EOL" badge on the Models page. After the effective date it's# dropped from the catalog and calls return:# 410 { "error": { "type": "model_not_available", "code": "model_retired" } }
Aktuell bleiben
Wir veröffentlichen noch kein eigenes API-Changelog oder RSS-Feed. Prüfen Sie vorerst direkt diese Seite, verfolgen Sie den Status eines Modells über GET /v1/models, oder kontaktieren Sie den Support, wenn Sie für eine kritische Integration Vorlaufzeit benötigen.
Support
Support
Hi! How can we help you? Send a message and we'll get back to you soon.