BazaarLinkBazaarLink
Войти
ДокументацияAPI СсылкаSDK СсылкаАгентное использованиеAI Навыки

API Ссылка

Обзор BazaarLink от BazaarLink

BazaarLink предоставляет одну OpenAI-совместимую схему запросов и ответов для всех моделей и поставщиков, поэтому вы можете интегрировать один раз и переключать модели без переписывания приложения.

Поля маршрутизации клиента игнорируются
Поля provider (весь объект), transforms, route, service_tier верхнего уровня и preset удаляются перед отправкой upstream и не могут выбирать upstream или ценовой уровень. На эндпоинтах Chat Completions и Responses массив models поддерживается как локальный список резервных моделей: BazaarLink самостоятельно маршрутизирует каждую модель и применяет ее клиентскую цену; список не передается upstream. Суффиксы :nitro, :floor и :exacto, указанные клиентом, игнорируются. :eco остается экономичным тарифом BazaarLink и внутри преобразуется в BazaarLink :floor. :free остается отдельным вариантом модели в каталоге.
Дополнительная стоимость веб-поиска
Поведение веб-поиска через plugins, :online или web_search_options остается прежним, но может взиматься дополнительная плата upstream. Она списывается с ключа, использованного в запросе: платформенного ключа BazaarLink или вашего ключа BYOK.

OpenAPI Спецификация

Полная версия BazaarLink API документирована в спецификации OpenAPI. Вы можете получить к нему доступ в формате YAML или JSON:

Используйте эти спецификации с пользовательским интерфейсом Swagger, Postman или любым генератором кода, совместимым с OpenAPI, для изучения API или создания клиентских библиотек.

Запросы

Формат запроса на завершение работ

Тело запроса на завершение чата отправляется на следующую конечную точку:

POST/v1/chat/completions

Полный список поддерживаемых полей см. Параметры。

Схема запроса
// 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;
};

Структурированный вывод

Заставьте модель возвращать действительный JSON, соответствующий схеме. Это важно для создания надежных приложений, которые программно анализируют выходные данные модели.

  • json_object — базовый режим JSON; модель возвращает действительный JSON.
  • json_schema — режим строгой схемы; выходные данные модели должны соответствовать предоставленной схеме JSON.

Плагины

BazaarLink перенаправляет массив плагинов на выбранный восходящий маршрут. Доступность плагина зависит от выбранной модели и провайдера; веб-плагин также включен в варианте модели :online.

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

Дополнительные заголовки

Идентифицируйте свое приложение в заголовках запросов, чтобы обеспечить отслеживание использования, видимость информационной панели и детальную аналитику.

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 Предварительное заполнение

Добавьте частичное сообщение помощника в качестве последнего элемента, чтобы запросить продолжение маршрутов совместимой модели.

Как это работает
BazaarLink сохраняет и пересылает последнее сообщение помощника. Поведение продолжения реализуется выбранной восходящей моделью и поставщиком, поэтому оно не гарантируется на каждом маршруте.
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" }
  ]
});

Ответы

BazaarLink нормализует ответы завершения разных моделей и поставщиков в одну форму, совместимую с OpenAI.

Формат ответа на завершение

Поле выбора всегда представляет собой массив. Потоковые ответы используют дельту; непотоковые ответы используют message. Подробная информация об использовании и стоимости возвращается, когда она доступна.

Схема ответа
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 }>;
  };
};

Причина завершения

finish_reason использует нормализованные BazaarLink значения: stop, length, tool_calls, content_filter и error.

JSON
{
  "finish_reason": "stop"
}

Запрос стоимости и статистики

Используйте непрозрачный ID запроса BazaarLink из response id или заголовка x-request-id для GET /v1/generation; в нестриминговом ответе тот же ID есть в x-generation-id. Статистика может появиться через несколько секунд; повторяйте запрос при 404 недолго.

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

Регистрация агента

Когда функция включена, агент может создать аккаунт через неоплаченный или оплаченный x402 поток регистрации.

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

Неоплаченная регистрация принимает name, необязательные description и referral_code. Ответ 201 содержит API-ключ, кредиты, claim token со сроком семь дней, URL обновления, реферальный код, free_model auto:free, базовый URL и ссылку на документацию. Используется существующий механизм бесплатной модели; для бесплатного веб-поиска нужен подтверждённый email, поэтому неоплаченные агенты не могут им пользоваться.

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

Платная регистрация начинается с требований HTTP 402: scheme exact, network eip155:196, asset USD-T0 и payTo. Повторите запрос с заголовком X-PAYMENT, чтобы получить те же поля регистрации и payment { txHash, network, amountUsd }. Платные агенты следуют обычным правилам платного аккаунта; существующие аккаунты могут пополняться через /api/x402/topup.

Человек может принять неоплаченный аккаунт агента через /claim в течение семидневного срока действия token. Действует лимит одна регистрация на IP за 24 часа и лимиты облачного провайдера; отклонённые запросы возвращают 429 с Retry-After.

POSThttps://api.bazaarlink.ai/api/x402/topup

Chat Completions

Основная конечная точка. Совместим с OpenAI Chat Completions API.

POST/v1/chat/completions

Тело запроса

modelобязательно
string
Используйте id или alias из GET /v1/models, например "claude-sonnet-4.6" или "anthropic/claude-sonnet-4.6".
messagesобязательно
Message[]
Масив объектов сообщений с ролью и содержимым.
stream
boolean
Если true, возвращает поток событий, отправленных сервером. По умолчанию: ложь
temperature
number
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
max_tokens
integer
Максимальное количество токенов для генерации
max_completion_tokens
integer
Псевдоним для max_tokens (совместим с OpenAI серии o). Оба принимаются; то, что предусмотрено, вступает в силу
top_p
number
Масса вероятности выборки ядра. По умолчанию: 1
top_k
integer
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
frequency_penalty
number
Наказание повторяющихся токенов. Диапазон: [-2, 2]. По умолчанию: 0
presence_penalty
number
Назначать штрафы за токены в зависимости от присутствия. Диапазон: [-2, 2]. По умолчанию: 0
repetition_penalty
number
Уменьшить повторение входных токенов. Диапазон: (0, 2]. По умолчанию: 1.
min_p
number
Минимальная вероятность относительно верхнего токена. Диапазон: [0, 1]. По умолчанию: 0
top_a
number
Динамический топ-P на основе токена с наибольшей вероятностью. Диапазон: [0, 1]. По умолчанию: 0
seed
integer
Целочисленное начальное значение для детерминированной выборки. Не гарантируется для всех моделей
n
integer
Количество завершений, которые нужно сгенерировать. По умолчанию: 1
user
string
Идентификатор конечного пользователя для мониторинга и обнаружения злоупотреблений. На биллинг не влияет. Только модели семейства OpenAI — см. примечание ниже.
stop
string | string[]
Stop-последовательности — генерация останавливается при обнаружении
logit_bias
object
Сопоставьте идентификаторы токенов со значениями смещения [-100, 100], добавленными перед выборкой. Только модели семейства OpenAI — см. примечание ниже.
logprobs
boolean
Вернуть вероятности журнала для каждого выходного токена. Только модели семейства OpenAI — см. примечание ниже.
top_logprobs
integer
Количество наиболее вероятных токенов для каждой позиции (требуется logprobs: true). Диапазон: 0–20. Только модели семейства OpenAI — см. примечание ниже.
tools
Tool[]
Список инструментов (функций), которые может вызывать модель
tool_choice
string | object
Использование инструмента управления: «авто», «нет» или конкретный инструмент.
parallel_tool_calls
boolean
Включить параллельный вызов функций при наличии инструментов. По умолчанию: правда. Только модели семейства OpenAI — см. примечание ниже.
response_format
object
Force структурированный вывод JSON. См. раздел «Структурированный вывод».
structured_outputs
boolean
Запросите строгий вывод, соответствующий схеме JSON, у поставщиков, которые его поддерживают. Прошло как есть
reasoning
object
Конфигурация reasoning/thinking, специфичная для поставщика. Прошло как есть
reasoning_effort
string
OpenAI Усилие рассуждения в стиле o-серии: «низкое», «среднее» или «высокое». Прошло как есть
include_reasoning
boolean
true возвращает текст рассуждений в message.reasoning (при потоковой передаче — в delta.reasoning); false отключает рассуждения у моделей, которые рассуждают по умолчанию (см. раздел о рассуждениях), поэтому рассуждения не оплачиваются. Без reasoning_effort, reasoning и thinking по умолчанию рассуждают и возвращают текст только эти модели; остальные — только по запросу
user, logprobs, top_logprobs, logit_bias и Parallel_tool_calls поддерживаются только моделями семейства OpenAI.
Эти пять параметров удаляются из восходящего запроса всякий раз, когда решенная модель не распознается как собственная модель OpenAI — отправка их в anthropic/claude-*, google/gemini-* или любую другую цель, отличную от OpenAI, возвращает 200 с параметром. молча игнорируется, это не ошибка. Если вы устанавливаете один из них, а эффект не отображается, проверьте, является ли целевая модель OpenAI.

Схема запроса (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;
};

Пример запроса

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

Ответ

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

Схема ответа (TypeScript)

BazaarLink возвращает стандартизированный ответ и удаляет специфичные для upstream поля. usage.cost — сумма в USD, списанная с клиента за этот запрос.

Для запросов длительностью более 100 секунд рекомендуется использовать stream:true. Для нестриминговых запросов примерно через 12 секунд (значение по умолчанию, которое можно изменить в настройках развёртывания) сначала возвращается 200 и начинается отправка пробелов keepalive; если позже возникает ошибка, она возвращается как 200 + error JSON. Keepalive — это пробелы перед JSON-телом, которые стандартные JSON-парсеры игнорируют.

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

Генерация изображения

BazaarLink предлагает два пути создания изображений: (A) /v1/chat/дополнения с модальностями: ["image"] — собственный путь, поддерживает потоковую передачу SSE и смешанный вывод текста и изображений; рекомендуется для новых интеграций. (B) /v1/images/generations — OpenAI DALL·E-совместимая форма запроса, но ответы представляют собой потоки событий SSE (необходимы для медленных моделей, чтобы избежать тайм-аута восходящего потока в 100 секунд). Оба пути отправляют один и тот же протокол событий SSE — выбор конечной точки является исключительно предпочтением формы запроса. Изображение EDITING (изменение существующего изображения) использует POST /v1/images/edits — OpenAI images.edit совместим, multipart/form-data с вашими исходными изображениями. Модели с возможностью редактирования имеют модальность текст+изображение->изображение (например, qwen/qwen-image-3); Модели чистого поколения — это текст->изображение — проверьте модальность каждой модели в GET/v1/models.

Response format

/v1/images/generations возвращает OpenAI-совместимую синхронизацию JSON по умолчанию (с 25 июля 2026 г.) — client.images.generate() работает без оболочки. Passstream: значение true, чтобы вместо этого выбрать поток событий SSE, который обеспечивает прогресс для моделей с длительным временем генерации.

Непотоковые запросы, которые выполняются дольше 20 секунд, сначала получают ответ HTTP 200 (затем соединение поддерживается пробелами), поэтому более поздняя ошибка возвращается как «200 с телом ошибки»: проверяйте объект `error` верхнего уровня (мы также добавляем `"object": "error"` и `"http_status"`). Если таймаут чтения вашего клиента велик (SDK OpenAI по умолчанию ждут 10 минут), отправьте `X-BazaarLink-Sync-Wait: 90` (целые секунды, 1–90, по умолчанию 20), чтобы для ошибок в пределах этого времени получить настоящий код статуса; в Python SDK используйте `default_headers={"X-BazaarLink-Sync-Wait": "90"}`, в Node SDK — `defaultHeaders: { "X-BazaarLink-Sync-Wait": "90" }`. В Windows отправляйте JSON из файла в UTF-8 командой `curl --data-binary @body.json`: текст, набранный после `-d` в консоли, не в UTF-8 и сразу отклоняется с 400 `invalid_utf8`.

A. /v1/chat/completions (родной, рекомендуется)

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

Image-to-image: включите часть image_url в массив содержимого. Поддерживает URI данных или URL-адреса изображений https (http:// отклоняется), до 8 изображений, ~10 МБ на данные URI. Сообщение, содержащее изображения, также должно включать текстовую часть (инструкцию по редактированию). Некоторые модели дополнительно поддерживают image_config (например, {"strength": 0,7}, 0–1 — нижний уровень остается ближе к исходному изображению), передаваемый в восходящий поток как есть.

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

Редактирование изображений (совместимо с OpenAI)

POST/v1/images/edits

The OpenAI SDK client.images.edit() работает напрямую (многочастная загрузка, синхронизация ответа JSON, возвращающего данные: [{ url }]). Те же ограничения, что и при передаче изображения в изображение: до 8 изображений по 10 МБ каждое; маска и response_format=b64_json пока не поддерживаются.

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-совместимый)

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"
  }'
modelобязательно
string
Идентификатор модели, например. google/gemini-2.5-flash-image
promptобязательно
string
Текстовая подсказка
size
string
Размер вывода (сопоставляется автоматически)
n
integer
Количество изображений (по умолчанию 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 и неизвестные или ping-события; обрабатывайте описанные события image, usage и done.

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

Поддерживаемые модели изображений

Model IDModalityi2i (edits)

Создание видео

Асинхронный трехэтапный поток (отправка → опрос → контент). Генерация видео занимает от 30 с до 5 минут, что не соответствует синхронной форме завершения чата request/response — поэтому BazaarLink предоставляет его как выделенную конечную точку /v1/videos с использованием шаблона идентификатора задания: submit возвращает идентификатор vjob_* → статус опроса → извлекает байты по завершении. Вызов модели видео через /chat/completions или /images/generations возвращает 400 (код: error_endpoint_for_video). Счета рассчитываются по фактической стоимости использования, когда задание завершается.

Видео задания

Одна конечная точка охватывает несколько задач. Выбор запуска задачи определяется тем, какие поля вы отправляете — одна модель может выполнять преобразование изображения в видео, ключевые кадры и продолжение. Не каждая модель поддерживает все задачи; неподдерживаемый запрос возвращает 400.

Преобразование текста в видео
prompt
Генерируйте только из текстового приглашения — без входных данных.
Преобразование изображения в видео
frame_images: [ first frame ]
Ваше изображение ЯВЛЯЕТСЯ картинкой: оно становится первым кадром и анимируется, сохраняя верность оригиналу. Например. фотография кота → тот же кот поворачивает голову в той же сцене.
Ключевые кадры (первый + последний)
frame_images: [ first, last ]
Дайте начало и конец изображения; модель интерполирует движение между ними.
Продолжение
input_video
Расширить существующий клип. Запрошенная продолжительность должна быть больше длины исходного видео.
Ссылка на видео
input_references: [ images ]
Ваши изображения — это REFERENCES, а не кадры: модель сохраняет subject/style и генерирует совершенно новую сцену. Например. фото кота + «танцы в лесу» → новое видео, где кошачий взгляд сохранен, но сцена и движение новые (1–9 ссылок). Отличие от изображения к видео: i2v сохраняет точное изображение; r2v преобразует объект в новые кадры.
Видеомонтаж
input_video + prompt
Отредактируйте существующее видео — измените сцену, стиль или движение. Оплата производится за секунды ввода видео + секунды вывода.

1. Отправьте задание (немедленно возвращает vjob_xxx)

POST/v1/videos
modelобязательно
string
Идентификатор модели, например. bytedance/seedance-2.0
promptобязательно
string
Текстовая подсказка
duration
integer
Продолжительность в секундах (зависит от модели)
resolution
string
Разрешение — 480p/720p/1080p и т. д.
generate_audio
boolean
Создать звуковую дорожку (true/false)
frame_images
array
First/last изображения кадров (преобразование изображения в видео, ключевые кадры). Объекты { type: "image_url", image_url: {url},frame_type: "first_frame" | «last_frame» } или простые строки URL.
input_references
array
Справочные изображения для ссылок на видео — рекомендации subject/style, а не точные кадры.
input_video
string|object
Исходное видео URL для продолжения и редактирования видео. Должен быть общедоступным для восходящего потока.
aspect_ratio
string
Соотношение сторон, например 16:9 или 9:16. Игнорируется, когда входное изображение определяет соотношение.
watermark
boolean
Добавьте водяной знак. По умолчанию ложь.
callback_url
string
Webhook URL вызывается, когда задание достигает конечного состояния — только HTTPS, SSRF проверено. Нет подписи в v1; воспринимайте это как подсказку и подтвердите через GET /videos/{id}.
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
При отправке резервируются кредиты по оценке худшего случая. После завершения задания usage.cost показывает сумму в USD, списанную с клиента за запрос.

2. Статус опроса

GET/v1/videos/{id}
curl -H "Authorization: Bearer $BL_API_KEY" \
  https://api.bazaarlink.ai/v1/videos/vjob_xxx
Note
Каждый GET должен находиться на расстоянии ≥ 8 с, чтобы фактически попасть в восходящий поток (что позволяет избежать ограничений скорости).
Note
При статусе=failed пользователю возвращается полная сумма резерва.

3. Загрузите видеоконтент (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

Полезно знать

  • Разрешенные разрешения различаются в зависимости от модели: неподдерживаемое значение возвращает 400 со списком поддерживаемых.
  • Вход images/videos должен быть доступен из общедоступного URL. Хосты, защищенные хотлинками (например, некоторые вики), выходят из строя.
  • Входящие медиафайлы проходят модерацию исходного контента и иногда могут быть отклонены.
  • Для продолжения запрошенная продолжительность должна превышать длину исходного видео.
  • Соотношение сторон вывода соответствует входному изображению: квадратное изображение дает квадратное видео.
  • Видеомонтаж оплачивается по секундам входного видео плюс секунды сгенерированного выходного видео.
  • input_video (редактирование/продолжение) должен быть PUBLIC URL. Видео, которые вы создаете здесь, обслуживаются с помощью вашего ключа API, поэтому восходящий поток не может их получить — разместите исходное видео на общедоступном URL.
  • Полезные данные вебхука не имеют знака — проверьте status/amount через GET /videos/{id}, прежде чем действовать, и обратите внимание, что unsigned_urls являются абсолютными (в отличие от относительных путей в ответе на опрос).

Поддерживаемые видеомодели

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

Синтез речи

Преобразует текст в аудио по ID модели из /v1/models?output_modalities=speech. Оплата — по цене за миллион символов на странице модели. Аудио полностью буферизуется и затем возвращается бинарными данными; пошаговая потоковая выдача не поддерживается. Поля управления маршрутизацией provider, transforms, route, service_tier и preset игнорируются.

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

Транскрибация аудио

Отправьте multipart/form-data model и file или JSON model и input_audio:{data,format} (сырой base64). Форматы: wav, mp3, mp4, m4a, ogg, flac, webm, aac. Аудио: максимум 25 MiB; тело запроса: 50 MiB. audio.transcription_max_seconds_by_model задаёт лимит для модели; при отсутствии используется audio.transcription_max_seconds, затем значение по умолчанию 60 секунд. Более длинное аудио отклоняется до обработки с кодом 413 audio_too_long и не оплачивается. response_format: json или verbose_json; timestamp_granularities word/segment требует verbose_json. stream не поддерживается (400 unsupported_parameter); слишком большое аудио: 413 audio_too_large. provider игнорируется. Цены базы данных за usage.seconds или входные/выходные token; цена минуты = 60 × цена секунды. usage.cost — сумма клиента в 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"]}'

Переранжирование документов

query и documents возвращают ранжированные index и relevance_score. Единица оплаты — search: цена модели умножается на usage.search_units, а не на число документов. Потоковая передача (stream) не поддерживается.

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 или input_audio в /v1/chat/completions и выберите аудиомодель. Настроенные ставки входных и выходных токенов единообразно применяются ко всем учтённым текстовым и аудиотокенам.

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

Руководство по синтезу речи (TTS)

POST /v1/audio/speech совместим с OpenAI-compatible форматом: отправьте JSON и получите аудиофайл в бинарном виде. Семейство ElevenLabs включает elevenlabs/eleven-v4, eleven-v4-turbo, eleven-v3, eleven-v3-conversational, eleven-multilingual-v2, eleven-flash-v2.5, eleven-flash-v2, eleven-turbo-v2.5, eleven-turbo-v2. Актуальный список: GET /v1/models?output_modalities=speech. GET /v1/models по умолчанию возвращает только текстовые модели; добавьте ?output_modalities=speech (или all), чтобы увидеть список.

POST/v1/audio/speech

Параметры

ПараметрТипОбязателенОписание
modelstringДаID модели речи, например elevenlabs/eleven-flash-v2.5.
inputstringДаТекст для синтеза: до 4 096 символов на запрос (10 000 для elevenlabs/eleven-v4 и eleven-v4-turbo). Более длинный текст разбейте на несколько запросов.
voicestringДаИспользуемый голос; формат зависит от модели. См. правила выбора голоса ниже.
response_formatstringНетmp3 (по умолчанию) или pcm. opus, aac, flac и wav API принимает, но модели ElevenLabs сейчас отклоняют их с 400.
speednumberНетСкорость речи от 0.25 до 4.0. Не каждая модель применяет её.
instructionsstringНетУказания по стилю голоса. Не каждая модель применяет их.
stabilitynumberНетСтабильность голоса, 0–1 (по умолчанию 0,5). Ниже — выразительнее, выше — ровнее. Действует для моделей elevenlabs/*, когда запрос обслуживается нашим прямым голосовым маршрутом; заголовок ответа X-Voice-Settings сообщает applied или ignored.
similarity_boostnumberНетСходство с исходным голосом, 0–1 (по умолчанию 0,75). Eleven v3 не использует.
stylenumberНетУсиление стиля, 0–1 (по умолчанию 0). Значения выше 0 увеличивают задержку. Eleven v4 не использует.
use_speaker_boostbooleanНетУсиливает сходство с исходным говорящим (по умолчанию true); немного увеличивает задержку.
clone_strengthnumberНетСила клона, 0–1 (для большинства голосов рекомендуется 0). Только для ваших собственных профессиональных клонов (voice_…), обученных для Eleven v4.
language_codestringНетДвухбуквенный код языка строчными буквами (ISO 639-1), например ar, ja или en, чтобы задать язык озвучивания. Модели multilingual-v2 не используют.
audio_effectsobjectНетНеобязательный объект аудиоэффектов: filter_preset_id (фильтр, например phone, old_radio), environment_id (реверберация, например small_room, hall), background_noise_id (например cafe), distance (0–1), send_level (уровень реверберации, 0–1) и pan (−1…1). ID — строчные буквы, цифры и подчёркивания; без доплаты. Реверберация или pan не равный 0 дают стерео и несовместимы с выводом pcm.

Семь настроек голоса выше необязательны; если их не указывать, ничего не меняется. Значение вне диапазона даёт 400 и не отправляется и не тарифицируется. Заголовок ответа X-Voice-Settings показывает, были ли использованы ваши настройки: applied — использованы; ignored — ответил резервный маршрут, поэтому настройки не использованы (аудио всё равно создаётся); нет заголовка — вы не передавали настроек голоса. Пример: stability 0 читает выразительнее, 1 — ровнее.

Правила выбора голоса

Модели ElevenLabs (elevenlabs/…) принимают одно из этих имён голосов (регистр не важен): george, sarah, adam, alice, bella, bill, brian, callum, charlie, chris, daniel, eric, harry, jessica, laura, liam, lily, matilda, river, roger, will. Для моделей ElevenLabs voice можно опустить (по умолчанию george). Любое другое значение даёт 400 invalid_voice. Ваш собственный голос (voice_…) описан в разделе «Собственные голоса» ниже.

Имена голосов OpenAI-style, например alloy, echo или nova, работают только с моделями, где они перечислены. Проверьте голоса на странице модели.

Собственные голоса (клонирование) открываются поэтапно: см. раздел «Собственные голоса» ниже (POST /v1/voices). Пока они не включены для вашего аккаунта, используйте одно из 21 готовых имён выше или публичный voice ID.

alloy не работает с моделью ElevenLabs
Если модель ElevenLabs получает голос, который не является voice ID и не входит в поддерживаемые имена (например alloy или Rachel), она возвращает 400 invalid_voice, а сообщение перечисляет допустимые имена. За неудачные запросы плата не взимается.

Встроенные голоса

Укажите в voice одно из имён ниже (строчными буквами). У каждого голоса есть короткий собственный пример, а GET /api/v1/audio/voices возвращает полный список (пол, возрастная группа, акцент, стиль и ссылки на примеры).

?lang= (en, zh-TW, zh-CN; по умолчанию Accept-Language) выбирает только язык description. Ссылки на примеры от него не зависят: preview_urls.en (то же, что preview_url) — английский клип, preview_urls.zh (то же, что preview_url_zh) — китайский.

ГолосОписаниеПрослушать
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.

Теги эмоций и действий (audio tags)

Пишите теги в квадратных скобках прямо в input, например [laughs], [whispers], [excited], [sighs], [crying], [curious] или [softly]. Теги передаются модели в точности как набраны и задают манеру произнесения следующих слов. Даже если текст не на английском, оставляйте теги на английском.

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

Поддерживаются моделью elevenlabs/eleven-v3 и семейством elevenlabs/eleven-v4. Другие модели речи не интерпретируют теги и могут прочитать скобки вслух, поэтому сначала проверьте короткую фразу.

Теги входят в число символов input и тарифицируются так же, как остальной текст.

Форматы вывода

Если response_format опущен, используется mp3 (Content-Type audio/mpeg); pcm (audio/pcm, сырой 16-bit PCM) тоже работает. API принимает opus, aac, flac и wav, но модели ElevenLabs сейчас отклоняют их с 400. Сохраняйте файл по заголовку Content-Type ответа.

Стоимость

Синтез речи оплачивается по числу символов ввода. Цена за символ указана на странице модели в /models и в GET /v1/models как pricing.character. На странице модели она показана за миллион символов.

Примеры

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

Частые ошибки

СтатусПричина и решение
400Неверный запрос: нет model, input или voice; input длиннее 4 096 символов; speed вне 0.25–4.0; неподдерживаемый response_format; Unknown voice; unknown_model (проверьте ID в /models).
401Ключ API отсутствует или недействителен. Отправьте Authorization: Bearer с ключом BazaarLink.
402Недостаточно средств. Пополните баланс и повторите запрос.
403Административный ключ не может вызывать модели либо учётная запись заблокирована. Используйте обычный ключ API.
429Превышен лимит запросов. Подождите согласно Retry-After и повторите.
502Сервис модели временно недоступен или передача аудио прервалась. Повторите запрос; неудачные запросы не оплачиваются.

Полный справочник параметров: Синтез речи

Руководство по транскрибации аудио

POST /v1/audio/transcriptions совместим с OpenAI-compatible форматом: загрузите аудио через multipart/form-data или отправьте base64 input_audio в JSON и получите текст. Доступны elevenlabs/scribe-v2 и elevenlabs/scribe-v2-medical. Актуальный список: GET /v1/models?output_modalities=transcription. GET /v1/models по умолчанию возвращает только текстовые модели; добавьте ?output_modalities=transcription (или all), чтобы увидеть список.

POST/v1/audio/transcriptions

Параметры

ПараметрТипОбязателенОписание
modelstringДаID модели транскрибации, например elevenlabs/scribe-v2.
filefileДаАудиофайл (multipart). Поддерживаются wav, mp3, mp4, m4a, ogg, flac, webm, aac; максимум 25 MiB. Клиент JSON может отправить input_audio: {data: base64, format}.
response_formatstringНетjson (по умолчанию) возвращает {text}; verbose_json добавляет язык, длительность и segments/words.
languagestringНетНеобязательная подсказка языка, например en или zh. Пустое значение включает автоопределение.
promptstringНетНеобязательный контекст для распознавания имён и терминов. Применяется не каждой моделью.
timestamp_granularities[]string[]Нетword и/или segment. Применяется только с response_format=verbose_json; иначе игнорируется. Временные метки на уровне слов пока не возвращаются; segments возвращаются.

Форматы вывода

response_format принимает только json или verbose_json (text, srt и vtt не поддерживаются). stream не поддерживается. Длительность ограничена для каждой модели, по умолчанию 60 секунд. Более длинное аудио отклоняется до обработки с кодом 413 audio_too_long и не оплачивается. Разделите длинную запись.

Стоимость

Транскрибация оплачивается за секунду аудио. Цена за секунду указана на странице модели в /models и в GET /v1/models как pricing.second; цена за минуту в 60 раз выше. В ответе usage показаны оплачиваемые секунды, а usage.cost — сумма списания.

Примеры

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"

Частые ошибки

СтатусПричина и решение
400Неверный запрос: отсутствует model или file, пустое аудио, response_format не json/verbose_json, stream=true (unsupported_parameter) либо timestamp_granularities не word/segment.
401Ключ API отсутствует или недействителен.
402Недостаточно средств. Пополните баланс и повторите запрос.
413audio_too_large: декодированное аудио превышает 25 MiB. audio_too_long: аудио превышает лимит модели (по умолчанию 60 секунд), отклоняется до обработки и не оплачивается. Сожмите или разделите файл.
429Превышен лимит запросов. Подождите согласно Retry-After и повторите.
502Сервис модели временно недоступен или передача аудио прервалась. Повторите запрос; неудачные запросы не оплачиваются.

Полный справочник параметров: Транскрибация аудио

Собственные голоса (клонирование голоса)

Собственные голоса (клонирование голоса)
Доступно только по заявке. Собственные голоса открываются для каждого аккаунта отдельно: для заявки обратитесь в службу поддержки. Пока аккаунт не включён, любой запрос /v1/voices отвечает 403 voice_cloning_not_enabled (и 404 not_found, пока функция выключена для всех). Лимиты и цена на этой странице — значения по умолчанию и могут измениться.

Загрузите короткую запись голоса, который вы вправе использовать, и получите наш идентификатор голоса (voice_…). Передайте его как voice в POST /v1/audio/speech. Голосом может пользоваться только тот, кто его создал.

Эндпоинты

POST/v1/voices

Создать голос (multipart/form-data)

GET/v1/voices

Список ваших голосов (limit 1–100, after = id голоса для следующей страницы)

GET/v1/voices/{id}

Получить один из ваших голосов

DELETE/v1/voices/{id}

Удалить голос (действует сразу)

POST/v1/voices/report

Пожаловаться на голос (ключ API не нужен)

Создание голоса: поля

ПолеТипОбязательноОписание
namestringДаНазвание голоса, 1–60 символов.
filesfile[]ДаОт 1 до 5 файлов с записью этого голоса (mp3, wav, m4a, ogg, flac, webm).
consentbooleanДаДолжно быть true: вы подтверждаете, что вправе клонировать и использовать этот голос (см. «Согласие»).
consent_statement_versionstringДаВерсия заявления о согласии, которое вы подтверждаете. Сейчас "v1".
descriptionstringНетНеобязательно, до 200 символов.
remove_background_noisebooleanНетНеобязательный boolean, по умолчанию false. Убирает фоновый шум в образцах перед клонированием.

Запрос синхронный: ответ 201 означает, что голос готов к использованию. Передайте заголовок Idempotency-Key (любая уникальная строка) и используйте тот же при повторе, чтобы повтор никогда не создавал и не тарифицировал второй голос.

Ответ

201 с полями id (voice_…), object ("voice"), name, description, status ("ready"), created_at (секунды Unix) и usage.cost_usd (списанная плата за создание). Другие сведения о том, как создаётся голос, за пределы наших систем не передаются.

GET /v1/voices возвращает только ваши голоса: { "object": "list", "data": [ … ], "has_more": false }. На id чужого голоса приходит 404 voice_not_found — так же, как на несуществующий id.

GET /v1/voices/{id} возвращает один голос (те же поля, без usage).

DELETE /v1/voices/{id} возвращает { "id": "voice_…", "object": "voice", "deleted": true } и действует сразу: запросы речи с этим голосом сразу завершаются ошибкой. Удаление бесплатно; плата за создание не возвращается.

Лимиты (по умолчанию)

  • До 3 голосов на человека.
  • От 1 до 5 аудиофайлов на голос, не более 10 МБ каждый и 25 МБ суммарно; форматы: mp3, wav, m4a, ogg, flac, webm. Лучше всего работает от 30 секунд до 5 минут чистой речи в сумме.
  • До 3 созданий в сутки (сутки по UTC).
  • Нужен аккаунт с подтверждённой электронной почтой и балансом не менее US$5.
  • Названия и описания, имитирующие публичных людей или звучащие как официальные голоса и голоса сотрудников, отклоняются (invalid_voice_name).
  • Записи используются только для создания голоса, мы их не храним. Мы сохраняем название голоса, владельца, запись о согласии и отметки времени.

Цена

Создание голоса стоит разовую плату (по умолчанию US$1.00); списанная сумма возвращается в usage.cost_usd, и плата берётся только если голос успешно создан. Использование собственного голоса в синтезе речи стоит столько же за символ, сколько другие голоса этой модели. Удаление бесплатно.

Согласие

При каждом создании нужно передавать consent=true и consent_statement_version="v1". Если заявление обновится, создание ответит 400 consent_version_mismatch, и вы подтвердите согласие заново с новой версией.

Черновик заявления, которое вы подтверждаете (окончательная формулировка проверяется и может измениться):

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.

Использование собственного голоса

Передайте id голоса как voice в POST /v1/audio/speech (voice=voice_…) вместе с речевой моделью семейства elevenlabs/*. Лимит ввода, форматы и цена за символ — как у модели. Id, которого нет, который удалён или заблокирован либо принадлежит другому человеку, получает ответ 400 invalid_voice; собственный голос нельзя использовать с другими моделями.

Примеры

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

Жалоба на голос

Если голос без разрешения имитирует вас или другого человека, сообщите: POST /v1/voices/report (ключ API не нужен) с JSON-телом из voice_id (voice_…) или sample_url, reason (impersonation, fraud, harassment, minor, political или other) и необязательных details и contact (адрес электронной почты). Всегда отвечает 202. Мы рассматриваем жалобы и удаляем голоса, нарушающие правила; аккаунты могут быть заблокированы.

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

Ответственное использование

Не клонируйте голоса публичных людей, знаменитостей, политиков и тех, кто не дал согласия. Не используйте клонированный голос, чтобы люди думали, что говорят с настоящим человеком, а также для обмана, преследования, политического убеждения или мошенничества.

Ошибки

СтатусКодЗначение
400bad_requestНекорректный запрос: не multipart/form-data, нет аудиофайла, слишком длинный description или limit вне диапазона 1–100.
400consent_requiredОтсутствует consent=true.
400consent_version_mismatchВерсия заявления о согласии устарела; подтвердите заново с текущей версией.
400invalid_voice_nameНазвание пустое, длиннее 60 символов или недопустимо.
400too_many_filesБольше 5 аудиофайлов.
401invalid_api_keyКлюч API отсутствует или недействителен.
402insufficient_balanceНедостаточно средств (плата за создание или минимальный баланс).
403email_unverifiedСначала подтвердите адрес электронной почты.
403voice_cloning_not_enabledДля вашего аккаунта собственные голоса ещё не включены; для заявки обратитесь в службу поддержки.
403voice_cloning_disabledСобственные голоса сейчас не включены для этого сервиса.
404voice_not_foundТакого голоса нет (или он не ваш).
404not_foundНе найдено, включая любой запрос /v1/voices, пока функция не включена для вашего аккаунта.
405method_not_allowedЭтот метод недоступен для данного пути.
409duplicate_requestТот же Idempotency-Key всё ещё обрабатывается; подождите и повторите.
413file_too_largeФайл больше 10 МБ или все файлы вместе больше 25 МБ.
415unsupported_file_typeТип аудио не поддерживается; используйте mp3, wav, m4a, ogg, flac, webm.
422voice_rejectedПроверка провайдера голоса не приняла образец (например, известный или встроенный голос либо известный голос, синтезированный ИИ). Голос не сохраняется, плата не списана. Используйте чёткую запись своего голоса или голоса, который вы вправе использовать.
429voice_create_rate_limitedДостигнут суточный лимит созданий; повторите завтра (UTC).
429voice_limit_reachedВы достигли максимального числа собственных голосов.
502upstream_failedГолос не удалось создать; плата не списана. Повторите с новым Idempotency-Key.
503voice_capacity_fullЛимит собственных голосов сейчас исчерпан; плата не списана. Повторите позже.
504upstream_timeoutСервис голоса не ответил вовремя; плата не списана. Повторите с тем же Idempotency-Key.

API данных

Скоро — Общедоступные социальные и коммерческие данные через три эндпоинта BazaarLink. Сервис по умолчанию отключён. До его включения запросы будут возвращать service_paused.

Отправить запрос социальных данных

POST/v1/data/social

Параметры запроса

КодТипОбязательноЗначение
platformstringДаID платформы из каталога, например twitter или instagram.
actionstringДаДействие, поддерживаемое этой платформой; доступные сочетания указаны в каталоге.
paramsobjectНетВходные данные для действия. Используйте required_params и optional_params из каталога.
modesync | asyncНетНеобязательно. async возвращает задачу для опроса; действия только с асинхронным режимом возвращают задачу даже без этого параметра.

Формат ответа

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

Асинхронные задачи

Асинхронное действие или mode async возвращает HTTP 202 с непрозрачным ID задачи. Опросите GET /v1/data/jobs/{id}: HTTP 202 означает ожидание, а HTTP 200 возвращает завершённый ответ data.social. Задача истекает через 15 минут (HTTP 410 job_expired). Неизвестные задачи и задачи другого аккаунта возвращают HTTP 404 not_found. Завершённая задача оплачивается один раз при первом успешном получении.

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

HTTP 202

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

Опросить асинхронную задачу

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

Список доступных действий и цен

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

Оплата

Цены зависят от платформы и действия и распределены по уровням. GET /v1/data/catalog показывает цену для клиента за каждое доступное действие. Успешный вызов оплачивается один раз; неудачные вызовы и вызовы без результатов бесплатны. Data API и веб-поиск используют общую ежедневную бесплатную квоту.

Коды ошибок

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

КодHTTPЗначение
unauthorized401API key отсутствует или недействителен.
forbidden403Запрос не разрешён.
invalid_request400Недопустимое тело запроса.
invalid_params400Параметры действия отклонены.
unsupported_capability400Платформа или действие недоступны.
insufficient_credits402Недостаточно кредитов.
budget_cap_reached402 or policy statusДостигнут лимит расходов аккаунта.
body_too_large413Тело запроса превышает допустимый размер.
free_quota_exhausted432Ежедневная бесплатная квота исчерпана.
rate_limited429Достигнут лимит запросов; соблюдайте Retry-After.
data_unavailable503Сервис данных временно недоступен.
timeout504Время ожидания запроса истекло.
bad_upstream_response502Сервис данных вернул недопустимый ответ.
job_expired410Срок действия задачи истёк через 15 минут.
not_found404Задача не найдена или принадлежит другому аккаунту.
job_failed503Асинхронная задача завершилась ошибкой.
service_paused503Сервис ещё не включён или приостановлен.

Примеры

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

Видеовходы

Отправляйте видеофайлы на модели, поддерживающие видеовход, для анализа, создания субтитров или вопросов о сценах и событиях. Работает с прямыми данными URL или базовыми данными URI — URL более эффективен для общедоступного видео; base64 предназначен для локальных файлов или частного видео.

Поддерживаемые форматы

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

Полная ссылка на API →

PDF Входы

Отправляйте документы PDF непосредственно в сообщениях для моделей, которые изначально поддерживают ввод PDF (например, Claude, Gemini). BazaarLink перенаправляет файл прямо в модель — тарифицируется как обычные входные токены, без дополнительной оплаты или этапа обработки.

Поддерживаемые форматы

  • PDF документы (текст, изображения, таблицы, сканированные) Данные в кодировке
  • Base64 URL (`data:application/pdf;base64,...`)
  • Многостраничные документы
  • Только PDF-файлы без пароля
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

An OpenAI Ответы Конечная точка, совместимая с API, для многоповоротных диалогов без сохранения состояния, вызова инструментов и мультимодальных входных данных. Идеально подходит для агентов и платформ, которые используют OpenAI Python SDK ≥ 1.x с client.responses.create().

POST/v1/responses
Note
Принимает ту же аутентификацию и модель маршрутизации, что и Chat Completions.

Тело запроса

modelобязательно
string
Используйте id или alias из GET /v1/models, например "claude-sonnet-4.6" или "anthropic/claude-sonnet-4.6".
inputобязательно
string | Item[]
User input — простая строка (одиночное сообщение) или массив элементов ввода для многооборотных/мультимодальных разговоров.
instructions
string
Инструкции системного уровня, эквивалентные системному сообщению. Необходимо отправлять повторно при каждом запросе.
stream
boolean
Если true, возвращает события потока ответов API SSE. Типы событий: ответ.создан, ответ.выходной_текст.дельта, ответ.завершено.
max_output_tokens
integer
Максимальное количество создаваемых выходных токенов (включая логические токены для моделей серии O). Определения
temperature
number
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
top_p
number
Масса вероятности выборки ядра. По умолчанию: 1
tools
Tool[]
Tool (функции) — тот же формат схемы JSON, что и Chat Completions (принимает как плоскую форму ответов, так и вложенную форму). Собственные встроенные размещенные инструменты OpenAI (web_search_preview, file_search, Computer_use_preview) не поддерживаются; веб-поиск доступен через плагины: [{id:"web"}] — поддерживается только на некоторых маршрутах модели.
tool_choice
string | object
Использование инструмента управления: «авто», «нет» или конкретный инструмент.
parallel_tool_calls
boolean
Включить параллельный вызов функций при наличии инструментов. По умолчанию: правда. Только модели семейства OpenAI — см. примечание ниже.
response_format
object
Force структурированный вывод JSON. См. раздел «Структурированный вывод».
previous_response_id
string
Эта конечная точка не имеет состояния — при передаче ненулевого значения немедленно возвращается 400 (invalid_prompt), оно никогда не принимается и игнорируется. Вместо этого используйте режим без сохранения состояния: передайте полную историю разговоров во входной массив.

Схема запроса (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" };

Пример запроса

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

Формат ответа

BazaarLink возвращает стандартизованный ответ и удаляет поля, специфичные для апстрима. Непрозрачный ID запроса BazaarLink в ответе совпадает с x-request-id; используйте его с GET /v1/generation. Нестриминговые ответы также возвращают тот же ID в x-generation-id. usage.cost — сумма в USD, списанная с клиента. Статистика может появиться через несколько секунд после завершения; при 404 ненадолго повторите запрос.

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

Миграция с Chat Completions

Замените сообщения входными данными (строкой или массивом), используйте инструкции вместо сообщения системной роли и прочитайте выходные данные[0].content[0].text вместо choice[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

Ограничения

  • previous_response_id или store: true отклоняется с кодом 400 (код ошибки valid_prompt) — не принимается и игнорируется. Всегда используйте режим без сохранения состояния: передавайте полную историю разговоров во входной массив. Собственные встроенные размещенные инструменты
  • OpenAI (web_search_preview, file_search, Computer_use_preview) не поддерживаются. Веб-поиск доступен через плагины: [{id:"web"}] — поддерживается только на некоторых маршрутах модели.
  • background: true принимается, но игнорируется — каждый запрос выполняется синхронно до завершения.

Messages (Anthropic)

Anthropic-совместимый Messages API для Claude SDK. Укажите в SDK адрес BazaarLink и используйте API-ключ BazaarLink; поля ответа и метаданные биллинга соответствуют контракту BazaarLink, описанному ниже.

POST/v1/messages
Note
Принимает токен носителя или заголовок x-api-key (совместимость с Anthropic SDK). Максимальный размер тела: 10 МБ.

Тело запроса

modelобязательно
string
Используйте id или alias из GET /v1/models, например "claude-sonnet-4.6" или "anthropic/claude-sonnet-4.6".
max_tokensобязательно
integer
Максимальное количество токенов для генерации (положительное целое число).
messagesобязательно
Message[]
Масив сообщений диалога (непустой).
system
string
Дополнительная системная подсказка.
stream
boolean
Если true, возвращает поток событий, отправленных сервером. По умолчанию: ложь
temperature
number
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
top_p
number
Масса вероятности выборки ядра. По умолчанию: 1
top_k
integer
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
stop_sequences
string[]
Пользовательские строки последовательности остановки.
tools
Tool[]
Список инструментов (функций), которые может вызывать модель
tool_choice
string | object
Использование инструмента управления: «авто», «нет» или конкретный инструмент.

Пример запроса

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)

Ответ

BazaarLink возвращает стандартизованный ответ и удаляет поля, специфичные для апстрима. Непрозрачный ID запроса BazaarLink в ответе совпадает с x-request-id; используйте его с GET /v1/generation. Нестриминговые ответы также возвращают тот же ID в x-generation-id. usage.cost и usage.bz_cost содержат одну и ту же сумму в USD, списанную с клиента. Статистика может появиться через несколько секунд после завершения; при 404 ненадолго повторите запрос.

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

Формат конверта ошибки зависит от типа сбоя. Ориентируйтесь на HTTP-статус и error.type, если он есть; error.code может быть строкой, числовым HTTP-статусом или отсутствовать. Рекомендации по обработке см. в разделе об ошибках.

Модели

Перечислите все доступные модели с информацией о ценах и возможностях. Для этой конечной точки аутентификация не требуется.

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"

Ответ

{
  "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
  }[];
};

Многоуровневое ценообразование на входную длину

Некоторые модели переключаются на другую таблицу цен, когда запрос превышает порог токена — меняется вся таблица, а не только токены выше порога. Пороговые значения строгие: приглашение с ровно N жетонами по-прежнему выставляет счета на уровне ниже N; более высокий уровень применяется только тогда, когда входные токены больше N.

pricing_tiers — это аналог ценообразования, который присутствует только в том случае, если у модели есть переопределенные уровни, превышающие базовую цену. Записи сортируются по возрастанию числа выше_промпт_токенов; prompt/completion — это USD на токен (та же единица измерения, что и pricing.prompt/pricing.completion). «pricing.prompt» и «pricing.completion» всегда остаются базовым (самым низким) уровнем.

Большинство моделей не имеют уровней — для них ключ Price_tiers просто отсутствует в ответе.

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

Доступные модели (171)

Это модели, доступные в настоящее время на BazaarLink, динамически загружаемые из нашей базы данных:

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

Посмотрите все модели на Страница моделей.

Структурированная оценка (Jev)

Jev оценивает состояние JSON по именованным вопросам и возвращает ответы типов boolean, choice или score. Используйте его, когда приложению нужен машиночитаемый результат по заданным критериям.

Только для оценки и принятия решений
Jev не поддерживает чат. Отправляйте запросы Jev на POST /v1/evaluations; запрос к POST /v1/chat/completions вернёт HTTP 400.
POST/v1/evaluations

Вызовите эту конечную точку с ключом API BazaarLink. Полный URL: https://api.bazaarlink.ai/v1/evaluations.

Описание полей

model
string
Необязательное поле. Если его нет, используется typesafe-ai/jev. Другой ID модели возвращает HTTP 400 с кодом model_not_available.
state
string | object | array
Обязательное поле. Передайте оцениваемое состояние как JSON-строку, объект или массив. Если сериализованные state и questions превышают 32 000 tokens, возвращается context_length_exceeded.
questions
record<string, Question>
Обязательное непустое поле-объект с именованными вопросами. Имя каждого вопроса становится ключом в объекте answers ответа.
type
boolean | choice | score
Обязательное поле каждого вопроса: boolean, choice или score.
instructions
string | object | array
Обязательное поле каждого вопроса. JSON-строка, объект или массив с описанием того, что нужно определить.
criteria
object | array
Зависит от type: для boolean необязательно; если указано, это объект только с ключами true или false. Для choice нужен непустой объект, а для score — упорядоченный массив минимум из двух элементов.

Типы ответов

  • boolean — criteria можно не указывать; если оно задано, допустимы только ключи true и false. Ответ содержит числовое значение probability.
  • choice — criteria должен быть непустым объектом, сопоставляющим названия вариантов критериям JSON. Ответ содержит строковое значение choice; ключами probabilities служат названия вариантов.
  • score — criteria должен быть упорядоченным массивом как минимум из двух элементов. score — число и математическое ожидание индексов 0..N-1 в порядке массива criteria; ключами probabilities служат эти индексы в виде строк.

Примеры запросов

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

Пример успешного ответа

В примере ответа есть id, object, model, answers, usage, rounding и warnings. Ключи answers — названия вопросов. В usage указаны input_tokens, output_tokens и total_tokens; в rounding показаны probabilityDecimals и scoreDecimals. warnings — массив; в этом примере он пуст. Внутри answers ключами probabilities для choice служат названия вариантов, а для score — строковые индексы criteria.

{
  "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": []
}

Ответ об ошибке для чат-конечной точки

Отправка Jev на чат-конечную точку возвращает HTTP 400. Показанные ниже поля и значения соответствуют обработчику; message заменено заполнителем, фактический текст возвращает сервер.

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

Streaming

Комплект stream: true , чтобы получить поток событий, отправленных сервером (SSE). Каждое событие содержит фрагмент ответа.

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 Формат

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]
Использование в потоковом режиме
При потоковой передаче данные об использовании возвращаются в последнем фрагменте перед сообщением [DONE] вместе с массивом выбора с пустой дельтой и параметром Finish_reason: «stop».

Keep-alive и финальный фрагмент

Поток может содержать строки-комментарии SSE и неизвестные или ping-события keep-alive. Игнорируйте их и разбирайте data-кадры; последний кадр может содержать usage перед data: [DONE].

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

Отмена трансляции

Потоковые запросы можно отменить, закрыв клиентское соединение — например. вызов AbortController.abort() или закрытие объекта потока. BazaarLink прекращает ретрансляцию дальнейших фрагментов и отменяет исходящий запрос провайдера, как только будет получено уведомление об отмене.

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();
За прерванную трансляцию плата не взимается.
Если поток заканчивается до прибытия окончательного фрагмента использования (включая отмену на стороне клиента), для этого запроса нет достоверной информации о подсчете токенов, поэтому BazaarLink возвращает полную резервацию. Вам не выставляется счет за контент, уже доставленный вашему клиенту до отмены.
Не гарантируется мгновенная остановка провайдера
Закрытие соединения останавливает BazaarLink от немедленной ретрансляции и оплаты дальнейших токенов, но прекратит ли вышестоящий провайдер генерацию на своих собственных серверах в момент разрыва соединения, зависит от этого провайдера — некоторые могут продолжать выполнять вычисления некоторое время после отключения.

Ошибки среднего потока

Нет поля выбора в кадрах ошибок
Если сбой происходит после начала потоковой передачи (например, разрыв восходящего соединения), вы получаете кадр данных SSE в форме {error:{message,type,code}} вместо обычного {choices:[...]} — без изменения статуса HTTP, поскольку заголовки уже были отправлены. Прежде чем читать options[0].delta, проверьте наличие ключа ошибки и выставляйте счет только за уже переданные токены (применяется частичная оплата).
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 — это числовые представления текста, которые отражают семантическое значение. Они преобразуют текст в векторы (массивы чисел), которые можно использовать для ряда задач машинного обучения. BazaarLink предоставляет унифицированную конечную точку, совместимую с OpenAI Embeddings API, поэтому вы можете вызывать модели внедрения от нескольких поставщиков через один интерфейс.

Ответы Embeddings используют непрозрачный ID запроса BazaarLink, совпадающий с x-request-id; используйте его с GET /v1/generation. Нестриминговый ответ также возвращает тот же ID в x-generation-id. usage.cost — сумма в USD, списанная с клиента за этот запрос. Статистика может появиться через несколько секунд после завершения; при 404 ненадолго повторите запрос.

Что такое встраивания?

Вложения преобразуют текст в многомерные векторы, где семантически схожие тексты расположены ближе друг к другу в векторном пространстве — например, «кошка» и «котенок» будут иметь схожие вложения, а «кошка» и «самолет» будут далеко друг от друга. Эти векторные представления позволяют машинам понимать взаимосвязи между фрагментами текста, что делает их основой для многих приложений искусственного интеллекта.

Общие случаи использования

Случай использования
Описание
RAG (генерация с расширенным поиском)Создавайте системы, которые извлекают соответствующий контекст из базы знаний перед генерированием ответа — встраивания находят наиболее релевантные документы для включения в контекст LLM.
Семантический поискПреобразуйте документы и запросы во встраивания, а затем находите наиболее релевантные документы по векторному сходству — это позволяет понять смысл, а не просто сопоставить ключевые слова, что дает лучшие результаты, чем поиск по ключевым словам.
Системы рекомендацийСоздавайте вложения для элементов (продуктов, статей, видео) и предпочтений пользователя, чтобы рекомендовать похожие элементы — векторное сравнение позволяет выявить семантически связанные элементы даже без общих ключевых слов.
Кластеризация и классификацияГруппируйте похожие документы или классифицируйте текст путем анализа шаблонов встраивания — документы со схожими вложениями обычно относятся к одной и той же теме или категории.
Обнаружение дубликатовНаходите повторяющийся или почти повторяющийся контент путем сравнения сходства встраивания — это работает, даже если контент был перефразирован или переформулирован.
Обнаружение аномалийВыявляйте необычное или необычное содержимое, выявляя встраивания, которые значительно отличаются от типичного шаблона набора данных.
POST/v1/embeddings
Note
Если upstream-источник не поддерживает запрошенную модель эмбеддингов, запрос может попробовать другой доступный источник. Если подходящих источников нет, запрос вернёт ошибку.

Параметры

modelобязательно
string
Используемая модель внедрения, например. "openai/text-embedding-3-small".
inputобязательно
string | string[] | ContentItem[]
Текст для встраивания — одна строка, массив строк для одного пакетного вызова или (для моделей, которые это поддерживают) массив элементов {content:[...]}, смешивающих части text и image_url.
dimensions
integer
Запрошенный размер выходного вектора. Уважается только моделями, поддерживающими переменные размеры (например, семейство OpenAI text-embedding-3); пересылается вышестоящему поставщику как есть и игнорируется моделями, которые его не поддерживают.
encoding_format
string
Запрошенная кодировка внедрения, например «плавающее» или «base64». Пересылается вышестоящему поставщику в неизменном виде — поддержка зависит от модели.
provider
object
Unsupported. The entire object is ignored and removed before forwarding; it cannot select an upstream or price tier.

Основной запрос

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

Пакетная обработка

Отправьте массив строк для встраивания нескольких текстов в один запрос — дешевле и быстрее, чем один вызов для каждого текста.

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

Многомодальный ввод (изображение + текст)

Модели с поддержкой ввода изображений (output_modalities включает «embeddings», а inputModalities включает «image») принимают элементы ввода в форме {content:[{type:"text",...}, {type:"image_url",...}]}, что позволяет встраивать изображение отдельно или вместе с текстом.

В зависимости от модели
Только некоторые модели внедрения принимают входные изображения — перед отправкой содержимого image_url проверьте поддерживаемые модели модальности на странице «Модели». Модели, содержащие только текст, отклонят эту форму.
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)}")

Поиск моделей внедрения

Нет специальной конечной точки для списка моделей внедрений — вызовите GET /v1/models и отфильтруйте на стороне клиента записи, выходные_модальности которых включают «внедрения», или просмотрите страницу «Модели».

Ограничения

  • Нет потоковой передачи — встраивания всегда возвращаются как полный ответ, в отличие от завершения чата.
  • Каждая модель имеет максимальную входную длину; текст, выходящий за этот предел, обрезается или отклоняется в восходящем направлении.
  • Вложения для идентичных входных данных являются детерминированными — температура или случайность не учитываются.

Передовые практики

  • Выберите модель для достижения компромисса между speed/quality и стоимостью — модели меньшего размера (например, qwen/qwen3-embedding-4b) дешевле и быстрее; более крупные (например, openai/text-embedding-3-large) обычно встраиваются с более высокой точностью.
  • Объедините несколько текстовых сообщений в один запрос вместо одного звонка на одно текстовое сообщение — меньше циклов обработки, меньше накладных расходов.
  • Кэшируйте результаты — внедрения для одних и тех же входных данных никогда не меняются, поэтому сохраняйте их, а не восстанавливайте.
  • Сравнивайте с косинусным сходством, а не с евклидовым расстоянием — оно масштабно-инвариантно и лучше работает для многомерных векторов.
  • Следите за длиной контекста каждой модели — перед встраиванием длинных документов может потребоваться разделение на фрагменты.

Параметры

Параметры выборки определяют процесс генерации токена. BazaarLink передает поддерживаемые параметры вышестоящему поставщику; неподдерживаемые параметры игнорируются.

Параметры выборки

Pure passthrough — без локальных значений по умолчанию
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
temperature
number
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
top_p
number
Масса вероятности выборки ядра. По умолчанию: 1
top_k
integer
Параметры семплирования передаются без проверки диапазона. Модель может ограничить или игнорировать значения вне поддерживаемого диапазона.
frequency_penalty
number
Наказание повторяющихся токенов. Диапазон: [-2, 2]. По умолчанию: 0
presence_penalty
number
Назначать штрафы за токены в зависимости от присутствия. Диапазон: [-2, 2]. По умолчанию: 0
repetition_penalty
number
Уменьшить повторение входных токенов. Диапазон: (0, 2]. По умолчанию: 1.
min_p
number
Минимальная вероятность относительно верхнего токена. Диапазон: [0, 1]. По умолчанию: 0
top_a
number
Динамический топ-P на основе токена с наибольшей вероятностью. Диапазон: [0, 1]. По умолчанию: 0
seed
integer
Целочисленное начальное значение для детерминированной выборки. Не гарантируется для всех моделей
max_tokens
integer
Максимальное количество токенов для генерации
n
integer
Количество завершений, которые нужно сгенерировать. По умолчанию: 1
logit_bias
object
Сопоставьте идентификаторы токенов со значениями смещения [-100, 100], добавленными перед выборкой. Только модели семейства OpenAI — см. примечание ниже.
logprobs
boolean
Вернуть вероятности журнала для каждого выходного токена. Только модели семейства OpenAI — см. примечание ниже.
top_logprobs
integer
Количество наиболее вероятных токенов для каждой позиции (требуется logprobs: true). Диапазон: 0–20. Только модели семейства OpenAI — см. примечание ниже.
response_format
object
Force структурированный вывод JSON. См. раздел «Структурированный вывод».
structured_outputs
boolean
Запросите строгий вывод, соответствующий схеме JSON, у поставщиков, которые его поддерживают. Прошло как есть
reasoning
object
Конфигурация reasoning/thinking, специфичная для поставщика. Прошло как есть
reasoning_effort
string
OpenAI Усилие рассуждения в стиле o-серии: «низкое», «среднее» или «высокое». Прошло как есть
include_reasoning
boolean
true возвращает текст рассуждений в message.reasoning (при потоковой передаче — в delta.reasoning); false отключает рассуждения у моделей, которые рассуждают по умолчанию (см. раздел о рассуждениях), поэтому рассуждения не оплачиваются. Без reasoning_effort, reasoning и thinking по умолчанию рассуждают и возвращают текст только эти модели; остальные — только по запросу
stop
string | string[]
Stop-последовательности — генерация останавливается при обнаружении
tools
Tool[]
Список инструментов (функций), которые может вызывать модель
tool_choice
string | object
Использование инструмента управления: «авто», «нет» или конкретный инструмент.
parallel_tool_calls
boolean
Включить параллельный вызов функций при наличии инструментов. По умолчанию: правда. Только модели семейства OpenAI — см. примечание ниже.

Кредиты

Запросить текущий кредитный баланс и использование API за весь срок действия.

GET/v1/credits
Auth
Требуется токен носителя (стандартный ключ API sk-bl-...).

Пример запроса

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

Ответ

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

Ошибки: 401 (ключ missing/invalid), 403 (приостановленный пользователь).

Сведения о генерации

Используйте непрозрачный ID запроса BazaarLink из response id или заголовка x-request-id для GET /v1/generation; в нестриминговом ответе тот же ID есть в x-generation-id. Статистика может появиться через несколько секунд; повторяйте запрос при 404 недолго.

GET/v1/generation?id=<generation-id>
Auth
Требуется токен носителя (стандартный ключ API). Обязательный параметр запроса: id.

Пример запроса

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

Ответ

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

Ошибки: 400 (отсутствует идентификатор), 401 (аутентификация), 404 (поколение не найдено).

API Ключевая информация

Запросите текущий уровень ограничения скорости ключа API и агрегированные счетчики использования (формат ответа соответствует общепринятым отраслевым соглашениям о ключах API).

GET/v1/key
Auth
Требуется токен носителя (стандартный ключ API).

Ответ

{
  "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, когда кредитный баланс < 10 долларов США. Окна находятся в формате UTC: ежедневно = текущий день, еженедельно = пн–вс, ежемесячно = 1st–EOM. Если для ключа установлен лимит расходов на ключ (с помощью параметра лимита ключа creation/update), limit/limit_remaining/limit_reset отражает этот лимит и использование соответствующего периода; в противном случае лимит равен нулю, и limit_remaining возвращается к кредитному балансу вашего аккаунта. expires_at — срок действия ключа (ноль, если его нет). is_management_key и is_provisioning_key — это псевдонимы одной и той же концепции — оба верны для ключа управления.
BYOK
BazaarLink не предлагает программу принесения собственного ключа (BYOK), поэтому эта конечная точка не возвращает никаких полей byok_usage.

Ошибки: 401 (аутентификация), 404 (отсутствует пользователь — редко).

Коды ошибок

Ошибка формата ответа Конечные точки вывода

Формат ошибок зависит от endpoint. Используйте HTTP-статус и error.type, если он есть. error.code может быть строкой, числом или отсутствовать; error.message предназначено только для отображения.

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

HTTP

Формат ошибок зависит от endpoint. Используйте HTTP-статус и error.type, если он есть. error.code может быть строкой, числом или отсутствовать; error.message предназначено только для отображения.

Код
Название
Описание
424Сбой зависимостиНастроенный вами ключ BYOK отклонён upstream-провайдером; проверьте или замените его в настройках BYOK. Ошибка появляется только в строгом режиме
400Неверный запросНеверный запрос, пустой массив сообщений или отсутствуют обязательные поля
401НесанкционированныйAPI Ключ отсутствует, недействителен или отключен.
402Требуется оплатаНедостаточно средств на счете, достигнут предел расходов на ключ или превышен предел бюджета monthly/weekly
403ЗапрещеноУчетная запись заблокирована или не имеет разрешения
404Не найденЗапрошенная модель, поколение, ключ или другой ресурс не существует.
409КонфликтРесурс не находится в требуемом состоянии, например задание видео не завершено.
410УшелЗапрошенная модель снята с производства и должна быть заменена.
413Полезная нагрузка слишком великаТело запроса превышает 10 МБ; уменьшить размер контента или разделить запрос
416Диапазон неудовлетворителенЗапрошенный диапазон байтов недействителен для созданного видеоконтента.
429Слишком много запросовПревышен лимит скорости; перед повторной попыткой проверьте заголовок Retry-After
432Бесплатная квота исчерпанаTavily-совместимые эндпоинты (/v1/search, /v1/extract, /v1/crawl, /v1/map): бесплатная квота поиска исчерпана или баланс равен нулю или отрицателен; пополните баланс, чтобы продолжить. Тело ответа в формате Tavily: {"detail":{"error":"..."}}
500Ошибка сервераВнутренняя ошибка BazaarLink
502Плохой шлюзНи один upstream-источник не обработал запрос; запрос вернёт ошибку.
503Сервис недоступенДля этой модели не настроен ни один вышестоящий поставщик; связаться с администратором
504Тайм-аут шлюзаВосходящее соединение или поток остановлены и истекло время ожидания.

Машиночитаемые коды оплаты Ответ

A 402 может представлять собой различные элементы управления. Эти стабильные коды позволяют клиентам показывать правильное следующее действие.

Код
Описание
byok_key_invalidНастроенный вами ключ BYOK отклонён upstream-провайдером; проверьте или замените его в настройках BYOK. Ошибка появляется только в строгом режиме.
budget_cap_reachedA Достигнут предел еженедельного или ежемесячного бюджета рекомендаций; поднимите или сбросьте крышку.
credit_limit_exceededA Жесткая кредитная линия организации, осуществляющей ежемесячные платежи, исчерпана; контактный биллинг.
insufficient_creditsA пользователь или организация с предоплатой не может зарезервировать достаточный баланс; добавить кредиты.
spend_limit_exceededКлюч API достиг настроенного ежедневного, еженедельного или ежемесячного лимита расходов.
capacity_unavailableThis model is temporarily at capacity. Retry shortly; the Retry-After header says how long to wait.

Подробные коды ошибок

Если запрос API завершается неудачно, error.code сообщает конкретную причину. Две ошибки могут использовать HTTP 400, но требуют разных исправлений: «unknown_model» означает, что имя модели неверно, а «image_too_large» означает, что изображение необходимо уменьшить. Используйте таблицу ниже, чтобы найти причину и следующее действие. Статус

Модель и конечная точка
Ошибки поиска модели, жизненного цикла, ценообразования, модальности и совместимости конечных точек.
Код
HTTP
unknown_model400
invalid_model_id400
model_not_found404
model_retired410
model_endpoint_mismatch400
embedding_on_chat_endpoint400
model_not_priced400
invalid_modality_for_model400
Запрос и безопасность
Недопустимые параметры, контекст, инструменты, схемы и отказы в отношении безопасности содержимого.
Код
HTTP
missing_required_field400
unsupported_param400
max_tokens_invalid400
context_too_long400
tool_use_unsupported400
malformed_tool_messages400
invalid_response_format_schema400
invalid_tools_definition400
content_moderation403
content_filter403
unknown_4xx400
Создание и редактирование изображений
Ввод изображения, многочастное редактирование, вывод и ошибки конвейера изображений.
Код
HTTP
invalid_image_url400
input_images_not_supported400
invalid_content_type400
mask_not_supported400
unsupported_response_format400
missing_prompt400
missing_image400
too_many_images400
invalid_image_type400
image_too_large400
invalid_n400
pipeline_error502
no_images502
Восходящая маршрутизация
Очистка ошибок подключения, аутентификации, регулирования и доступности поставщика.
Код
HTTP
upstream_unreachable502
upstream_auth_failed502
upstream_rate_limited429
capacity_unavailable429
upstream_unavailable502/503
byok_key_invalid424

Модерация контента

Все запросы автоматически проверяются перед отправкой модели. Запросы, нарушающие нашу политику использования, отклоняются до модели и возвращают ошибку 403.

Категории контента, которые блокируются

Модерация основана на нашей Политике допустимого использования (Acceptable Use Policy) и в первую очередь блокирует следующие категории контента:

  • Контент сексуальной эксплуатации
  • Угрозы насилия
  • Инструкции по совершению противоправных действий
  • Контент, связанный с биологической опасностью

Формат ответа 403

Запрос, заблокированный модерацией, возвращает ошибку в следующем формате:

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

Заблокированные запросы не тарифицируются — вы не будете платить за отклонённый запрос.

Обжалование ложного срабатывания

Если вы считаете, что запрос был заблокирован ошибочно, обратитесь в службу поддержки, указав время запроса и (по возможности) request id — мы проверим.

Конфиденциальность

Каждый запрос автоматически проверяется на соответствие политике контента.

Для запросов, признанных нарушающими политику, содержимое сохраняется как доказательство соответствия требованиям.

Для остальных запросов полное содержимое промпта не сохраняется.

Ограничения ставок, бюджеты и экстренные тормоза

Эти элементы управления могут отклонить действительный запрос. Они отличаются от сбоев поставщика и требуют других действий по восстановлению.

Управление
HTTP
Как это определить
Ограничение скорости запроса429Строковый или числовой код 429; используйте заголовки Retry-After и X-RateLimit-*.
Блок штрафа за ограничение скорости429Цифровой код 429 и сообщение о временном ограничении; используйте Повтор-После.
Global проводит аварийное торможение503Цифровой код 503, сообщение о глобальном лимите расходов и повторная попытка через 30 или 300 секунд.
Org/team/member/user расходный тормоз429Цифровой код 429 и сообщение автоматического выключателя с указанием затронутой области.
Контроль выставления счетов и бюджета402Используйте коды строк стабильного платежа, перечисленные выше.

Формат ошибок зависит от endpoint. Используйте HTTP-статус и error.type, если он есть. error.code может быть строкой, числом или отсутствовать; error.message предназначено только для отображения.

Состояние видео и медиаресурсов

Проверка видео обычно возвращает числовой код 400. Отсутствующее задание возвращает 404, устаревшая модель возвращает 410, незавершенное видеоконтент возвращает 409, а недопустимый диапазон видеобайтов возвращает 416. Опрос до завершения или исправление заголовка Range перед повторной попыткой.

Политика повторных попыток

Повторять только те сбои, которые можно устранить без изменения запроса. Если присутствует Retry-After, подождите столько же; в противном случае используйте экспоненциальную задержку с джиттером. Ограничьте попытки и избегайте наслаивания ручных повторов поверх автоматических попыток SDK.

Повторить попытку с откатом
429, 502, 503 и 504. Соблюдайте параметр «Повторить попытку после», если он предусмотрен. Для запросов на создание не создавайте второе задание после неоднозначного сбоя сети, пока вы не проверите исходное задание.
Исправьте перед повторной попыткой
400, 401, 402, 403, 404, 409, 410, 413 и 416. Сначала измените запрос, учетные данные, баланс, разрешения, состояние ресурса или заголовок диапазона.

Обработка ошибок

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)

Форматы ошибок потоковой передачи

Ошибки, возникающие до потоковой передачи каких-либо токенов, возвращают стандартный ответ об ошибке HTTP с телом JSON.

После запуска потока ответ HTTP уже равен 200. Анализируйте каждый кадр данных SSE и обрабатывайте ошибку верхнего уровня или choice[0].finish_reason === "error" как неудавшийся, неполный ответ.

Если поток завершается ошибкой после начала, BazaarLink может отправить последнее SSE-событие с объектом error верхнего уровня, а затем data: [DONE]. Считайте ответ неполным и не используйте частичный вывод как завершённый результат.

data: {"error":{"message":"The request could not be completed.","type":"upstream_error","code":502}}

data: [DONE]

// Branch on error.code; error.type can vary by failure path.

Версии

BazaarLink предоставляет единый стабильный путь API, /v1 — нет привязанных к дате версий или заголовков версий, которыми нужно управлять. API развивается постоянно, а не через пронумерованные выпуски.

Некритичные изменения

Отправка без предварительного уведомления:

  • Новые конечные точки
  • В каталог добавлены новые модели
  • Новые дополнительные параметры запроса
  • Новые поля ответа
  • Новые схемы с дополнительными свойствами
  • Дополнительные коды ответа status/error
Пишите клиентам в оборонительной форме.
Игнорируйте незнакомые поля ответа и не допускайте сбоев при неизвестных значениях в полях, подобных перечислению: новые добавляются по мере роста каталога и набора функций.

Важные изменения

Это редкие экземпляры, включая:

  • Удаление или переименование конечной точки, параметра или поля ответа.
  • Изменение типа поля
  • Сделать обязательным дополнительный параметр

Когда они все-таки происходят, критическое изменение применяется к конкретной конечной точке, а не ко всей поверхности /v1 — не существует какого-либо одного изменения версии, которое могло бы нарушить всю интеграцию сразу. Мы пока не публикуем официальный журнал изменений с пометкой «Критические изменения» (см. «Остаться в курсе» ниже); по вопросам, важным для интеграции, обращайтесь в службу поддержки, прежде чем полагаться на недокументированное поведение.

Политика прекращения поддержки

Одно обычное «критическое» событие, которого следует ожидать: отдельные модели выводятся из эксплуатации, поскольку вышестоящие поставщики устаревают. Запросите текущий статус модели через GET/v1/models.

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

Будем в курсе

Мы пока не публикуем специальный журнал изменений API или канал RSS. На данный момент проверьте эту страницу напрямую, посмотрите статус модели через GET /v1/models или обратитесь в службу поддержки, если вам нужно предварительное уведомление о критической интеграции.

Поддержка
Поддержка
Здравствуйте! Чем мы можем помочь?
Отправьте сообщение, и мы ответим в ближайшее время.