Что это за 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.