Что это за API

Один ключ и один базовый URL на текст, картинки и видео, один счёт на всё и стоимость запроса — в ответе.

TeamToken — шлюз к языковым, картиночным и видео-моделям: один ключ, один базовый URL, один счёт. В ответе стоит то логическое имя модели, которое было запрошено.

Базовый URL — https://api.teamtoken.store/v1: /v1/chat/completions, /v1/responses, /v1/embeddings (форма OpenAI), /v1/messages (форма Anthropic), /v1/images/generations, /v1/images/edits, /v1/videos, GET /v1/models, GET /v1/balance.

curl https://api.teamtoken.store/v1/chat/completions \
  -H "Authorization: Bearer $TEAMTOKEN_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "model": "gpt-5.6-sol", "messages": [{"role":"user","content":"Hi"}] }'

Совместимость означает, что SDK достаточно перенастроить

Совместимость буквальная: тело уезжает апстриму как есть, а шлюз читает только имя модели, признак стрима и потолок вывода. Готовый клиент с настраиваемым base_url переключается двумя значениями — base_url и ключ; клиенты Anthropic — на /v1/messages.

Готовые конфиги для агентов и IDE (Codex CLI, Claude Code, Cline и других) — /docs/tools.

from openai import OpenAI
import os

# Nothing but these two lines is TeamToken-specific.
client = OpenAI(base_url="https://api.teamtoken.store/v1", api_key=os.environ["TEAMTOKEN_KEY"])

r = client.chat.completions.create(
    model="gpt-5.6-sol",
    messages=[{"role": "user", "content": "Hi"}],
)
print(r.choices[0].message.content)
print(r.usage.model_extra["cost_usd"])   # what this call cost, as a string

Один счёт на всё, и стоимость приходит в ответе

Счёт один на аккаунт: текст, картинки и видео тратят одни деньги. Остаток — начислено минус расход по тексту минус эффективный расход по медиа, где «эффективный» это списанное плюс зарезервированное под идущие генерации. Поэтому остаток падает при постановке задачи, а не в конце.

Остаток отдаёт GET /v1/balance тем же ключом; стоимость запроса приходит в самом ответе — у текста в usage.cost_usd, у медиа рядом со статусом джобы (/docs/getting-started, шаг 4).

Медиа — это джобы, а не долгий ответ

Медиа считается дольше, чем разумно держать HTTP-соединение, поэтому у него есть состояние. POST /v1/images/generations отвечает 200 с картинками в base64 или 202 с id джобы (результат — GET /v1/images/jobs/{job_id}); POST /v1/videos по умолчанию отвечает 202, а с wait: true ждёт до 90 с и отдаёт готовый ролик сразу (результат — GET /v1/videos/{job_id}).

Чего в этом API нет

Ни подписки, ни тарифных планов: пополнение создаёт начисление, каждый запрос уменьшает остаток.

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

Ни одной цены в документации: каталог правится из админки без выкатки, число в тексте устарело бы молча. Живые цены — GET /cabinet/api/public/models и /cabinet/api/public/media-models, без ключа.

Карта документации

Аутентификация — /docs/auth: откуда ключ, два заголовка, 401 и 402.

Первый запрос — /docs/getting-started: пять шагов от ключа до стоимости.

Справочник — /docs: страница на ручку, с полями, примерами и таблицей отказов. Машиночитаемо — /openapi.public.{ru,en}.json. Доступность моделей — GET /cabinet/api/public/model-status.