SUB&SUB · Документация

Справочник по API

SUB&SUB предоставляет мультипровайдерный релей по адресу https://api.subnsub.com/v1. OpenAI-клиенты обращаются к /v1/chat/completions; Anthropic-клиенты — к /v1/messages. Один и тот же ключ sk-cf-... маршрутизирует оба — выберите модель в теле запроса, и релей сам подберёт upstream.

Быстрый старт

Вам нужны три вещи:

  1. Base URL: https://api.subnsub.com/v1 (OpenAI-клиенты) или https://api.subnsub.com (Anthropic-клиенты — SDK сам добавляет /v1/messages)
  2. API-ключ: sk-cf-..., выданный в консоли
  3. Модель: одна из 21 проверенной модели — например, gpt-5.4-mini или claude-haiku-4.5

Аутентификация

Каждый запрос должен содержать заголовок Authorization: Bearer sk-cf-.... Ключи выдаются в консоли и хранятся в виде SHA-256-хешей — как только вы покинете экран создания, открытый текст исчезнет навсегда, поэтому сохраните его сразу.

Совет Создавайте отдельный ключ для каждой интеграции (чат-бот, плагин IDE, пакетное задание). Отзыв скомпрометированного ключа в консоли вступает в силу в течение секунд.

Эндпоинты

POST /v1/chat/completions

POST/v1/chat/completions

Отправьте запрос на завершение чата. Структура запроса совпадает с OpenAI Chat Completions API — OpenAI SDK работают без изменений.

ПараметрТипОписание
modelstringОдин из проверенных ID моделей.
messagesarrayИстория диалога. Каждый элемент: {role, content}, где rolesystem / user / assistant.
streambooleanЕсли true, ответ отправляется как SSE-чанки. См. Стриминг.
stream_optionsobjectНеобязательный. Релей всегда принудительно передаёт upstream {include_usage: true}, чтобы финальный чанк содержал блок с расходом токенов — переопределение не имеет эффекта.
max_tokensintegerОграничивает длину ответа. По умолчанию — максимум модели.
temperaturenumber0 – 2. Выше = больше случайности.

POST /v1/messages

POST/v1/messages

Нативный эндпоинт Anthropic для моделей claude-* — Anthropic SDK (anthropic-sdk-python, @anthropic-ai/sdk, claude-code) работают без изменений с этим путём. Укажите base URL https://api.subnsub.com и аутентифицируйтесь через заголовок x-api-key (форма Authorization-Bearer тоже работает, если ваш клиент её предпочитает).

ПараметрТипОписание
modelstringID модели claude-* (см. Доступные модели). Передача здесь OpenAI-модели возвращает 400 invalid_request_error.
max_tokensintegerТребуется Anthropic — ограничивает длину ответа ассистента.
messagesarrayИстория диалога в формате Anthropic: {role, content}, где roleuser / assistant.
streambooleanЕсли true, возвращает стандартную последовательность SSE-событий Anthropic: message_start, content_block_delta, message_delta, message_stop.
thinkingobjectПередаётся дословно. Используйте вместе с вариантом модели -thinking, чтобы включить расширенное мышление.
cache_controlobjectПоддерживается prompt-кэширование. Токены записи в кэш тарифицируются по 1.25×, а токены чтения из кэша — по 0.10× от ставки input соответствующего тира.
Обратите внимание Каждый запрос Claude несёт upstream системный промпт Kiro объёмом ~4100 токенов — он тарифицируется как обычные input-токены по ставке тира модели. Короткие промпты, которые иначе были бы дешёвыми, всё равно облагаются этим минимумом.

GET /v1/models

GET/v1/models

Перечисляет модели, которые вы действительно можете вызывать. Релей объединяет каталоги OpenAI и Anthropic из sub2api и отфильтровывает их до 21 модели, которые мы протестировали end-to-end на текущем пуле аккаунтов — фантомные ID, которые отдают 503 при маршрутизации, или upstream-400 на первом токене, скрыты. Если каждый настроенный upstream недоступен, эндпоинт возвращает 502 models_unreachable, а не вводящий в заблуждение пустой список.

# sample response (truncated)
{
  "object": "list",
  "data": [
    { "id": "gpt-5.4-mini",      "type": "model", ... },
    { "id": "gpt-5.4",           "type": "model", ... },
    { "id": "claude-sonnet-4.5", "type": "model", ... },
    { "id": "claude-haiku-4.5",  "type": "model", ... },
    ...
  ]
}

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

Два upstream-семейства. 7 моделей OpenAI маршрутизируются на общие аккаунты уровня ChatGPT; 14 моделей Claude — через обратный прокси Kiro на AWS CodeWhisperer. Потокенные ставки зависят от тира (см. Тарифы) — один ключ работает для обоих.

OpenAI

ID моделиСемействоТирПримечания
gpt-5.4-mini GPT-5.4Mini Быстрая и дешёвая. Рекомендуемый вариант по умолчанию для чата и кодинга.
gpt-5.3-codex Codex Mini Версия 5.3, настроенная под кодинг. Та же цена, что и у mini.
gpt-5.2 GPT-5.2StandardСтабильная 5.2.
gpt-5.2-chat-latestGPT-5.2StandardАвтоматически отслеживает свежую чат-настройку 5.2 (сейчас маппится upstream на gpt-5.2).
gpt-5.4 GPT-5.4StandardПолноразмерная GPT-5.4 — медленнее, более сильное рассуждение.
gpt-5.4-2026-03-05GPT-5.4StandardСнимок gpt-5.4 с указанием даты.
gpt-5.5 GPT-5.5Premium Более новый флагман.

Anthropic

ID моделиСемействоТирПримечания
claude-haiku-4.5 Haiku 4.5 Mini Самая маленькая Claude — та же потокенная ставка, что и у gpt-5.4-mini.
claude-haiku-4.5-thinking Haiku 4.5 Mini Вариант haiku-4.5 с расширенным мышлением. Используйте вместе с полем запроса thinking.
claude-sonnet-4.5 Sonnet 4.5 StandardClaude среднего тира — та же потокенная ставка, что и у gpt-5.4.
claude-sonnet-4.5-thinking Sonnet 4.5 StandardВариант sonnet-4.5 с расширенным мышлением.
claude-sonnet-4.6 Sonnet 4.6 StandardБолее новая настройка Sonnet — тир Standard, та же ставка, что и у sonnet-4.5.
claude-sonnet-4.6-thinking Sonnet 4.6 StandardВариант sonnet-4.6 с расширенным мышлением.
claude-opus-4.5 Opus 4.5 Ultra Передовая Claude. Тарифицируется по прайс-листу Anthropic — без маржи (см. Тарифы).
claude-opus-4.5-thinking Opus 4.5 Ultra Вариант opus-4.5 с расширенным мышлением (адаптивное мышление).
claude-opus-4.6 Opus 4.6 Ultra Более новая настройка Opus.
claude-opus-4.6-thinking Opus 4.6 Ultra Вариант opus-4.6 с расширенным мышлением.
claude-opus-4.7 Opus 4.7 Ultra Предыдущий снимок Opus.
claude-opus-4.7-thinking Opus 4.7 Ultra Вариант opus-4.7 с расширенным мышлением.
claude-opus-4.8 Opus 4.8 Ultra Последний снимок Opus.
claude-opus-4.8-thinking Opus 4.8 Ultra Вариант opus-4.8 с расширенным мышлением.
Обратите внимание Каждый запрос Claude несёт на входе системный промпт Kiro объёмом ~4100 токенов — он включён в ваш счёт за токены. Поддерживается prompt-кэширование Anthropic: записи в кэш тарифицируются по 1.25×, а чтения — по 0.10× от ставки input соответствующего тира (см. Тарифы).
Недоступно Pro-варианты (gpt-5.2-pro, gpt-5.2-pro-2025-12-11), gpt-4o, gpt-4o-mini, gpt-5, gpt-5-mini, варианты image / audio / realtime, claude-haiku-4-6, а также датированные upstream-ID (например, claude-sonnet-4-5-20250929). Их вызов возвращает 400 model_not_available. Pro-модели исключены из меню, потому что лежащие в основе аккаунты социального тира в пуле исчерпали бы свои крошечные квоты за считанные запросы.

Усилие рассуждения

Каждая из перечисленных выше моделей OpenAI — это модель с рассуждением: бэкенд может потратить больше или меньше токенов «на размышление» перед выдачей видимого ответа. Задайте reasoning_effort в теле запроса OpenAI /v1/chat/completions, чтобы управлять бюджетом. Для Claude используйте нативное поле запроса Anthropic thinking (или выберите вариант модели -thinking) — см. раздел /v1/messages. Модели OpenAI принимают одни и те же пять значений усилия:

ЗначениеПоведение
none Без размышления — сразу к ответу. Самый дешёвый и быстрый.
low Короткий проход рассуждения.
medium По умолчанию, если поле не передано. Сбалансированный.
high Более глубокое рассуждение. Рекомендуется для нетривиального кодинга / многошаговых задач.
xhigh Максимальное усилие. Самый медленный и дорогой; приберегите для сложного анализа, где он действительно нужен.
# Two equivalent forms — pick whichever your SDK supports
{
  "model": "gpt-5.4-mini",
  "reasoning_effort": "high",
  "messages": [ ... ]
}

{
  "model": "gpt-5.5",
  "reasoning": { "effort": "xhigh" },
  "messages": [ ... ]
}
Стоимость Токены размышления засчитываются для тарификации как output-токены — больше усилие = больше output-токенов = больший счёт на том же промпте. Потокенная ставка не меняется.
Обратите внимание Протокол OpenAI также определяет 'minimal', но модели нашего пула его отклоняют: "'minimal' is not supported with this model". Придерживайтесь пяти значений выше.

Стриминг

Задайте "stream": true, чтобы получать Server-Sent Events. Финальный чанк несёт блок usage (мы принудительно передаём upstream stream_options.include_usage, чтобы счётчики токенов всегда выдавались), затем поток закрывает литерал data: [DONE].

# Streaming format (line by line)
data: {"id":"resp_...","choices":[{"delta":{"content":"Hi"}}]}

data: {"id":"resp_...","choices":[{"delta":{"content":"!"}}]}

data: {"id":"resp_...","choices":[],"usage":{"prompt_tokens":18,"completion_tokens":11,"total_tokens":29}}

data: [DONE]

Добавьте :online к любому ID модели, поддерживаемому эндпоинтом, и релей выполнит веб-поиск перед пересылкой модели, добавив результаты в начало диалога, чтобы ответ опирался на свежие данные. Суффикс работает на /v1/chat/completions и /v1/messages (последний по-прежнему требует базу claude-*); никаких специальных полей запроса для поиска не требуется.

# Same call as before — just :online on the model
curl https://api.subnsub.com/v1/chat/completions \
  -H "Authorization: Bearer sk-cf-xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.4-mini:online",
    "messages": [
      {"role": "user", "content": "What did Anthropic ship this week?"}
    ]
  }'

Как это работает: релей убирает :online, берёт самое последнее сообщение пользователя в качестве запроса (с ограничением в 400 символов), вызывает Tavily для получения до 3 результатов с извлечённым текстом страниц, когда он доступен, плюс необязательную сводку, сгенерированную Tavily, а затем добавляет их в начало того же пользовательского хода в виде чётко выделенного блока <search_results> перед отправкой запроса upstream. У вызова поиска тайм-аут 8 секунд. Результаты намеренно внедряются в роль user — никогда в системный промпт — чтобы недоверенные фрагменты не могли быть повышены до инструкций системного приоритета.

Блок <search_results> выглядит так. Перед ним идёт однострочная инструкция, предписывающая модели рассматривать блок как недоверенные внешние данные и ссылаться на пронумерованные элементы внутри текста:

<search_results query="What did Anthropic ship this week?" retrieved="2026-05-21">
Summary: <short LLM-generated synthesis of the result set>

[1] Anthropic launches Opus 4.8
URL: https://www.anthropic.com/news/opus-4-8
<extracted page text, or short snippet if extraction failed — up to ~2000 chars>

[2] ...
</search_results>
ПоведениеДетали
СтоимостьСегодня без наценки — вы платите обычную потокенную ставку модели; релей берёт вызов поиска на себя. Внедрённый блок <search_results> при этом засчитывается как input-токены, поэтому ожидайте более высокий счёт за prompt-токены, чем для того же вопроса без :online.
Режим отказаМягкий. Если Tavily выходит за тайм-аут или возвращает ошибку, запрос продолжается к модели без поискового контекста (вы всё равно получаете ответ, просто без опоры на данные). Единственный жёсткий отказ — 503 search_unavailable, когда поиск вообще не настроен на релее.
count_tokens/v1/messages/count_tokens убирает суффикс, но никогда не вызывает Tavily — счётчик отражает ваш исходный промпт, а не дополненный.
Многоходовой режимЗапрашивается и дополняется только последний пользовательский ход; более ранние ходы не затрагиваются. Чтобы выполнить поиск снова, отправьте новое пользовательское сообщение с :online всё ещё на модели.

Когда использовать :online

Релей делает один вызов Tavily на запрос и внедряет результаты — это не агентный цикл поиска. Модель не решает выполнить повторный поиск на основе того, что видит, как это делают Perplexity Sonar или инструмент просмотра ChatGPT. Планируйте с учётом этого ограничения:

ПодходитНе подходит
Чувствительные ко времени факты (новости, цены, номера версий, даты релизов)Приватный или вставленный код, которого нет в публичной сети — добавляет шум в промпт без опоры на данные
Поиск официального документа или анонсаМатематика, рассуждение, перевод, креативное письмо — опираться не на что
Всё, что вы иначе проверяли бы поиском в GoogleСтабильные знания, уже имеющиеся в обучающих данных («что такое двоичное дерево»)

Сформулируйте последнее сообщение пользователя как самостоятельный поисковый запрос. Поиск выполняется по буквальному тексту вашего самого последнего пользовательского хода (с ограничением в 400 символов), поэтому разговорные уточнения вроде «а как насчёт последней версии?» превращаются в бесполезные запросы без контекста. В многоходовом чате повторно укажите тему, когда добавляете :online — например, «последняя версия Anthropic Python SDK» вместо «последнюю».

Для вопросов, требующих многошагового синтеза (сравнение, глубокое исследование), разбивайте их на несколько ходов и добавляйте :online к каждому. Модель прочитает свежие результаты каждого хода; следующий запрос вы направляете вручную. Учтите, что внедрённый блок <search_results> отправляется только upstream — он не возвращается вашему клиенту и не сохраняется в следующий запрос, поэтому, если более поздний ход зависит от деталей из ранних источников, попросите модель кратко изложить их в видимом ответе. Режим исследования за один проход не поддерживается.

Совет Сочетайте с высоким усилием рассуждения (reasoning_effort: "high"), чтобы модель действительно взвешивала возвращённые источники, а не опиралась на первый результат. Внедрённая инструкция просит модель ссылаться на пронумерованные источники как [1], [2] внутри текста, поэтому в выводе обычно будут такие ссылки — хотя модель не строго связана этим форматом.

Ошибки

Оболочка зависит от того, какой эндпоинт вы вызвали — релей возвращает ошибки в протоколе, соответствующем SDK вызывающей стороны, а upstream-ошибки передаются дословно.

Пути OpenAI (/v1/chat/completions, /v1/responses, /v1/models) — оболочка OpenAI:

{ "error": { "message": "...", "type": "...", "code": "..." } }

Пути Anthropic (/v1/messages, /v1/messages/count_tokens) — оболочка Anthropic:

{ "type": "error", "error": { "type": "...", "message": "..." } }

Оболочка Anthropic использует другую структуру — нет поля code, а дискриминатор type: "error" находится на верхнем уровне (внутреннее error.type задаёт категорию, например authentication_error, invalid_request_error, permission_error, api_error). Anthropic SDK уже разбирают эту структуру; обработчики ошибок обычного OpenAI SDK — нет, поэтому вызывайте /v1/messages через Anthropic SDK (или используйте чистый HTTP).

Коды статусов — канонические HTTP-коды в обоих протоколах:

СтатусOpenAI code / Anthropic error.typeЗначение
401invalid_api_key / authentication_errorОтсутствующий или неизвестный ключ sk-cf-....
402insufficient_balance / permission_errorБаланс аккаунта отрицательный. Пополните во вкладке оплаты в консоли.
403key_revoked / permission_errorКлюч был отозван.
400model_not_available / invalid_request_errorОтправленная вами model отсутствует в проверенном каталоге или не подходит для эндпоинта (например, OpenAI-модель на /v1/messages) — проверьте Доступные модели.
503Сейчас ни один upstream-аккаунт не обслуживает запрос — обычно это окно лимита запросов по всему пулу, а не проблема конфигурации.
503search_unavailable / api_errorВы использовали :online, но веб-поиск не настроен на этом релее. См. Веб-поиск.
502upstream_unreachable / api_errorРелей не смог достучаться до бэкенда. Повторите после короткой паузы.

Тарифы и оплата

Оплата по факту, тарификация по токенам в микродолларах (1 микро = $0.000001 = 1/10,000 цента), чтобы запросы дешевле цента учитывались точно. Ставки указаны за 1M токенов, по тирам — см. таблицу моделей, чтобы узнать, к какому тиру относится каждая модель.

ТирМоделиВход / 1MВыход / 1M
Mini gpt-5.4-mini, gpt-5.3-codex, claude-haiku-4.5, claude-haiku-4.5-thinking $0.20$1.60
Standardgpt-5.2, gpt-5.2-chat-latest, gpt-5.4, gpt-5.4-2026-03-05, claude-sonnet-4.5, claude-sonnet-4.5-thinking, claude-sonnet-4.6, claude-sonnet-4.6-thinking$0.75$6.00
Premium gpt-5.5 $1.10$8.80
Ultra claude-opus-4.5, claude-opus-4.5-thinking, claude-opus-4.6, claude-opus-4.6-thinking, claude-opus-4.7, claude-opus-4.7-thinking, claude-opus-4.8, claude-opus-4.8-thinking$5.00$25.00

Ставки тира Ultra совпадают с опубликованным прайс-листом Anthropic на Opus — прямая передача, без маржи. Остальные тиры идут ниже своих upstream-ставок благодаря объединённой подписочной базе.

Токены рассуждения (когда вы задаёте reasoning_effort в OpenAI или используете вариант Claude -thinking) засчитываются как output-токены по ставке тира модели — отдельной наценки за высокое усилие нет, но запрос с глубоким размышлением легко может выдать в 10–50× больше output-токенов, чем запрос без усилия, поэтому счёт в долларах растёт вместе с этим.

Prompt-кэширование Anthropic тарифицируется отдельной строкой: записи в кэш по 1.25×, а чтения из кэша по 0.10× от ставки input соответствующего тира. Так, попадание в кэш для haiku-4.5 стоит 0.20 × 0.10 = $0.02 per 1M tokens, а попадание в кэш для sonnet-4.5 — 0.75 × 0.10 = $0.075 per 1M tokens. Колонки кэша записываются в каждой строке списания, чтобы консоль могла показать разбивку.

Баланс списывается в реальном времени по мере возврата каждого запроса — для стриминговых запросов списание выполняется после прихода чанка [DONE]. Смотрите текущий баланс и списания по каждому запросу на /console#billing.

Пополнение Консоль поддерживает Stripe Checkout — карта, Link, Alipay, WeChat Pay (что включено в аккаунте Stripe). Кредиты не сгорают.

Лимиты запросов

Сегодня лимитов запросов на ключ нет. Действуют параллелизм пула upstream-аккаунтов и серверный троттлинг OpenAI; если вы в них упрётесь, релей вернёт 429 с заголовком retry-after. Лимиты RPM / TPM на ключ появятся после MVP.