Справочник API
Серверный API обслуживает аккаунт, счета, защищённую страницу оплаты, статусы и вебхуки. OpenAPI описывает маршруты, поля и ошибки. Для запуска платежа нужны настроенный шлюз, одобренный магазин и поддерживаемые условия счёта.
В этой статье
Адрес и формат#
Базовый адрес: https://kevmi.one. Тела запросов и ответы используют JSON. В денежных полях применяется целое количество минимальных единиц, даты аккаунтов и обращений — Unix timestamp в миллисекундах.
Ответы API используют Cache-Control: no-store. Публичный /openapi.json можно кэшировать 5 минут. Нельзя переносить cookie и секреты в адресную строку.
curl 'https://kevmi.one/api/config'
curl 'https://kevmi.one/openapi.json'Авторизация запросов#
Веб-аккаунт использует HttpOnly cookie сессии. GET /api/auth/me возвращает текущего пользователя и csrfToken. Для изменений отправляйте X-CSRF-Token и запрос с того же origin.
API аккаунта использует сессию браузера. Серверные API-ключи Kevmi действуют на /api/v1/payments, /api/v1/payment-links и /api/v1/events согласно своим правам. Они не заменяют cookie сессии для настроек аккаунта и административных действий.
const me = await fetch('/api/auth/me').then(r => r.json());
if (!me.authenticated) throw new Error('Требуется вход');
const response = await fetch('/api/account/settings', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': me.csrfToken
},
body: JSON.stringify({ vatPayer: 'merchant' })
});
if (!response.ok) throw new Error('Настройки не сохранены');
const updated = await response.json();Группы методов#
GET /api/config показывает наличие серверной конфигурации. GET /api/checkout/{token} возвращает invoice.availability для выбранного способа с учётом одобрения магазина и сохранённых условий. Эти проверки не подтверждают доступность провайдера или успешный платёж: результат определяется по проверенной операции шлюза.
| Группа | Назначение |
|---|---|
| Конфигурация и здоровье | Публичная готовность сервиса и хранилища |
| Авторизация | Telegram-подтверждения и сессии |
| Аккаунт | Настройки и приватное приложение магазина |
| /api/v1/payments | Серверное создание и чтение счетов с ограниченным API-ключом; не запускает списание |
| /api/v1/events | Серверный журнал событий с events:read |
| Интеграции | Сессионное управление ключами и адресами вебхуков |
| Заявки и модерация | Собственные заявки, статусы и отдельные права модератора |
| Checkout | Публичный счёт, зашифрованный карточный запрос, конкретная операция, код, статус и сверка |
| Входящий шлюз | Подписанные уведомления v3 и серверная проверка операции |
| Поддержка и уведомления | Вопросы, личные обращения, события и состояние прочтения |
| Telegram | Проверяемый webhook бота |
| Неподдерживаемые денежные маршруты | Старые прямые /api/payments и /api/payouts не создают платёж или выплату |
Публичный запрос к базе знаний#
Ответ содержит mode, answer, sources, knowledgeVersion и needsHuman. Если Origin передан, он должен совпадать с origin приложения. Для чтения из серверного агента Origin можно не передавать.
curl 'https://kevmi.one/api/support/ask' \
-H 'Content-Type: application/json' \
--data '{"question":"Кто оплачивает НДС?"}'Ошибки и ограничения#
Ошибка имеет единый вид с машинным code и сообщением message. Неизвестные поля запроса отклоняются. Для JSON-тел действует лимит 16 384 байта; /api/support/ask и Telegram webhook допускают до 65 536 байт.
Статус 429 означает ограничение частоты. 503 может означать неподключённую интеграцию, а не неудачную оплату. Читайте error.code и не меняйте денежный статус по одному HTTP-коду.
Методы API #
Откройте метод, чтобы посмотреть поля, доступ и ответы. Схемы ниже построены из того же OpenAPI, который доступен по публичному адресу.
Service
Публичные сведения о состоянии.
GET/api/config
Фактическая готовность интеграций
Ответы
200Конфигурация без секретов.
telegramobjectобязательноеsupportobjectобязательноеgatewayobjectобязательноеcapabilitiesobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/health
Состояние API и таблиц D1
not_configured допускает status=ok: публичные страницы и поиск могут работать без DB. Наличие DB с недоступными таблицами даёт 503/degraded. Ответ не проверяет работоспособность Telegram или модели по сети.
Ответы
200Хранилище ready или not_configured.
telegramobjectобязательноеsupportobjectобязательноеgatewayobjectобязательноеcapabilitiesobjectобязательноеstatusok | degradedобязательноеstorageready | not_configured | unavailableобязательное503D1 недоступна либо неожиданная ошибка сервиса.
Вариант 1
telegramobjectобязательноеsupportobjectобязательноеgatewayobjectобязательноеcapabilitiesobjectобязательноеstatusok | degradedобязательноеstorageready | not_configured | unavailableобязательноеВариант 2
errorobjectобязательноеGET/openapi.json
Публичный машиночитаемый контракт
Только чтение. Не содержит секретов, сессий, данных пользователей или рабочего контракта платёжного провайдера.
Ответы
200Этот документ OpenAPI 3.1.
object
POST/api/jobs/dispatch
Run due delivery and application jobs
Server scheduler entrypoint. Requires JOBS_SECRET, not a browser session or merchant key. Does not accept job IDs or arbitrary outbound URLs.
Ответы
200Completed without a background context.
object
202Accepted in a background execution context.
acceptedtrueобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеAuth
Регистрация и вход используют один подтверждённый сценарий Telegram.
GET/api/auth/me
Текущая сессия и CSRF
Ответы
200authenticated=false без действующей сессии.
Вариант 1
authenticatedfalseобязательноеВариант 2
authenticatedtrueобязательноеuserobjectобязательноеcsrfTokenstringобязательноеexpiresAtintegerобязательноеUnix timestamp в миллисекундах, UTC.
503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/auth/telegram/start
Начать вход или регистрацию
Создаёт challenge на 300 секунд и HttpOnly cookie browser proof; максимум 6 запусков в минуту по хешу адреса. Сравните шестизначный код на сайте и в личном чате бота.
Заголовки и параметры
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
Тело JSON
Ответы
201Запрос входа создан; cookie proof привязывает его к исходному браузеру.
challengeIdstringобязательноеcodestringобязательноеexpiresAtintegerобязательноеUnix timestamp в миллисекундах, UTC.
telegramUrlstringобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/auth/telegram/complete
Завершить подтверждённый вход
Требует proof cookie из start и того же браузера. Pending возвращает 202. После подтверждения ботом запрос выдаёт одну сессию на 24 часа. Максимум 90 проверок в минуту на challenge. Значение Telegram ID из браузера не принимается.
Заголовки и параметры
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
Тело JSON
challengeIdstringобязательноеОтветы
200Аккаунт создан/обновлён, сессия выдана.
status"authenticated"обязательноеuserobjectобязательноеcsrfTokenstringобязательноеexpiresAtintegerобязательноеUnix timestamp в миллисекундах, UTC.
202Ожидается подтверждение в Telegram.
status"pending"обязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное410Пятиминутный запрос входа истёк.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/auth/logout
Завершить текущую сессию
Тело не требуется и не читается. /logout в боте отдельно завершает все сессии аккаунта.
Заголовки и параметры
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Ответы
200Сессия удалена, cookie очищена.
loggedOuttrueобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеAccount
Настройки только текущего пользователя.
GET/api/account/settings
Настройки текущего пользователя
Ответы
200Публичная часть собственного профиля.
userobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPATCH/api/account/settings
Изменить название, плательщика НДС или уведомления
Все поля необязательны; частичный patch. Сервер сохраняет настройку vatPayer, но не создаёт денежную операцию. Переключатели payments/payouts не подключают платёжный шлюз.
Заголовки и параметры
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
storeNamestringПробелы по краям удаляются. Длина после удаления: 1–80 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
vatPayercustomer | merchantnotificationsobjectОтветы
200Обновлённый профиль.
userobjectобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPayment links
Серверные счета текущего магазина. Цена, валюта, плательщик НДС, имя продавца и расчёт сохраняются неизменно.
GET/api/payment-links
Список собственных ссылок
Сортировка createdAt DESC, id DESC. Публичные ссылки читаются между устройствами; доступ к списку требует аккаунт.
Заголовки и параметры
limitquerycursorquerynextCursor из предыдущего ответа. Сервис использует base64 JSON [createdAt,id]; клиенту следует передавать значение без изменений через URLSearchParams.
Ответы
200Страница собственных ссылок.
linksarray<object>обязательноеnextCursorstring | nullобязательноеНепрозрачный курсор следующей страницы. Передавайте как query с URL-кодированием; null означает конец.
400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/payment-links
Создать счёт с неизменными условиями
Create an immutable invoice and immediately receive checkoutUrl; this does not charge the buyer. USD: card/Alipay; RUB: SBP; USDT: crypto. USD crypto remains accepted for compatibility but cannot be paid without a USDT invoice. Fee and VAT customer shares are independent integers from 0 to 100; current live card/Alipay supports VAT customer=100 and fee customer=0. The customer total is never silently changed. Latest website application must be approved before a new live charge. Invoice creation and its merchant event commit atomically.
Заголовки и параметры
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Idempotency-KeyheaderобязательноеОдин ключ на логический запрос. Повтор с теми же каноническими полями возвращает исходную запись; другое тело с тем же ключом даёт 409.
Тело JSON
Валюта USD
titlestringобязательноеПробелы по краям удаляются. Длина после удаления: 1–120 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
descriptionstringНеобязательно; пустая строка разрешена. До 500 символов после trim.
amountMinorintegerобязательноеТехническая граница целого значения, не коммерческий лимит провайдера. Отрицательное зачисление отклоняется.
vatPayercustomer | merchantПри отсутствии сохраняется правило текущего магазина.
expiresAtintegerВ будущем, максимум 90 дней от момента создания. По умолчанию 7 дней. Срок сохраняется в снимке счёта.
currency"USD"обязательноеmethodsarray<card | alipay | crypto>обязательноеNew USD checkout supports card and Alipay. USD crypto invoices are accepted only for compatibility and return crypto_requires_usdt at live checkout; use USDT for crypto.
vatCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything. Default: the store’s legacy VAT preference.
feeCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything.
orderIdstringBuyer-visible order reference.
metadataobjectPrivate merchant metadata. At most 3000 UTF-8 bytes after JSON serialization. Never exposed in public checkout.
Валюта RUB
titlestringобязательноеПробелы по краям удаляются. Длина после удаления: 1–120 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
descriptionstringНеобязательно; пустая строка разрешена. До 500 символов после trim.
amountMinorintegerобязательноеТехническая граница целого значения, не коммерческий лимит провайдера. Отрицательное зачисление отклоняется.
vatPayercustomer | merchantПри отсутствии сохраняется правило текущего магазина.
expiresAtintegerВ будущем, максимум 90 дней от момента создания. По умолчанию 7 дней. Срок сохраняется в снимке счёта.
currency"RUB"обязательноеmethodsarray<"sbp">обязательноеvatCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything. Default: the store’s legacy VAT preference.
feeCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything.
orderIdstringBuyer-visible order reference.
metadataobjectPrivate merchant metadata. At most 3000 UTF-8 bytes after JSON serialization. Never exposed in public checkout.
Валюта USDT
titlestringобязательноеПробелы по краям удаляются. Длина после удаления: 1–120 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
descriptionstringНеобязательно; пустая строка разрешена. До 500 символов после trim.
amountMinorintegerобязательноеТехническая граница целого значения, не коммерческий лимит провайдера. Отрицательное зачисление отклоняется.
vatPayercustomer | merchantПри отсутствии сохраняется правило текущего магазина.
expiresAtintegerВ будущем, максимум 90 дней от момента создания. По умолчанию 7 дней. Срок сохраняется в снимке счёта.
currency"USDT"обязательноеmethodsarray<"crypto">обязательноеvatCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything. Default: the store’s legacy VAT preference.
feeCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything.
orderIdstringBuyer-visible order reference.
metadataobjectPrivate merchant metadata. At most 3000 UTF-8 bytes after JSON serialization. Never exposed in public checkout.
Ответы
200Идемпотентный повтор; replayed=true.
linkobjectобязательноеreplayedbooleanобязательноеcheckoutUrlstringобязательноеThe payment link is available immediately; no polling is required.
201Счёт создан; replayed=false.
linkobjectобязательноеreplayedbooleanобязательноеcheckoutUrlstringобязательноеThe payment link is available immediately; no polling is required.
400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/payment-links/{id}
Собственная ссылка и сохранённый расчёт
Заголовки и параметры
idpathобязательноеИдентификатор собственной ссылки; не публичный token.
Ответы
200Чужой и отсутствующий ID одинаково возвращают 404.
linkobjectобязательноеcheckoutUrlstringIncluded in status-update responses; the nested link always contains its checkoutUrl.
401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPATCH/api/payment-links/{id}
Приостановить, возобновить или отменить ссылку
Changes only status. The update and immutable invoice.updated event commit atomically. Concurrent changes use a version check; refresh and retry on LINK_CHANGED. cancelled is terminal, expiration is never extended, and price, methods, cost shares and description stay frozen. Repeating the saved status returns the current invoice.
Заголовки и параметры
idpathобязательноеИдентификатор собственной ссылки; не публичный token.
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
statusactive | paused | cancelledобязательноеОтветы
200Актуальное состояние собственной ссылки.
linkobjectобязательноеcheckoutUrlstringIncluded in status-update responses; the nested link always contains its checkoutUrl.
400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеCheckout
Чтение отдельного счёта без аккаунта. Доступность оплаты проверяется отдельно.
GET/api/checkout/{token}
Публичные детали счёта для покупателя
Read the immutable public invoice quote and its persisted payment snapshot. method must belong to the invoice. No account is required. Does not expose owner identity, private metadata or merchant proceeds. The token grants access only to this checkout. availability reflects configuration, allocation, technical limits and merchant approval; payment confirmation is separate.
Заголовки и параметры
tokenpathобязательноеСлучайный публичный идентификатор из URL страницы оплаты. Даёт чтение только этого счёта.
methodqueryДолжен входить в сохранённый methods счёта.
Ответы
200Public invoice and the existing payment, if dispatched.
invoiceobjectобязательноеpaymentoneOfобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/checkout/{token}/pay
Start or recover the invoice payment
Same-origin buyer operation; no account or CSRF token required. The server reserves one operation and a stable idempotency key before gateway dispatch. A repeat recovers the same operation; a lost response must be resolved through status. The payment method locks after dispatch. Card data must be browser-encrypted with a fresh payment intent. SBP/crypto send the saved customer total; card/Alipay use the supported immutable tax configuration. New charges require an approved merchant application. Existing dispatched payments can be recovered after invoice expiration, pause or approval changes. No /v2 or hosted-card route is used.
Заголовки и параметры
tokenpathобязательноеСлучайный публичный идентификатор из URL страницы оплаты. Даёт чтение только этого счёта.
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
Тело JSON
Вариант 1
method"card"обязательноеsealedobjectобязательноеВариант 2
method"alipay"обязательноеnamestringобязательноеcountry"CN"обязательноеemailstringВариант 3
method"sbp"обязательноеВариант 4
method"crypto"обязательноеpayerCurrencystringобязательноеnetworkstringобязательноеОтветы
200Existing operation recovered; no second payment.
paymentoneOfобязательноеreplayedboolean202Operation dispatched; completion is asynchronous.
paymentoneOfобязательноеreplayedboolean400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное410The gateway encryption intent or bank challenge expired. Obtain a fresh intent for the same operation; do not create a replacement payment.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное502Gateway response unavailable, malformed, or not verifiable. Read the existing payment status before attempting any retry.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/checkout/{token}/status
Read and refresh the same payment
No account is required. Refreshes an existing operation over authenticated gateway transport, with server-side throttling. No new payment is created. Returns null if nothing was dispatched. Confirm an order only when fulfillmentReady is true.
Заголовки и параметры
tokenpathобязательноеСлучайный публичный идентификатор из URL страницы оплаты. Даёт чтение только этого счёта.
Ответы
200Current sanitized payment state.
paymentoneOfобязательноеreplayedboolean400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное502Gateway response unavailable, malformed, or not verifiable. Read the existing payment status before attempting any retry.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/checkout/{token}/reconcile
Request an authoritative status reconciliation
Reads the existing operation and asks the gateway to reconcile its provider status. Does not create a payment. At most 3 requests per invoice per minute. Available for already-dispatched payments even if the invoice is no longer active.
Заголовки и параметры
tokenpathобязательноеСлучайный публичный идентификатор из URL страницы оплаты. Даёт чтение только этого счёта.
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
Тело JSON
Ответы
200Reconciled payment or null.
paymentoneOfобязательноеreplayedboolean400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное410The gateway encryption intent or bank challenge expired. Obtain a fresh intent for the same operation; do not create a replacement payment.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное502Gateway response unavailable, malformed, or not verifiable. Read the existing payment status before attempting any retry.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/checkout/{token}/card-intent
Obtain a gateway public key and a bound encryption intent
The gateway alone owns the private key. An intent expires within five minutes and binds the merchant order, currency, base/total amounts, operation idempotency key and purpose. payment intents require an active invoice and approved merchant; code intents require an existing, current bank challenge. No PAN, CVV, bank code, or private JWK fields are accepted by this endpoint. At most 8 intents per invoice and 12 per client per minute. The encrypted plaintext is {intent,name,country,email?,card:{number,expiration,cvv,holder}} for payment or {intent,code} for code. Plaintext is assembled only inside the browser before JWE encryption.
Заголовки и параметры
tokenpathобязательноеСлучайный публичный идентификатор из URL страницы оплаты. Даёт чтение только этого счёта.
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
Тело JSON
purposepayment | codeОтветы
200Short-lived intent and public RSA key only.
intentstringобязательноеintentIdstringобязательноеexpiresAtintegerобязательноеUnix timestamp в миллисекундах, UTC.
keyobjectобязательноеalgorithm"RSA-OAEP-256"обязательноеencryption"A256GCM"обязательноеprotocol"kevmi-card-v1"обязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное410The gateway encryption intent or bank challenge expired. Obtain a fresh intent for the same operation; do not create a replacement payment.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное502Gateway response unavailable, malformed, or not verifiable. Read the existing payment status before attempting any retry.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/checkout/{token}/code
Relay an encrypted code for the current bank challenge
Obtain a purpose=code intent and encrypt {intent,code} in the browser. The gateway validates the current challenge and consumes the sealed intent once. Kevmi never receives plaintext code. At most 5 submissions per invoice per minute; refresh status after an uncertain response.
Заголовки и параметры
tokenpathобязательноеСлучайный публичный идентификатор из URL страницы оплаты. Даёт чтение только этого счёта.
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
Тело JSON
sealedobjectобязательноеОтветы
202Code sent; current payment state.
paymentoneOfобязательноеreplayedboolean400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное410The gateway encryption intent or bank challenge expired. Obtain a fresh intent for the same operation; do not create a replacement payment.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное502Gateway response unavailable, malformed, or not verifiable. Read the existing payment status before attempting any retry.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/checkout/{token}/crypto-services
Read the current coin and network catalog
Only for a USDT invoice that allows crypto. The invoice remains denominated in USDT; the gateway quotes the chosen payer coin. Never assume USD equals USDT or convert the transfer amount to a floating-point number. At most 10 catalog reads per invoice per minute.
Заголовки и параметры
tokenpathобязательноеСлучайный публичный идентификатор из URL страницы оплаты. Даёт чтение только этого счёта.
Ответы
200Gateway-provided catalog, with current availability and transfer limits.
servicesarray<object>обязательноеfetchedAtintegerобязательноеUnix timestamp в миллисекундах, UTC.
400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное502Gateway response unavailable, malformed, or not verifiable. Read the existing payment status before attempting any retry.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеSupport
Публичная база знаний и собственные обращения.
POST/api/support/ask
Ответ по всей публичной базе знаний
Публичный вопрос без сессии и CSRF. Переданный Origin должен совпасть с APP_ORIGIN; агенты могут не отправлять Origin. В AI-режиме сервер передаёт все опубликованные статьи, факты, каталог страниц и готовность функций. Необязательные history и pageContext используются только как недоверенный контекст вопроса. Доступа к аккаунтам, деньгам, приватным обращениям и инструментам у модели нет. При D1 действует лимит 12 вопросов/минуту по хешу адреса. Режим ai требует D1, корректной конфигурации провайдера и квоты: по умолчанию 60 генераций/час на весь сервис. Готовность конфигурации не подтверждает доступность внешнего API. Ошибка провайдера, превышение квоты или некорректный ответ возвращают search с aiUnavailable=true и HTTP 200. Без генеративной конфигурации возвращается обычный search.
Заголовки и параметры
OriginheaderДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
Тело JSON
questionstringобязательноеПробелы по краям удаляются. Длина после удаления: 2–2000 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
localeru | en | es | de | fr | pt | tr | kkResponse language. If omitted, supported Accept-Language preferences are used; otherwise English. Documentation is available in every supported interface language.
historyarray<oneOf>До трёх последних пар вопрос/ответ. Необязательно. Это недоверенные данные, не сообщения системной роли провайдера.
pageContextstringКороткое название раздела после trim, 1–80 символов. Разрешены буквы, цифры, пробелы и ·.,—–-:(). Переносы строк, URL, query-параметры и HTML запрещены. Не передавайте токены или секреты.
Ответы
200Ответ либо найденный материал с проверенными ссылками на опубликованные статьи.
Вариант 1
mode"search"обязательноеanswerstringобязательноеsourcesarray<object>обязательноеknowledgeVersionstring | nullобязательноеneedsHumanbooleanобязательноеaiUnavailabletrueВариант 2
mode"ai"обязательноеanswerstringобязательноеОбычный текст; URL и HTML не принимаются. Ссылки возвращаются только в sources.
sourcesarray<object>обязательноеknowledgeVersionstringобязательноеneedsHumanbooleanобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/support/tickets
Последние 30 собственных обращений
Ответы
200По убыванию createdAt; возвращаются последние 30 записей.
ticketsarray<object>обязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/support/tickets
Сохранить обращение
До 6 обращений в час на пользователя, общая квота сайта и бота. Сохранение создаёт обращение в аккаунте. Используйте его номер для уточнения статуса.
Заголовки и параметры
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
subjectstringобязательноеПробелы по краям удаляются. Длина после удаления: 1–120 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
messagestringобязательноеПробелы по краям удаляются. Длина после удаления: 5–4000 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
Ответы
201Обращение сохранено.
ticketobjectобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/support/tickets/{id}
Прочитать своё обращение
Заголовки и параметры
idpathобязательноеИдентификатор собственного обращения.
Ответы
200Чужое и отсутствующее обращение одинаково дают 404.
ticketobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPATCH/api/support/tickets/{id}
Закрыть своё обращение
Метод принимает только status=closed. Он не поддерживает повторное открытие, редактирование сообщений или отправку ответов.
Заголовки и параметры
idpathобязательноеИдентификатор собственного обращения.
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
status"closed"обязательноеОтветы
200Обращение закрыто.
closedtrueобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеNotifications
Собственный центр событий, прочтение на сайте и независимое состояние доставки Telegram.
GET/api/notifications
Страница собственных уведомлений
До 30 записей: createdAt DESC, затем id DESC. Чтение списка не меняет readAt и не запускает доставку. unreadCount — общее число непрочитанных событий текущего пользователя, независимо от страницы. Поля владельца, Telegram ID и секреты не возвращаются.
Заголовки и параметры
unreadquery1 — только непрочитанные; 0 или отсутствие — все события.
cursorquerynextCursor предыдущего ответа. Передавайте без изменений через URLSearchParams; формат createdAt:id, createdAt — безопасное целое в миллисекундах.
Ответы
200События с независимыми состояниями прочтения и доставки.
notificationsarray<object>обязательноеunreadCountintegerобязательноеnextCursorstring | nullобязательноеКурсор следующей страницы; null, если больше записей нет.
400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPATCH/api/notifications/read
Отметить собственные уведомления прочитанными
Принимается одна из двух форм: ids либо all:true вместе с before. before — дата последнего уже наблюдавшегося события; значение не должно быть позже текущего времени сервера. Более новые события сохраняются непрочитанными. Повторный запрос идемпотентен: readAt уже прочитанных записей не меняется. Чужие и отсутствующие ids не изменяются и не раскрываются. status и sentAt доставки Telegram остаются прежними.
Заголовки и параметры
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
Вариант 1
idsarray<string>обязательноеДубликаты допустимы и учитываются один раз.
Вариант 2
alltrueобязательноеbeforeintegerобязательноеcreatedAt последнего уже показанного события. Сервер дополнительно требует before <= Date.now().
Ответы
200Количество новых отметок, время операции и актуальный счётчик.
updatedintegerобязательноеreadAtintegerобязательноеUnix timestamp в миллисекундах, UTC.
unreadCountintegerобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/notifications/test
Отправить тестовое уведомление в свой Telegram
Это действие ставит сообщение в очередь и пытается отправить его. Максимум 3/час на пользователя. Тест не является уведомлением об оплате и не меняет баланс. HTTP 202 не подтверждает доставку; проверяйте список уведомлений.
Заголовки и параметры
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
Ответы
202Результат постановки в очередь.
queuedbooleanобязательноеidstring | null400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеTelegram
Webhook бота; не платёжный webhook.
POST/api/telegram/webhook
Принять событие Telegram Bot API
Только секретный заголовок Telegram, без session/CSRF/Origin. Дополнительные поля Update разрешены. Обрабатываются message и callback_query, персональные действия только в private-чате подтверждённого отправителя. Прочие события пропускаются. update_id дедуплицируется; выполняющийся update даёт 503 для повтора. Это не webhook платёжного провайдера.
Тело JSON
update_idintegerобязательноеmessageobjectTelegram Message: обработчик использует message_id, text, from и chat.
callback_queryobjectTelegram CallbackQuery: обработчик использует id, from, data и message.chat.
Ответы
200Обработано, пропущено либо уже обработано ранее.
oktrueобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное502Ошибка обращения к Telegram.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеНеподдерживаемые денежные маршруты
Unsupported legacy money routes and payout execution. The public checkout flow has its own documented endpoints.
POST/api/payments
Денежная операция отключена
Возвращает 503 GATEWAY_NOT_CONNECTED. Денежные операции недоступны. Тело не обрабатывается, запрос к шлюзу не выполняется.
Ответы
503Денежные операции недоступны.
errorobjectобязательноеPOST/api/payouts
Денежная операция отключена
Возвращает 503 GATEWAY_NOT_CONNECTED. Денежные операции недоступны. Тело не обрабатывается, запрос к шлюзу не выполняется.
Ответы
503Денежные операции недоступны.
errorobjectобязательноеMerchant API
Scoped server-to-server invoices and immutable event history.
GET/api/v1/payments
Список собственных ссылок
Сортировка createdAt DESC, id DESC. Публичные ссылки читаются между устройствами; доступ к списку требует аккаунт.
Заголовки и параметры
limitquerycursorquerynextCursor из предыдущего ответа. Сервис использует base64 JSON [createdAt,id]; клиенту следует передавать значение без изменений через URLSearchParams.
Ответы
200Страница собственных ссылок.
linksarray<object>обязательноеnextCursorstring | nullобязательноеНепрозрачный курсор следующей страницы. Передавайте как query с URL-кодированием; null означает конец.
400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/v1/payments
Создать счёт с неизменными условиями
Create an immutable invoice and immediately receive checkoutUrl; this does not charge the buyer. USD: card/Alipay; RUB: SBP; USDT: crypto. USD crypto remains accepted for compatibility but cannot be paid without a USDT invoice. Fee and VAT customer shares are independent integers from 0 to 100; current live card/Alipay supports VAT customer=100 and fee customer=0. The customer total is never silently changed. Latest website application must be approved before a new live charge. Invoice creation and its merchant event commit atomically.
Заголовки и параметры
Idempotency-KeyheaderобязательноеОдин ключ на логический запрос. Повтор с теми же каноническими полями возвращает исходную запись; другое тело с тем же ключом даёт 409.
Тело JSON
Валюта USD
titlestringобязательноеПробелы по краям удаляются. Длина после удаления: 1–120 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
descriptionstringНеобязательно; пустая строка разрешена. До 500 символов после trim.
amountMinorintegerобязательноеТехническая граница целого значения, не коммерческий лимит провайдера. Отрицательное зачисление отклоняется.
vatPayercustomer | merchantПри отсутствии сохраняется правило текущего магазина.
expiresAtintegerВ будущем, максимум 90 дней от момента создания. По умолчанию 7 дней. Срок сохраняется в снимке счёта.
currency"USD"обязательноеmethodsarray<card | alipay | crypto>обязательноеNew USD checkout supports card and Alipay. USD crypto invoices are accepted only for compatibility and return crypto_requires_usdt at live checkout; use USDT for crypto.
vatCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything. Default: the store’s legacy VAT preference.
feeCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything.
orderIdstringBuyer-visible order reference.
metadataobjectPrivate merchant metadata. At most 3000 UTF-8 bytes after JSON serialization. Never exposed in public checkout.
Валюта RUB
titlestringобязательноеПробелы по краям удаляются. Длина после удаления: 1–120 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
descriptionstringНеобязательно; пустая строка разрешена. До 500 символов после trim.
amountMinorintegerобязательноеТехническая граница целого значения, не коммерческий лимит провайдера. Отрицательное зачисление отклоняется.
vatPayercustomer | merchantПри отсутствии сохраняется правило текущего магазина.
expiresAtintegerВ будущем, максимум 90 дней от момента создания. По умолчанию 7 дней. Срок сохраняется в снимке счёта.
currency"RUB"обязательноеmethodsarray<"sbp">обязательноеvatCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything. Default: the store’s legacy VAT preference.
feeCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything.
orderIdstringBuyer-visible order reference.
metadataobjectPrivate merchant metadata. At most 3000 UTF-8 bytes after JSON serialization. Never exposed in public checkout.
Валюта USDT
titlestringобязательноеПробелы по краям удаляются. Длина после удаления: 1–120 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
descriptionstringНеобязательно; пустая строка разрешена. До 500 символов после trim.
amountMinorintegerобязательноеТехническая граница целого значения, не коммерческий лимит провайдера. Отрицательное зачисление отклоняется.
vatPayercustomer | merchantПри отсутствии сохраняется правило текущего магазина.
expiresAtintegerВ будущем, максимум 90 дней от момента создания. По умолчанию 7 дней. Срок сохраняется в снимке счёта.
currency"USDT"обязательноеmethodsarray<"crypto">обязательноеvatCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything. Default: the store’s legacy VAT preference.
feeCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything.
orderIdstringBuyer-visible order reference.
metadataobjectPrivate merchant metadata. At most 3000 UTF-8 bytes after JSON serialization. Never exposed in public checkout.
Ответы
200Идемпотентный повтор; replayed=true.
linkobjectобязательноеreplayedbooleanобязательноеcheckoutUrlstringобязательноеThe payment link is available immediately; no polling is required.
201Счёт создан; replayed=false.
linkobjectобязательноеreplayedbooleanобязательноеcheckoutUrlstringобязательноеThe payment link is available immediately; no polling is required.
400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/v1/payments/{id}
Собственная ссылка и сохранённый расчёт
Заголовки и параметры
idpathобязательноеИдентификатор собственной ссылки; не публичный token.
Ответы
200Чужой и отсутствующий ID одинаково возвращают 404.
linkobjectобязательноеcheckoutUrlstringIncluded in status-update responses; the nested link always contains its checkoutUrl.
401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPATCH/api/v1/payments/{id}
Приостановить, возобновить или отменить ссылку
Changes only status. The update and immutable invoice.updated event commit atomically. Concurrent changes use a version check; refresh and retry on LINK_CHANGED. cancelled is terminal, expiration is never extended, and price, methods, cost shares and description stay frozen. Repeating the saved status returns the current invoice.
Заголовки и параметры
idpathобязательноеИдентификатор собственной ссылки; не публичный token.
Тело JSON
statusactive | paused | cancelledобязательноеОтветы
200Актуальное состояние собственной ссылки.
linkobjectобязательноеcheckoutUrlstringIncluded in status-update responses; the nested link always contains its checkoutUrl.
400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/v1/payment-links
Список собственных ссылок
Сортировка createdAt DESC, id DESC. Публичные ссылки читаются между устройствами; доступ к списку требует аккаунт.
Заголовки и параметры
limitquerycursorquerynextCursor из предыдущего ответа. Сервис использует base64 JSON [createdAt,id]; клиенту следует передавать значение без изменений через URLSearchParams.
Ответы
200Страница собственных ссылок.
linksarray<object>обязательноеnextCursorstring | nullобязательноеНепрозрачный курсор следующей страницы. Передавайте как query с URL-кодированием; null означает конец.
400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/v1/payment-links
Создать счёт с неизменными условиями
Create an immutable invoice and immediately receive checkoutUrl; this does not charge the buyer. USD: card/Alipay; RUB: SBP; USDT: crypto. USD crypto remains accepted for compatibility but cannot be paid without a USDT invoice. Fee and VAT customer shares are independent integers from 0 to 100; current live card/Alipay supports VAT customer=100 and fee customer=0. The customer total is never silently changed. Latest website application must be approved before a new live charge. Invoice creation and its merchant event commit atomically.
Заголовки и параметры
Idempotency-KeyheaderобязательноеОдин ключ на логический запрос. Повтор с теми же каноническими полями возвращает исходную запись; другое тело с тем же ключом даёт 409.
Тело JSON
Валюта USD
titlestringобязательноеПробелы по краям удаляются. Длина после удаления: 1–120 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
descriptionstringНеобязательно; пустая строка разрешена. До 500 символов после trim.
amountMinorintegerобязательноеТехническая граница целого значения, не коммерческий лимит провайдера. Отрицательное зачисление отклоняется.
vatPayercustomer | merchantПри отсутствии сохраняется правило текущего магазина.
expiresAtintegerВ будущем, максимум 90 дней от момента создания. По умолчанию 7 дней. Срок сохраняется в снимке счёта.
currency"USD"обязательноеmethodsarray<card | alipay | crypto>обязательноеNew USD checkout supports card and Alipay. USD crypto invoices are accepted only for compatibility and return crypto_requires_usdt at live checkout; use USDT for crypto.
vatCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything. Default: the store’s legacy VAT preference.
feeCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything.
orderIdstringBuyer-visible order reference.
metadataobjectPrivate merchant metadata. At most 3000 UTF-8 bytes after JSON serialization. Never exposed in public checkout.
Валюта RUB
titlestringобязательноеПробелы по краям удаляются. Длина после удаления: 1–120 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
descriptionstringНеобязательно; пустая строка разрешена. До 500 символов после trim.
amountMinorintegerобязательноеТехническая граница целого значения, не коммерческий лимит провайдера. Отрицательное зачисление отклоняется.
vatPayercustomer | merchantПри отсутствии сохраняется правило текущего магазина.
expiresAtintegerВ будущем, максимум 90 дней от момента создания. По умолчанию 7 дней. Срок сохраняется в снимке счёта.
currency"RUB"обязательноеmethodsarray<"sbp">обязательноеvatCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything. Default: the store’s legacy VAT preference.
feeCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything.
orderIdstringBuyer-visible order reference.
metadataobjectPrivate merchant metadata. At most 3000 UTF-8 bytes after JSON serialization. Never exposed in public checkout.
Валюта USDT
titlestringобязательноеПробелы по краям удаляются. Длина после удаления: 1–120 символов. Управляющие символы, кроме табуляции и перевода строки, запрещены.
descriptionstringНеобязательно; пустая строка разрешена. До 500 символов после trim.
amountMinorintegerобязательноеТехническая граница целого значения, не коммерческий лимит провайдера. Отрицательное зачисление отклоняется.
vatPayercustomer | merchantПри отсутствии сохраняется правило текущего магазина.
expiresAtintegerВ будущем, максимум 90 дней от момента создания. По умолчанию 7 дней. Срок сохраняется в снимке счёта.
currency"USDT"обязательноеmethodsarray<"crypto">обязательноеvatCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything. Default: the store’s legacy VAT preference.
feeCustomerPercentintegerCustomer share, as a whole percentage. 0 means the merchant covers everything; 100 means the customer covers everything.
orderIdstringBuyer-visible order reference.
metadataobjectPrivate merchant metadata. At most 3000 UTF-8 bytes after JSON serialization. Never exposed in public checkout.
Ответы
200Идемпотентный повтор; replayed=true.
linkobjectобязательноеreplayedbooleanобязательноеcheckoutUrlstringобязательноеThe payment link is available immediately; no polling is required.
201Счёт создан; replayed=false.
linkobjectобязательноеreplayedbooleanобязательноеcheckoutUrlstringобязательноеThe payment link is available immediately; no polling is required.
400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/v1/payment-links/{id}
Собственная ссылка и сохранённый расчёт
Заголовки и параметры
idpathобязательноеИдентификатор собственной ссылки; не публичный token.
Ответы
200Чужой и отсутствующий ID одинаково возвращают 404.
linkobjectобязательноеcheckoutUrlstringIncluded in status-update responses; the nested link always contains its checkoutUrl.
401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPATCH/api/v1/payment-links/{id}
Приостановить, возобновить или отменить ссылку
Changes only status. The update and immutable invoice.updated event commit atomically. Concurrent changes use a version check; refresh and retry on LINK_CHANGED. cancelled is terminal, expiration is never extended, and price, methods, cost shares and description stay frozen. Repeating the saved status returns the current invoice.
Заголовки и параметры
idpathобязательноеИдентификатор собственной ссылки; не публичный token.
Тело JSON
statusactive | paused | cancelledобязательноеОтветы
200Актуальное состояние собственной ссылки.
linkobjectобязательноеcheckoutUrlstringIncluded in status-update responses; the nested link always contains its checkoutUrl.
400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/api-keys
List own key metadata
Ответы
200Secrets and secret hashes are omitted.
keysarray<object>обязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/api-keys
Create a scoped key; reveal its secret once
Maximum 10 active keys. At most 5 creations/hour/user. Keys expire, can be revoked and are rate-limited to 90 API requests/minute/key.
Заголовки и параметры
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
namestringобязательноеscopesarray<invoices:read | invoices:write | events:read>expiresInDaysintegerОтветы
201Store the secret securely on your server.
keyobjectобязательноеsecretstringобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеDELETE/api/api-keys/{id}
Revoke own key
Заголовки и параметры
idpathобязательноеOriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Ответы
200Future uses of the key are rejected.
revokedtrueобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/events
Read own immutable event history
Заголовки и параметры
beforequeryLegacy exclusive timestamp boundary. Cannot be combined with cursor. Use nextCursor for lossless pagination.
cursorqueryOpaque nextCursor returned by the previous page. Encodes [createdAt,id] and preserves events sharing one timestamp.
Ответы
200Newest first; up to 50 events. Follow nextCursor until null.
eventsarray<object>обязательноеnextCursorstring | nullобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/v1/events
Read own immutable event history
Заголовки и параметры
beforequeryLegacy exclusive timestamp boundary. Cannot be combined with cursor. Use nextCursor for lossless pagination.
cursorqueryOpaque nextCursor returned by the previous page. Encodes [createdAt,id] and preserves events sharing one timestamp.
Ответы
200Newest first; up to 50 events. Follow nextCursor until null.
eventsarray<object>обязательноеnextCursorstring | nullобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеWebhooks
Verified HTTPS endpoints, signed events, delivery attempts and retries.
GET/api/webhooks
List endpoints and last 30 deliveries
Ответы
200No signing secrets are returned.
endpointsarray<object>обязательноеdeliveriesarray<object>обязательноеavailablebooleanобязательноеeventTypesarray<invoice.created | invoice.updated | payment.succeeded | payment.failed | payment.refunded | payment.partially_refunded | payment.disputed | payment.review_required>обязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/webhooks
Register a public HTTPS destination
Up to 5 endpoints and 6 creations/hour/user. Public HTTPS domains only; no credentials, IP literals or custom ports. A newly created endpoint receives no live deliveries until its challenge succeeds.
Заголовки и параметры
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
urlstringобязательноеdescriptionstringeventsarray<invoice.created | invoice.updated | payment.succeeded | payment.failed | payment.refunded | payment.partially_refunded | payment.disputed | payment.review_required>Ответы
201Save the one-time signing secret.
endpointobjectобязательноеsecretstringобязательноеShown only on create/rotate. Stored encrypted server-side.
400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/webhooks/{id}
List endpoints and last 30 deliveries
Заголовки и параметры
idpathобязательноеОтветы
200No signing secrets are returned.
endpointsarray<object>обязательноеdeliveriesarray<object>обязательноеavailablebooleanобязательноеeventTypesarray<invoice.created | invoice.updated | payment.succeeded | payment.failed | payment.refunded | payment.partially_refunded | payment.disputed | payment.review_required>обязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPATCH/api/webhooks/{id}
Pause or resume a verified endpoint
Paused verified endpoints keep eligible events in the queue; resuming processes due deliveries.
Заголовки и параметры
idpathобязательноеOriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
statusactive | pausedобязательноеОтветы
200Status saved.
updatedtrueобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеDELETE/api/webhooks/{id}
Remove endpoint and cancel undelivered jobs
Cancels pending, failed and leased jobs. A request already sent across the network cannot be recalled.
Заголовки и параметры
idpathобязательноеOriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Ответы
200Endpoint removed.
deletedtrueобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/webhooks/{id}/verify
Send a signed endpoint.verification challenge
Maximum 5 verification attempts/hour/user. Your server must validate Kevmi-Signature and return 2xx JSON {"challenge":"<data.challenge>"}. Request timeout: 8 seconds; response cap: 8192 bytes. Redirects are not followed. Verification activates the endpoint.
Заголовки и параметры
idpathобязательноеOriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
Ответы
200Verified and active.
verifiedtrueобязательноеendpointobjectобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное422Destination could not be verified.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/webhooks/{id}/rotate
Replace signing secret and require verification again
Maximum 3 rotations/hour/user. Update your server and verify the endpoint again. An already in-flight request may still carry the previous signature.
Заголовки и параметры
idpathобязательноеOriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
Ответы
200New secret shown once.
secretstringобязательноеShown only on create/rotate. Stored encrypted server-side.
requiresVerificationtrueобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/webhooks/{id}/deliveries/{deliveryId}/retry
Retry a failed delivery to an active endpoint
Retains event ID and payload; generates a fresh timestamp and signature. Each automatic delivery cycle makes at most 6 attempts, including expired leases, with delays of 1m, 5m, 30m, 2h and 12h. Delivery is at least once; deduplicate event IDs on your server.
Заголовки и параметры
idpathобязательноеdeliveryIdpathобязательноеOriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
Ответы
202Retry scheduled.
queuedtrueобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеApplications
Authenticated website applications and individual tracking.
GET/api/applications
List up to 30 own applications
Заголовки и параметры
X-Kevmi-LocaleheaderTracking URL and system-message language. Without a supported value, same-origin referrer and browser language are considered; fallback is English.
Ответы
200Newest first.
applicationsarray<object>обязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/applications
Submit website information and receive a tracking URL
Requires confirmed Telegram sign-in. Up to 5 new submissions/day/user. Idempotent replay returns 200. The server advances real persisted stages; unavailable or risky automatic results require human review. Approval does not configure the payment gateway. Ownership and state cannot be supplied by the applicant.
Заголовки и параметры
OriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Idempotency-KeyheaderобязательноеОдин ключ на логический запрос. Повтор с теми же каноническими полями возвращает исходную запись; другое тело с тем же ключом даёт 409.
X-Kevmi-LocaleheaderTracking URL and system-message language. Without a supported value, same-origin referrer and browser language are considered; fallback is English.
Тело JSON
websiteUrlstringобязательноеPublic HTTPS domain without credentials, query parameters, IP literals or custom ports. A fragment is removed during normalization.
businessNamestringобязательноеbusinessTypedigital_goods | software | services | physical_goods | education | otherобязательноеdescriptionstringобязательноеcontactTelegramstringобязательноеA 5–32 character Telegram username beginning with a letter, then letters/digits/underscores. Optional @ or https://t.me/ prefix; surrounding whitespace is trimmed. Stored as @username.
consenttrueобязательноеОтветы
200Existing submission.
applicationobjectобязательноеurlstringобязательноеreplayedbooleanобязательное202Accepted; processing continues on the server.
applicationobjectобязательноеurlstringобязательноеreplayedbooleanобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/applications/{id}
Read own review stages and event history
Заголовки и параметры
idpathобязательноеX-Kevmi-LocaleheaderTracking URL and system-message language. Without a supported value, same-origin referrer and browser language are considered; fallback is English.
Ответы
200Private applicant projection. Evidence and model output are not exposed.
applicationobjectобязательноеeventsarray<object>обязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/applications/{id}/resume
Resume an eligible background stage
Cannot skip review or approve a stage. A server lease prevents duplicate work. Needs-review and final applications remain unchanged. At most 30 processing-resume requests/minute/user.
Заголовки и параметры
idpathобязательноеOriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
X-Kevmi-LocaleheaderTracking URL and system-message language. Without a supported value, same-origin referrer and browser language are considered; fallback is English.
Тело JSON
Ответы
200No processing needed.
applicationobjectобязательное202Processing scheduled.
applicationobjectобязательноеscheduledtrueобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеModeration
Allowlisted Telegram moderators; every decision is version-checked.
GET/api/moderation/applications
List up to 100 applications for moderation
Requires the authenticated Telegram identity to be in MODERATOR_TELEGRAM_IDS. Includes all states, ordered needs_review first, processing second, then final states; newest updates first within a group.
Ответы
200Moderator queue.
applicationsarray<object>обязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGET/api/moderation/applications/{id}
Read review evidence and stage history
Заголовки и параметры
idpathобязательноеОтветы
200Private moderator evidence.
applicationobjectобязательноеeventsarray<object>обязательноеevidenceobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеPOST/api/moderation/applications/{id}/decision
Approve the current review stage or decline with a public reason
Requires a configured moderator; at most 30 decisions/minute/user. expectedVersion is compared atomically. Only the current needs_review stage can be approved; final applications cannot be silently reopened. A rejection requires an editable public reason. The decision, stage history and enabled applicant notification are saved together.
Заголовки и параметры
idpathобязательноеOriginheaderобязательноеДолжен точно совпасть с настроенным APP_ORIGIN. Sec-Fetch-Site: cross-site отклоняется. Сервер не предоставляет CORS-доступ.
X-CSRF-TokenheaderобязательноеТокен текущей сессии из GET /api/auth/me или успешного завершения входа.
Тело JSON
Вариант 1
expectedVersionintegerобязательноеaction"approve_step"обязательноеreasonstringВариант 2
expectedVersionintegerобязательноеaction"reject"обязательноеreasonstringобязательноеОтветы
200Decision saved.
applicationobjectобязательное400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401Нет действующей сессии; для webhook — неверный секрет.
errorobjectобязательное403Не пройдена проверка Origin, CSRF или привязки входа к браузеру.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409Запрос входа уже использован/отменён, личность ещё не подтверждена или конфликт обращения.
errorobjectобязательное429Лимит частоты превышен.
errorobjectобязательное503Интеграция или хранилище не настроены, событие обрабатывается либо сервис недоступен.
errorobjectобязательноеGateway events
Source-native gateway events are verified, then the authoritative payment is read over authenticated server transport. Merchant-facing webhooks use a separate signature and delivery queue.
POST/api/gateway/webhook
Receive signed source-native gateway events
Native v3: supply X-Gateway-Timestamp (Unix seconds), X-Gateway-Signature and matching X-Gateway-Event-Id. Maximum timestamp skew is 300 seconds. After signature verification, Kevmi fetches the payment through the authenticated gateway API, checks saved order, exact currency/amount, method and provider-confirmed state, then atomically stores the receipt and merchant outbox event. Webhook text and browser observations alone never confirm a payment. Repeated IDs are deduplicated; a changed body for an existing ID is rejected. Delayed events use fresh authoritative state. Partial refunds, full refunds, disputes and review states are supported. Unbound orders are acknowledged and ignored. Legacy normalized events using Kevmi-Signature remain supported separately; only their succeeded/failed/full-refunded transitions apply.
Заголовки и параметры
X-Gateway-TimestampheaderRequired for native v3 events.
X-Gateway-Event-IdheaderRequired for native v3; must match body.id.
Тело JSON
Вариант 1
idstringобязательноеapi_version"3"обязательноеmode"live"обязательноеtypestringобязательноеdataobjectобязательноеВариант 2
eventIdstringобязательноеpaymentIdstringобязательноеinvoiceIdstringобязательноеstatussucceeded | failed | refundedобязательноеamountMinorintegerобязательноеЦелое количество минимальных денежных единиц.
currencyUSD | RUB | USDTобязательноеInvoice units: USD cents, RUB kopecks, or hundredths of USDT. No automatic currency conversion.
methodcard | alipay | sbp | cryptoобязательноеoccurredAtintegerобязательноеUnix timestamp в миллисекундах, UTC.
Ответы
200Received, deduplicated, or safely ignored.
receivedtrueобязательноеreplayedbooleanignoredbooleanappliedboolean400Некорректный JSON, неизвестное поле или недопустимое значение.
errorobjectобязательное401The gateway signature is missing, invalid or outside the accepted time window.
errorobjectобязательное404Запись отсутствует, публичный token неверен или собственная запись принадлежит другому пользователю.
errorobjectобязательное409An event ID was reused with changed content or a payment ID conflicts with the saved invoice binding.
errorobjectобязательное413Превышен размер тела: 16 384 байта; для /api/support/ask и Telegram webhook 65 536 байт.
errorobjectобязательное415Ожидается Content-Type: application/json.
errorobjectобязательное429The gateway is busy; retry webhook delivery with the same event ID.
errorobjectобязательное502Gateway response unavailable, malformed, or not verifiable. Read the existing payment status before attempting any retry.
errorobjectобязательное503The gateway configuration or signing secret is missing.
errorobjectобязательное