BazaarLinkBazaarLink
Anmelden
DokumentationAPI-ReferenzSDK-ReferenzAgentic-NutzungKI-Skills

API-Referenz

Überblick über die BazaarLink API

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。

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

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

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

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

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

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

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

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

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

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

};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Strukturierte Ausgabe

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.

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

Optionale Header

Identifizieren Sie Ihre Anwendung in Request-Headern, um Nutzungsverfolgung, Dashboard-Sichtbarkeit und feinkörnige Analysen zu ermöglichen.

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

Assistant Prefill

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

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

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

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

Beendigungsgrund

finish_reason verwendet von BazaarLink normalisierte Werte wie stop, length, tool_calls, content_filter und error.

JSON
{
  "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.

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

Agent-Registrierung

Wenn aktiviert, können Agents über einen unbezahlten oder x402-bezahlten Registrierungsweg ein Konto erstellen.

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

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.

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

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
top_p
number
Nucleus-Sampling-Wahrscheinlichkeitsmasse. Standard: 1
top_k
integer
Sampling-Werte werden ohne Bereichsprüfung weitergegeben. Das Modell kann nicht unterstützte Werte begrenzen oder ignorieren.
frequency_penalty
number
Wiederholte Tokens bestrafen. Bereich: [-2, 2]. Standard: 0
presence_penalty
number
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.
response_format
object
Strukturierte JSON-Ausgabe erzwingen. Siehe Abschnitt Structured Output
structured_outputs
boolean
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.

Request-Schema (TypeScript)

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

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

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

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

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

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

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

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

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

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

};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Beispielanfrage

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

Antwort

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

Response-Schema (TypeScript)

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.

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

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

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

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

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

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.

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.

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.

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.

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)
# 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.

: keep-alive

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

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

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

event: done
data: {}

Unterstützte Bildmodelle

Model IDModalityi2i (edits)

Videogenerierung

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.

1. Job absenden (liefert sofort vjob_xxx)

POST/v1/videos
modelerforderlich
string
Modell-ID, z. B. bytedance/seedance-2.0
prompterforderlich
string
Text-Prompt
duration
integer
Dauer in Sekunden (modellabhängig)
resolution
string
Auflösung — 480p / 720p / 1080p usw.
generate_audio
boolean
Audiospur erzeugen (true/false)
frame_images
array
Erste/letzte Frame-Bilder (Bild-zu-Video, Keyframes). Objekte { type: "image_url", image_url: { url }, frame_type: "first_frame" | "last_frame" } oder einfache URL-Strings.
input_references
array
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.
curl https://api.bazaarlink.ai/v1/videos \
  -H "Authorization: Bearer $BL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "bytedance/seedance-2.0",
    "prompt": "a bird flying over mountains",
    "duration": 3,
    "resolution": "720p",
    "generate_audio": false
  }'
# → 202 { "id": "vjob_xxx", "status": "pending" }
Note
Beim Absenden werden Credits anhand einer Worst-Case-Schätzung reserviert. Nach Abschluss ist usage.cost der für diese Anfrage berechnete USD-Betrag.

2. Status pollen

GET/v1/videos/{id}
curl -H "Authorization: Bearer $BL_API_KEY" \
  https://api.bazaarlink.ai/v1/videos/vjob_xxx
Note
Jeder GET muss ≥ 8 s auseinanderliegen, um tatsächlich das Upstream zu erreichen (vermeidet Rate-Limits).
Note
Bei status=failed wird der gesamte reservierte Betrag an den Nutzer zurückerstattet.

3. Videoinhalt abrufen (MP4)

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

Gut zu wissen

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

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.

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

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

Audiotranskription

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.

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

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

Dokument-Neusortierung

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

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

Leitfaden zur Sprachsynthese (TTS)

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

ParameterTypErforderlichBeschreibung
modelstringJaID des Sprachmodells, z. B. elevenlabs/eleven-flash-v2.5.
inputstringJaZu 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.
voicestringJaZu verwendende Stimme; das Format hängt vom Modell ab. Siehe Stimmregeln unten.
response_formatstringNeinmp3 (Standard) oder pcm. opus, aac, flac und wav nimmt die API an, ElevenLabs-Modelle lehnen sie derzeit aber mit 400 ab.
speednumberNeinSprechgeschwindigkeit von 0.25 bis 4.0. Nicht jedes Modell wendet sie an.
instructionsstringNeinStilanweisungen für die Stimme. Nicht jedes Modell wendet sie an.
stabilitynumberNeinStabilitä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_boostnumberNeinÄhnlichkeit zur Originalstimme, 0–1 (Standard 0,75). Wird von Eleven v3 nicht verwendet.
stylenumberNeinStilübertreibung, 0–1 (Standard 0). Werte über 0 erhöhen die Latenz. Wird von Eleven v4 nicht verwendet.
use_speaker_boostbooleanNeinVerstärkt die Ähnlichkeit zum ursprünglichen Sprecher (Standard true); erhöht die Latenz leicht.
clone_strengthnumberNeinKlon-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_codestringNeinZweibuchstabiger Sprachcode in Kleinbuchstaben (ISO 639-1), z. B. ar, ja oder en, um die Sprechsprache festzulegen. Wird von multilingual-v2-Modellen nicht verwendet.
audio_effectsobjectNeinOptionales 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.

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

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.

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.

Beispiele

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

Häufige Fehler

StatusUrsache und Lösung
400Ungü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).
401API-Schlüssel fehlt oder ist ungültig. Senden Sie Authorization: Bearer mit Ihrem BazaarLink-Schlüssel.
402Guthaben reicht nicht aus. Aufladen und erneut versuchen.
403Ein Verwaltungsschlüssel kann keine Modelle aufrufen, oder das Konto ist gesperrt. Verwenden Sie einen regulären API-Schlüssel.
429Ratenlimit erreicht. Warten Sie gemäß Retry-After und versuchen Sie es erneut.
502Der Modelldienst ist vorübergehend nicht verfügbar oder die Audioübertragung wurde unterbrochen. Erneut versuchen; fehlgeschlagene Anfragen werden nicht berechnet.

Vollständige Parameterübersicht: Sprachsynthese

Leitfaden zur Audiotranskription

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

ParameterTypErforderlichBeschreibung
modelstringJaID des Transkriptionsmodells, z. B. elevenlabs/scribe-v2.
filefileJaAudiodatei (multipart). Unterstützt: wav, mp3, mp4, m4a, ogg, flac, webm, aac. Maximal 25 MiB. JSON-Clients können stattdessen input_audio: {data: base64, format} senden.
response_formatstringNeinjson (Standard) liefert {text}; verbose_json ergänzt Sprache, Dauer und segments/words.
languagestringNeinOptionaler Sprachhinweis wie en oder zh. Leer lassen für automatische Erkennung.
promptstringNeinOptionaler Kontext für Namen und Begriffe. Nicht jedes Modell wendet ihn an.
timestamp_granularities[]string[]Neinword 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.

Beispiele

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

Häufige Fehler

StatusUrsache und Lösung
400Ungültige Anfrage: model oder file fehlt, leeres Audio, response_format nicht json/verbose_json, stream=true (unsupported_parameter) oder timestamp_granularities nicht word/segment.
401API-Schlüssel fehlt oder ist ungültig.
402Guthaben reicht nicht aus. Aufladen und erneut versuchen.
413audio_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.
429Ratenlimit erreicht. Retry-After abwarten und erneut versuchen.
502Der Modelldienst ist vorübergehend nicht verfügbar oder die Audioübertragung wurde unterbrochen. Versuchen Sie es erneut; fehlgeschlagene Anfragen werden nicht berechnet.

Vollständige Parameterübersicht: Audiotranskription

Eigene Stimmen (Stimmklonen)

Eigene Stimmen (Stimmklonen)
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

FeldTypPflichtBeschreibung
namestringJaName der Stimme, 1–60 Zeichen.
filesfile[]Ja1 bis 5 Aufnahmen der Stimme (mp3, wav, m4a, ogg, flac, webm).
consentbooleanJaMuss true sein: Sie bestätigen, dass Sie diese Stimme klonen und verwenden dürfen (siehe Einwilligung).
consent_statement_versionstringJaDie Version der bestätigten Einwilligungserklärung. Aktuell "v1".
descriptionstringNeinOptional, bis zu 200 Zeichen.
remove_background_noisebooleanNeinOptionaler 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.

Beispiele

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

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

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

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

Eine Stimme melden

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.

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

Verantwortungsvolle Nutzung

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

StatusCodeBedeutung
400bad_requestFehlerhafte Anfrage: kein multipart/form-data, keine Audiodatei, description zu lang oder limit außerhalb von 1–100.
400consent_requiredconsent=true fehlt.
400consent_version_mismatchDie Version der Einwilligungserklärung ist veraltet; bestätigen Sie mit der aktuellen Version erneut.
400invalid_voice_nameDer Name ist leer, länger als 60 Zeichen oder nicht erlaubt.
400too_many_filesMehr als 5 Audiodateien.
401invalid_api_keyAPI-Schlüssel fehlt oder ist ungültig.
402insufficient_balanceGuthaben zu niedrig (Erstellungsgebühr oder Mindestguthaben).
403email_unverifiedBestätigen Sie zuerst Ihre E-Mail-Adresse.
403voice_cloning_not_enabledIhr Konto ist für eigene Stimmen noch nicht freigeschaltet; wenden Sie sich zum Beantragen an den Kundensupport.
403voice_cloning_disabledEigene Stimmen sind für diesen Dienst derzeit nicht aktiviert.
404voice_not_foundDiese Stimme gibt es nicht (oder sie gehört nicht Ihnen).
404not_foundNicht gefunden, einschließlich jeder /v1/voices-Anfrage, solange die Funktion für Ihr Konto nicht aktiviert ist.
405method_not_allowedDiese Methode ist auf diesem Pfad nicht verfügbar.
409duplicate_requestDerselbe Idempotency-Key wird noch verarbeitet; warten Sie und versuchen Sie es erneut.
413file_too_largeEine Datei ist größer als 10 MB oder alle Dateien zusammen größer als 25 MB.
415unsupported_file_typeAudiotyp nicht unterstützt; verwenden Sie mp3, wav, m4a, ogg, flac, webm.
422voice_rejectedDie 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.
429voice_create_rate_limitedTageslimit für Erstellungen erreicht; versuchen Sie es morgen (UTC) erneut.
429voice_limit_reachedSie haben die maximale Anzahl eigener Stimmen erreicht.
502upstream_failedDie Stimme konnte nicht erstellt werden; es wurde nichts berechnet. Versuchen Sie es mit einem neuen Idempotency-Key erneut.
503voice_capacity_fullDie Kapazität für eigene Stimmen ist vorübergehend erschöpft; es wurde nichts berechnet. Versuchen Sie es später erneut.
504upstream_timeoutDer 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

CodeTypErforderlichBedeutung
platformstringJaPlattform-ID aus dem Katalog, etwa twitter oder instagram.
actionstringJaVon der Plattform unterstützte Aktion; verfügbare Kombinationen finden Sie im Katalog.
paramsobjectNeinAktionsspezifische Eingaben. Verwenden Sie required_params und optional_params aus dem Katalog.
modesync | asyncNeinOptional. async gibt einen abzufragenden Job zurück; ausschließlich asynchrone Aktionen geben auch bei Auslassung einen Job zurück.

Antwortformat

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

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

Asynchrone Jobs

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.

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

HTTP 202

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

Asynchronen Job abfragen

GET/v1/data/jobs/{id}

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

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

Verfügbare Aktionen und Preise auflisten

GET/v1/data/catalog

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

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

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.

Fehlercodes

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

CodeHTTPBedeutung
unauthorized401API-Schlüssel fehlt oder ist ungültig.
forbidden403Anfrage ist nicht zulässig.
invalid_request400Ungültiger Anfragekörper.
invalid_params400Aktionsparameter wurden abgelehnt.
unsupported_capability400Plattform oder Aktion ist nicht verfügbar.
insufficient_credits402Nicht genügend Guthaben.
budget_cap_reached402 or policy statusAusgabenlimit des Kontos erreicht.
body_too_large413Anfragekörper überschreitet die Größenbegrenzung.
free_quota_exhausted432Tägliches kostenloses Kontingent aufgebraucht.
rate_limited429Ratenlimit erreicht; beachten Sie Retry-After.
data_unavailable503Datendienst ist vorübergehend nicht verfügbar.
timeout504Zeitüberschreitung der Anfrage.
bad_upstream_response502Datendienst hat eine ungültige Antwort geliefert.
job_expired410Job ist nach 15 Minuten abgelaufen.
not_found404Job unbekannt oder einem anderen Konto zugeordnet.
job_failed503Asynchroner Job ist fehlgeschlagen.
service_paused503Dienst ist noch nicht aktiviert oder pausiert.

Beispiele

curl

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

Python (requests)

import os
import requests

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

JavaScript (fetch)

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

Submit a decisions request

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

View the decisions API reference

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

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

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
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?"},
        ],
    }],
)

Vollständige API-Referenz →

PDF-Eingaben

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.

Unterstützte Formate

  • PDF-Dokumente (Text, Bilder, Tabellen, gescannt)
  • Base64-kodierte Daten-URL (`data:application/pdf;base64,...`)
  • Mehrseitige Dokumente
  • Nur passwortfreie PDFs
import base64

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

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

Responses API

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.
top_p
number
Nucleus-Sampling-Wahrscheinlichkeitsmasse. Standard: 1
tools
Tool[]
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.
response_format
object
Strukturierte JSON-Ausgabe erzwingen. Siehe Abschnitt Structured Output
previous_response_id
string
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.

Request-Schema (TypeScript)

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

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

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

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

Beispielanfrage

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.

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

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

Migration von Chat Completions

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.

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

POST/v1/messages
Note
Akzeptiert Bearer-Token oder X-API-Key-Header (Kompatibilität Anthropic SDK). Maximale Körpergröße: 10 MB.

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".
max_tokenserforderlich
integer
Maximale Anzahl zu generierender Token (positive ganze Zahl).
messageserforderlich
Message[]
Array von Konversationsnachrichten (nicht leer).
system
string
Optionale Systemaufforderung.
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.
top_p
number
Nucleus-Sampling-Wahrscheinlichkeitsmasse. Standard: 1
top_k
integer
Sampling-Werte werden ohne Bereichsprüfung weitergegeben. Das Modell kann nicht unterstützte Werte begrenzen oder ignorieren.
stop_sequences
string[]
Benutzerdefinierte Stoppsequenzzeichenfolgen.
tools
Tool[]
Liste der Tools (Funktionen), die das Modell aufrufen kann
tool_choice
string | object
Steuert die Tool-Nutzung: "auto", "none" oder bestimmtes Tool

Beispielanfrage

from anthropic import Anthropic

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

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

Antwort

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.

{
  "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.

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

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

Antwort

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

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

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.

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

Verfügbare Modelle (171)

Dies sind die derzeit auf BazaarLink verfügbaren Modelle, dynamisch aus unserer Datenbank geladen:

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

Alle Modelle durchsuchen auf der Modellseite.

Strukturierte Bewertungen (Jev)

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

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.

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

Fehlerantwort des Chat-Endpunkts

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.

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

Streaming

Setzen Sie stream: true um einen Server-Sent Events (SSE) Stream zu erhalten. Jedes Event enthält einen Teil der Antwort.

from openai import OpenAI

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

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

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

SSE-Format

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

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

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

data: [DONE]
Nutzung beim Streaming
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.

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

import OpenAI from "openai";

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

const controller = new AbortController();

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

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

// e.g. on a "Stop" button click:
controller.abort();
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).
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

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.

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

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

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.
import requests

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

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

Embedding-Modelle finden

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.
top_p
number
Nucleus-Sampling-Wahrscheinlichkeitsmasse. Standard: 1
top_k
integer
Sampling-Werte werden ohne Bereichsprüfung weitergegeben. Das Modell kann nicht unterstützte Werte begrenzen oder ignorieren.
frequency_penalty
number
Wiederholte Tokens bestrafen. Bereich: [-2, 2]. Standard: 0
presence_penalty
number
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
max_tokens
integer
Maximale Anzahl zu generierender Tokens
n
integer
Anzahl der zu generierenden Completions. Standard: 1
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.
response_format
object
Strukturierte JSON-Ausgabe erzwingen. Siehe Abschnitt Structured Output
structured_outputs
boolean
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.

GET/v1/credits
Auth
Benötigt Bearer-Token (Standard-API-Schlüssel sk-bl-...).

Beispielanfrage

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

Antwort

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

Errors: 401 (missing/invalid-Schlüssel), 403 (gesperrter Benutzer).

Generationsdetails

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.

GET/v1/generation?id=<generation-id>
Auth
Erfordert Bearer-Token (Standardschlüssel API). Erforderlicher Abfrageparameter: ID.

Beispielanfrage

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

Antwort

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

Errors: 400 (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).

GET/v1/key
Auth
Benötigt Bearer-Token (Standardschlüssel API).

Antwort

{
  "data": {
    "label": "Production Key",
    "limit": null,
    "limit_remaining": 100.00,
    "limit_reset": null,
    "expires_at": null,
    "is_free_tier": false,
    "is_management_key": false,
    "is_provisioning_key": false,
    "usage": 12.34,
    "usage_daily": 0.12,
    "usage_weekly": 0.45,
    "usage_monthly": 1.23,
    "requests": 1234,
    "requests_daily": 10,
    "requests_weekly": 50,
    "requests_monthly": 200,
    "rate_limit": { "requests": 600, "interval": "1m", "note": "Paid-tier rate limit." }
  }
}
Note
is_free_tier = 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.

Fehler: 401 (Authentifizierung), 404 (Benutzer fehlt – selten).

Fehlercodes

Fehlerantwortformat

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.

{
  "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:

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

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)

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.

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.

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.