API Reference
Все HTTP-методы
Полный справочник публичных, сессионных и служебных методов.
Справочник HTTP-методов
Раскройте карточку метода: в ней входные данные, успешный ответ и ограничения.
Provider API: модели и LLM
Единый минимальный API для приложений. SimpleClaw проверяет ключ, подписку и credits, а затем передаёт запрос во внутренний Model Gateway. До первого вызова прочитайте правила credits и ошибки.
GET/v1/modelsКаталог моделейПубличный
Доступ: Публичный
Запрос
Параметров нет.Успешный ответ
{ "object": "list", "data": [{ "id": "model-id", "object": "model", "owned_by": "openai", "display_name": "Название", "pricing": { "inputCreditsPerMillion": 1, "outputCreditsPerMillion": 1, "cacheReadCreditsPerMillion": 0, "reasoningCreditsPerMillion": 0 } | null }] }Перечень доступных моделей сервер получает из LLMRouter. Все значения pricing — credits за 1 млн токенов; null означает, что ставка пока не настроена.
GET/v1/models/favoritesСписок избранных моделейТребуется авторизация
Доступ: Сессия
Запрос
Нет.Успешный ответ
JSON ответаПоказать
[
"model-id"
]Возвращает public ID моделей, которые пользователь отметил в кабинете.
PUT/v1/models/:publicId/favoriteДобавить модель в избранноеТребуется авторизация
Доступ: Сессия
Запрос
Path: publicId модели из каталога.Успешный ответ
JSON ответаПоказать
{
"favorite": true
}Идемпотентная операция. Недоступная модель вернёт MODEL_UNAVAILABLE.
DELETE/v1/models/:publicId/favoriteУбрать модель из избранногоТребуется авторизация
Доступ: Сессия
Запрос
Path: publicId модели.Успешный ответ
JSON ответаПоказать
{
"favorite": false
}Идемпотентная операция: удаляет отметку только текущего пользователя.
POST/v1/chat/completionsОтправить сообщение моделиТребуется авторизация
Доступ: Bearer API key
Запрос
JSON запросаПоказать
{
"model": "model-id",
"messages": [
{
"role": "user",
"content": "Привет"
}
],
"max_tokens": 1024,
"temperature": 0.7
}Успешный ответ
JSON ответаПоказать
{
"id": "chatcmpl_…",
"object": "chat.completion",
"created": 0,
"model": "model-id",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "…"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1,
"completion_tokens": 1,
"total_tokens": 2
}
}Поддерживаются model, текстовые messages, max_tokens (1–32768) и temperature (0–2). Поле message временно доступно для обратной совместимости. Streaming и tools пока не поддерживаются.
POST/v1/messagesAnthropic Messages для Claude CodeТребуется авторизация
Доступ: Bearer или x-api-key
Запрос
Header: anthropic-version: 2023-06-01. Body: { "model": "anthropic-model-id", "max_tokens": 1024, "messages": [{ "role": "user", "content": "Привет" }], "stream": true }Успешный ответ
{ "id": "msg_…", "type": "message", "role": "assistant", "content": [{ "type": "text", "text": "…" }], "stop_reason": "end_turn", "usage": { "input_tokens": 1, "output_tokens": 1 } } | Anthropic SSEТолько активные модели ANTHROPIC. Поддерживаются system, text/tool_use/tool_result blocks и конечный SSE для Claude Code; image/document/cache/thinking блоки вернут 400. Ключ проходит те же проверки доступа, credits и budget.
POST/v1/responsesOpenAI Responses для CodexТребуется авторизация
Доступ: Bearer API key
Запрос
JSON запросаПоказать
{
"model": "model-id",
"instructions": "…",
"input": [
{
"type": "message",
"role": "user",
"content": [
{
"type": "input_text",
"text": "Привет"
}
]
}
],
"tools": [
{
"type": "function",
"name": "read_file",
"parameters": {}
}
],
"stream": true
}Успешный ответ
{ "id": "resp_…", "object": "response", "status": "completed", "output": [{ "type": "message", "role": "assistant", "content": [{ "type": "output_text", "text": "…" }] }], "usage": { "input_tokens": 1, "output_tokens": 1, "total_tokens": 2 } } | response.* SSEStateless transport для Codex: поддержаны message, function_call и function_call_output, function tools и завершающий SSE после settlement. previous_response_id, hosted tools, изображения и файлы вернут безопасный 400.
Вход и сессия
После входа сервер создаёт две непрозрачные HttpOnly cookie: активная сессия живёт 5 минут и продлевается при работе в кабинете, а refresh token действует 30 дней. Если активная сессия истекла, действующий refresh token бесшовно создаёт новую без обращения к провайдеру. Браузер не получает OAuth-токены.
POST/v1/auth/telegram/webappВход из Telegram Mini AppПубличный
Доступ: Публичный
Запрос
JSON запросаПоказать
{
"initData": "raw Telegram initData"
}Успешный ответ
JSON ответаПоказать
{
"success": true
}Проверяются raw initData, HMAC и свежесть auth_date.
GET/v1/auth/telegram/loginНачать вход TelegramПубличный
GET/v1/auth/vk/loginНачать вход VK IDПубличный
GET/v1/auth/yandex/loginНачать вход Яндекс IDПубличный
GET/v1/auth/sber/loginНачать вход Сбер IDПубличный
Доступ: Публичный
Запрос
Нет.Успешный ответ
302 Redirect к Сбер ID.Production требует mTLS и проверки ID-токена.
GET/v1/auth/identitiesСписок своих способов входаТребуется авторизация
Доступ: Сессия
Запрос
Нет.Успешный ответ
JSON ответаПоказать
[
{
"provider": "TELEGRAM|VK|YANDEX|SBER",
"createdAt": "ISO-8601"
}
]Внешний subject не возвращается. См. правила привязки ниже.
GET/v1/auth/telegram/linkПривязать TelegramТребуется авторизация
Доступ: Сессия
Запрос
Нет.Успешный ответ
302 Redirect к Telegram.Привязка связана с текущей server-side сессией. После callback новая сессия не выдаётся.
GET/v1/auth/vk/linkПривязать VK IDТребуется авторизация
Доступ: Сессия
Запрос
Нет.Успешный ответ
302 Redirect к VK ID.См. единое правило в методе привязки Telegram.
GET/v1/auth/yandex/linkПривязать Яндекс IDТребуется авторизация
Доступ: Сессия
Запрос
Нет.Успешный ответ
302 Redirect к Яндекс ID.См. единое правило в методе привязки Telegram.
GET/v1/auth/sber/linkПривязать Сбер IDТребуется авторизация
Доступ: Сессия
Запрос
Нет.Успешный ответ
302 Redirect к Сбер ID.См. единое правило в методе привязки Telegram.
GET/v1/auth/telegram/callbackCallback TelegramПубличный
Доступ: Публичный
Запрос
Query: state, code.Успешный ответ
302 на WEB_ORIGIN, пара HttpOnly cookie: active session и refresh.GET/v1/auth/vk/callbackCallback VK IDПубличный
Доступ: Публичный
Запрос
Query: state, code, device_id (необязательно).Успешный ответ
302 на WEB_ORIGIN, пара HttpOnly cookie: active session и refresh.GET/v1/auth/yandex/callbackCallback Яндекс IDПубличный
Доступ: Публичный
Запрос
Query: state, code.Успешный ответ
302 на WEB_ORIGIN, пара HttpOnly cookie: active session и refresh.GET/v1/auth/sber/callbackCallback Сбер IDПубличный
Доступ: Публичный
Запрос
Query: state, code.Успешный ответ
302 на WEB_ORIGIN, пара HttpOnly cookie: active session и refresh.GET/v1/auth/telegram/mock/authorizeЗавершить Telegram login локальноПубличный
GET/v1/auth/vk/mock/authorizeЗавершить VK login локальноПубличный
GET/v1/auth/yandex/mock/authorizeЗавершить Яндекс login локальноПубличный
GET/v1/auth/sber/mock/authorizeЗавершить Сбер login локальноПубличный
POST/v1/auth/logoutВыйтиТребуется авторизация
Доступ: Сессия
Запрос
Нет.Успешный ответ
JSON ответаПоказать
{
"success": true
}Отзывает активную сессию и связанный refresh token только на текущем устройстве, затем очищает обе cookie.
Личный кабинет, тарифы и платежи
Доступ выдаётся только после серверного подтверждения оплаты; подробнее в правилах подписки. Формат основных сущностей — в контрактах.
GET/v1/meТекущий пользовательТребуется авторизация
Доступ: Сессия
Запрос
Нет.Успешный ответ
{ "id": "uuid", "displayName": "Имя" | null, "createdAt": "ISO-8601" }GET/v1/catalog/plansПубличный каталог тарифовПубличный
Доступ: Публичный
Запрос
Нет.Успешный ответ
JSON ответаПоказать
[
{
"code": "provider-month",
"name": "Provider",
"priceMinor": 99000,
"currency": "RUB",
"accessType": "PROVIDER",
"limitFiveHour": 0,
"limitWeek": 0,
"creditQuotaFiveHour": 100000,
"creditQuotaWeek": 500000
}
]GET/v1/subscriptionСвои подпискиТребуется авторизация
Доступ: Сессия
Запрос
Нет.Успешный ответ
JSON ответаПоказать
[
{
"planCode": "provider-month",
"planName": "Provider",
"accessType": "PROVIDER",
"status": "ACTIVE",
"autoRenew": true,
"startsAt": "ISO-8601",
"endsAt": "ISO-8601"
}
]POST/v1/subscription/cancel-renewalОтключить автопродлениеТребуется авторизация
Доступ: Сессия
Запрос
JSON запросаПоказать
{
"accessType": "PROVIDER"
}Успешный ответ
Подписка или null.Идемпотентно меняет только autoRenew=false для указанного типа доступа; оплаченный доступ остаётся до endsAt.
POST/v1/paymentsСоздать платёжТребуется авторизация
Доступ: Сессия
Запрос
Header: Idempotency-Key (16–128). Body: { "productCode": "provider-month" }Успешный ответ
{ "id": "uuid", "productCode": "provider-month", "amountMinor": 99000, "currency": "RUB", "status": "PENDING", "checkoutUrl": "https://…" | null, "createdAt": "ISO-8601" }Клиент перенаправляет пользователя на checkoutUrl. В local mock это /checkout/:paymentId, в Prodamus — подписанная платёжная форма. Возврат с формы никогда не выдаёт доступ: его подтверждает только подписанный webhook. Тот же ключ того же пользователя возвращает исходный платёж; второй активный тип подписки запрещён.
GET/v1/paymentsИстория своих платежейТребуется авторизация
Доступ: Сессия
Запрос
Query: limit 1–50 (20 по умолчанию), cursor до 128.Успешный ответ
{ "items": [{ "id": "uuid", "productCode": "…", "amountMinor": 99000, "currency": "RUB", "status": "SUCCEEDED", "createdAt": "ISO-8601", "providerReference": "…" | null }], "nextCursor": "…" | null }GET/v1/payments/mock/checkout/:idMock checkoutТребуется авторизация
Доступ: СессияТолько локальный mock
Запрос
Path: id платежа.Успешный ответ
JSON ответаПоказать
{
"status": "pending"
}POST/v1/payments/:id/mock/confirmПодтвердить mock-платёжТребуется авторизация
POST/v1/payments/:id/mock/failПометить mock-платёж неуспешнымТребуется авторизация
POST/v1/payments/prodamus/webhookWebhook ProdamusТребуется авторизация
Доступ: Только Prodamus
Запрос
JSON body от Prodamus; header Sign.Успешный ответ
JSON ответаПоказать
{
"success": true
}Служебный endpoint: подпись HMAC-SHA256 и provider event ID проверяются до выдачи доступа. Пользовательский браузер не должен вызывать этот метод.
Provider API-ключи и Agent
API-ключ предназначен только для Provider API — он не заменяет браузерную сессию. У одного пользователя может быть любое число ключей; их usage и credits общие. Правила описаны в бизнес-логике.
GET/v1/access/keysСписок своих ключейТребуется авторизация
Доступ: Сессия
Запрос
Нет.Успешный ответ
JSON ответаПоказать
[
{
"id": "uuid",
"label": "production",
"creditBudget": 10,
"tokenPrefix": "sc_abcd",
"status": "ACTIVE",
"createdAt": "ISO-8601",
"revokedAt": null,
"lastUsedAt": null
}
]GET/v1/access/credit-budgetПолучить доступный бюджет ключейТребуется авторизация
Доступ: Сессия
Запрос
Нет.Успешный ответ
JSON ответаПоказать
{
"source": "PLAN",
"limit": 500,
"allocated": 100,
"available": 400,
"prepaidBalance": {
"total": 1000,
"spent": 30,
"remaining": 970
}
}Все суммы — credits. source: PLAN — недельная credit-квота Provider-тарифа; BALANCE — предоплаченный баланс; NONE — лимит пока нельзя назначить.
POST/v1/access/keysСоздать API-ключТребуется авторизация
Доступ: Сессия
Запрос
{ "label": "production", "creditBudget": 10 } | {}Успешный ответ
JSON ответаПоказать
{
"id": "uuid",
"token": "sc_…",
"label": "production",
"creditBudget": 10,
"…": "метаданные ключа"
}label необязателен, 1–80 символов. creditBudget — необязательный недельный лимит в credits. Сырой ключ возвращается только здесь; Cache-Control: no-store.
POST/v1/access/keys/:id/revealПоказать API-ключТребуется авторизация
Доступ: Сессия
Запрос
Path: id UUID активного ключа.Успешный ответ
JSON ответаПоказать
{
"id": "uuid",
"token": "sc_…",
"…": "метаданные ключа"
}Явное действие владельца; Cache-Control: no-store.
POST/v1/access/keys/:id/rotateПеревыпустить один API-ключТребуется авторизация
Доступ: Сессия
Запрос
Path: id UUID активного ключа.Успешный ответ
JSON ответаПоказать
{
"id": "uuid",
"token": "sc_…",
"…": "метаданные нового ключа"
}Немедленно заменяет только указанный ключ. Остальные ключи и общий баланс не меняются; Cache-Control: no-store.
PUT/v1/access/keys/:id/budgetИзменить лимит API-ключаТребуется авторизация
Доступ: Сессия
Запрос
Path: id UUID. Body: { "creditBudget": 10 } | { "creditBudget": null }Успешный ответ
JSON ответаПоказать
{
"id": "uuid",
"creditBudget": 10,
"…": "метаданные ключа"
}null снимает индивидуальный лимит. Все значения — credits; при тарифе распределение не может превысить его недельную credit-квоту.
DELETE/v1/access/keys/:idУдалить один API-ключТребуется авторизация
Доступ: Сессия
Запрос
Path: id UUID активного ключа.Успешный ответ
204 No ContentНемедленно прекращает доступ и убирает ключ из списка. История usage остаётся без сырого секрета. Повторное удаление возвращает API_TOKEN_NOT_FOUND.
GET/v1/access/agentСтатус AgentТребуется авторизация
Доступ: Сессия
Запрос
Нет.Успешный ответ
null | { "state": "PROVISIONING" | "READY" | "STOPPED" }В MVP Agent можно только наблюдать, не управлять им.
Администрирование
Администратор — это подтверждённый Telegram-пользователь, чей числовой Telegram ID находится в server-side списке. Он не получает сырой API-ключ пользователя. Rate cards меняют только будущие списания.
GET/v1/admin/accessПроверить admin-доступТребуется авторизация
GET/v1/admin/plansВсе тарифыТребуется авторизация
POST/v1/admin/plansСоздать тарифТребуется авторизация
Доступ: Администратор
Запрос
JSON запросаПоказать
{
"code": "provider-month",
"name": "Provider",
"priceMinor": 99000,
"currency": "RUB",
"accessType": "PROVIDER",
"limitFiveHour": 0,
"limitWeek": 0,
"creditQuotaFiveHour": 100000,
"creditQuotaWeek": 500000
}Успешный ответ
Созданный тариф.code: [a-z][a-z0-9-]{1,62}; цена — минимальные единицы. Для PROVIDER обязательны обе credit-квоты.
PATCH/v1/admin/plans/:codeИзменить тарифТребуется авторизация
Доступ: Администратор
Запрос
Path: code. Body: минимум одно поле: name, priceMinor, currency, лимиты, credit-квоты, isActive.Успешный ответ
Обновлённый тариф.Код и тип доступа неизменяемы.
DELETE/v1/admin/plans/:codeУдалить неиспользованный тарифТребуется авторизация
Доступ: Администратор
Запрос
Path: code.Успешный ответ
JSON ответаПоказать
{
"success": true
}PLAN_IN_USE для тарифа с историей. Неактивный тариф скрыт от новых покупок, но хранит историю.
GET/v1/admin/usersНайти пользователейТребуется авторизация
Доступ: Администратор
Запрос
Query: page≥1; search≤120; blocked=ALL|ACTIVE|BLOCKED; subscription=ALL|WITH_SUBSCRIPTION|WITHOUT_SUBSCRIPTION; provider=TELEGRAM|VK|YANDEX|SBER; sort=LAST_ACTIVE_AT|REGISTERED_AT|DISPLAY_NAME; direction=ASC|DESC.Успешный ответ
JSON ответаПоказать
{
"items": [
{
"id": "uuid",
"displayName": "…",
"registeredAt": "ISO-8601",
"lastActiveAt": "ISO-8601",
"blockedAt": null,
"loginProviders": [
"TELEGRAM"
],
"hasSubscription": true
}
],
"page": 1,
"pageSize": 10,
"total": 1
}GET/v1/admin/users/:idКарточка пользователяТребуется авторизация
Доступ: Администратор
Запрос
Path: id UUID.Успешный ответ
Пользователь из списка плюс subscriptions, payments, credentials и agents.POST/v1/admin/users/:id/blockЗаблокировать пользователяТребуется авторизация
Доступ: Администратор
Запрос
Path: id UUID.Успешный ответ
JSON ответаПоказать
{
"success": true
}Активные сессии отзываются, Provider API блокируется немедленно.
POST/v1/admin/users/:id/unblockРазблокировать пользователяТребуется авторизация
DELETE/v1/admin/users/:idУдалить пустую учётную записьТребуется авторизация
Доступ: Администратор
Запрос
Path: id UUID.Успешный ответ
JSON ответаПоказать
{
"success": true
}USER_DATA_RETAINED при платежах, подписках, токенах или Agent-данных; используйте блокировку.
GET/v1/admin/ai/modelsМодели и rate cardsТребуется авторизация
PATCH/v1/admin/ai/models/:publicIdИзменить модельТребуется авторизация
Доступ: Администратор
Запрос
Path: publicId. Body: { "displayName"?: "…", "isActive"?: true }, минимум одно поле.Успешный ответ
Обновлённая модель.Provider, publicId и upstream ID неизменяемы.
POST/v1/admin/ai/models/:publicId/rate-cardsДобавить rate cardТребуется авторизация
Доступ: Администратор
Запрос
JSON запросаПоказать
{
"effectiveAt": "ISO-8601",
"inputCreditsPerMillion": 1,
"outputCreditsPerMillion": 1,
"cacheReadCreditsPerMillion": 0,
"reasoningCreditsPerMillion": 0
}Успешный ответ
Созданная rate card.Дата — сейчас или будущее; значения неотрицательны, одно — положительно. Редактирование запрещено.
POST/v1/admin/ai/models/:publicId/rate-cards/:id/disableОтключить rate cardТребуется авторизация
Доступ: Администратор
Запрос
Path: publicId, id UUID.Успешный ответ
JSON ответаПоказать
{
"success": true
}Не меняет историю, влияет только на новые запросы.
Read-only MCP и OAuth 2.1
Публичный MCP доступен без авторизации и содержит search_docs и list_models. Аккаунтный MCP после OAuth 2.1 Authorization Code с PKCE или через один токен из кабинета открывает только свои list_models, get_account_limits и get_usage_summary. Оба варианта не выполняют LLM- или VLM-inference, платежи, админские действия или операции с API-ключами.
POST/v1/mcpПубличный MCP JSON-RPCПубличный
Доступ: Публичный
Запрос
JSON запросаПоказать
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_models",
"arguments": {}
}
}Успешный ответ
JSON-RPC 2.0 через Streamable HTTP. initialize: protocolVersion 2025-06-18, simpleclaw-public. tools/list: search_docs(query 1–200), list_models. tools/call — только эти инструменты.Для ChatGPT выберите Streamable HTTP и скопируйте URL из руководства «Подключение в ChatGPT»: он подставляется из текущего окружения. STDIO, команда запуска и API-ключ не нужны. Неизвестный метод/инструмент: -32601; неверные аргументы: -32602.
POST/v1/mcp/accountАккаунтный MCPТребуется авторизация
Доступ: OAuth или account token
Запрос
Тот же JSON-RPC. Header: Authorization: Bearer mcp_…Успешный ответ
tools/list: list_models, get_account_limits, get_usage_summary. Только данные владельца токена.OAuth требует scope account:read и корректную audience/resource. Account-токен создаётся в кабинете; на аккаунт может существовать только один.
GET/v1/mcp/tokenСтатус account MCP-токенаТребуется авторизация
Доступ: Сессия
Запрос
Без телаУспешный ответ
Метаданные токена без raw-значения либо null.Raw-значение никогда не возвращается этим endpoint-ом.
POST/v1/mcp/tokenСоздать account MCP-токенТребуется авторизация
Доступ: Сессия
Запрос
Без телаУспешный ответ
Метаданные и raw token; значение показывается только один раз.Если активный токен уже есть, возвращается MCP_TOKEN_EXISTS.
POST/v1/mcp/token/rotateПеревыпустить account MCP-токенТребуется авторизация
Доступ: Сессия
Запрос
Без телаУспешный ответ
Новые метаданные и raw token.Старый токен немедленно становится недействительным.
DELETE/v1/mcp/tokenОтозвать account MCP-токенТребуется авторизация
Доступ: Сессия
Запрос
Без телаУспешный ответ
204 No Content.Повторный отзыв возвращает MCP_TOKEN_NOT_FOUND.
GET/v1/mcp/oauth/authorizeПолучить OAuth codeТребуется авторизация
Доступ: Сессия
Запрос
Query: client_id, точный зарегистрированный HTTPS redirect_uri, response_type=code, code_challenge base64url 43–128, code_challenge_method=S256, scope=account:read, resource; state необязателен.Успешный ответ
302 на redirect_uri?code=…&state=…Code одноразовый, живёт 5 минут; resource совпадает с MCP_OAUTH_AUDIENCE.
POST/v1/mcp/oauth/tokenОбменять code на токенПубличный
Доступ: Публичный
Запрос
JSON запросаПоказать
{
"grant_type": "authorization_code",
"code": "…",
"client_id": "…",
"redirect_uri": "https://…",
"code_verifier": "43–128 символов",
"resource": "simpleclaw-mcp-account"
}Успешный ответ
JSON ответаПоказать
{
"access_token": "mcp_…",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "account:read",
"resource": "simpleclaw-mcp-account"
}Проверяются client, redirect_uri, code, audience и PKCE S256. Ошибки OAUTH_INVALID_REQUEST, OAUTH_INVALID_CLIENT, OAUTH_INVALID_GRANT.
Здоровье сервиса и документы
Для машинной интеграции используйте /docs/llms.txt, для интерактивной схемы — OpenAPI.
GET/health/liveLivenessПубличный
GET/health/readyReadinessПубличный
Доступ: Публичный
Запрос
Нет.Успешный ответ
JSON ответаПоказать
{
"status": "ok",
"timestamp": "ISO-8601",
"checks": {
"database": "ok"
}
}При недоступной базе — 503.