API от имени пользователя
Публичная документация методов, которые работают по секретному ключу пользователя, а не по токену бота.
Токен бота здесь не нужен. Ключ пользователя действует только на одного человека в одном боте.
Все методы — POST с телом JSON.
Content-Type: application/json
https://api.bot-t.com
Формат ответа:
{ "result": true, "data": ... }
{ "result": false, "message": "текст ошибки" }
Всегда проверяйте result === true перед использованием data.
Лимит: 120 запросов в минуту с одного IP.
Секретный ключ пользователя
В ответах API пользователя поле называется secret_user_key.
В запросах модулей то же значение передаётся как secret_key.
Это один и тот же ключ. Он привязан к паре «пользователь + бот».
| Как получить | Где взять ключ |
|---|---|
POST /v1/bot/user/view, view-by-telegram-id и другие методы просмотра пользователя | Поле secret_user_key в объекте пользователя |
POST /v1/module/bot/check-hash | Поле secret_user_key после проверки Telegram Web App |
POST /v1/module/user/check-secret | Проверяет уже известный ключ и возвращает пользователя |
Ключ не логируйте и не отдавайте в публичный фронтенд вместе с private_key модуля. Для Web App достаточно bot_id, user_id и secret_user_key.
Два способа авторизации
| Для кого | Поля | user_id | Сумма баланса |
|---|---|---|---|
| Модуль на своём сервере | public_key, private_key, secret_key | Telegram ID | amount в копейках |
| Web App / клиент пользователя | bot_id, secret_user_key | ID пользователя в боте (id из объекта пользователя) | методы ниже баланс не меняют |
private_key модуля храните только на сервере модуля.
Как получить ключ: POST /v1/module/bot/check-hash
Проверяет данные Telegram Web App или Login Widget и возвращает пользователя вместе с secret_user_key.
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
bot_id | integer | да | ID бота |
userData | string | да | Сырая строка Telegram.WebApp.initData (с hash) |
bot_clone_id | integer | нет | ID клона, если Web App открыт у клона |
{
"bot_id": 12,
"userData": "query_id=AAH...&user=%7B%22id%22%3A182352323552%7D&auth_date=1716288000&hash=..."
}
В data — объект пользователя. Дальше используйте data.id (ID в боте) и data.secret_user_key.
Методы модуля
Нужны ключи экземпляра модуля. user_id и id здесь — Telegram ID.
| Метод | URL | Назначение |
|---|---|---|
check-secret | POST /v1/module/user/check-secret | Проверить ключ и получить пользователя |
add-balance | POST /v1/module/user/add-balance | Начислить баланс |
subtract-balance | POST /v1/module/user/subtract-balance | Списать баланс |
create-conclusion | POST /v1/module/replenishment/create-conclusion | Заявка на вывод |
withdrawal-history | POST /v1/module/referral/withdrawal-history | История заявок на вывод |
Комментарий у начисления и списания обязателен. Пустая строка не принимается.
amount — целое число в минимальных единицах валюты. 1500 = 15.00. Это не то же самое, что sum в API бота.
Повтор с тем же operation_id не меняет баланс второй раз. Максимум 64 символа.
POST /v1/module/user/check-secret
Проверяет, что secret_key принадлежит пользователю с этим Telegram ID в боте модуля.
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
public_key | string | да | Публичный ключ модуля |
private_key | string | да | Приватный ключ модуля |
id | integer | да | Telegram ID |
secret_key | string | да | Секрет пользователя |
{
"public_key": "...",
"private_key": "...",
"id": 182352323552,
"secret_key": "k7f3a9b2c1d4e5f6"
}
В ответе — объект пользователя, в том числе id (ID в боте), money и secret_user_key.
| Сообщение | Причина |
|---|---|
Неверный или отсутствует id / Неверный формат id | Нет или неверный Telegram ID |
Неверный или отсутствует public_key / private_key / secret_key | Нет или неверный формат ключа |
secret key not valid 2 | Ключ не подходит этому Telegram ID и боту |
WebModuleBot not found. | Модуль с такими ключами не найден |
POST /v1/module/user/add-balance
Начисляет сумму. Операция сразу считается выполненной. Пишется в историю.
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
public_key | string | да | Публичный ключ модуля |
private_key | string | да | Приватный ключ модуля |
user_id | integer | да | Telegram ID |
secret_key | string | да | Секрет пользователя |
amount | integer | да | Сумма в копейках, больше 0 |
comment | string | да | Комментарий. Пустая строка не принимается |
operation_id | string | нет | Ключ идемпотентности, до 64 символов |
{
"public_key": "...",
"private_key": "...",
"user_id": 182352323552,
"secret_key": "k7f3a9b2c1d4e5f6",
"amount": 1500,
"comment": "Возврат за заказ 555",
"operation_id": "refund-555"
}
{
"result": true,
"data": {
"id": 88,
"bot_id": 12,
"money": 6500,
"secret_user_key": "k7f3a9b2c1d4e5f6",
"user": {
"id": 50,
"telegram_id": 182352323552
}
}
}
money в ответе — баланс после операции, в копейках.
Штатные уведомления о пополнении уходят, если они настроены в боте. Отдельного флага «не уведомлять» у модульного API нет.
POST /v1/module/user/subtract-balance
Списывает сумму. Если средств меньше, чем amount, баланс не меняется.
Набор полей такой же, как у начисления.
{
"public_key": "...",
"private_key": "...",
"user_id": 182352323552,
"secret_key": "k7f3a9b2c1d4e5f6",
"amount": 1500,
"comment": "Оплата заказа 555",
"operation_id": "order-555-pay"
}
| Сообщение | Причина |
|---|---|
public_key not found / private_key not found | Не переданы ключи модуля |
user_id not found / secret_key not found | Не переданы данные пользователя |
amount not found | Не передана сумма |
amount must be greater than 0 | Сумма ≤ 0 |
comment not found | Нет комментария или пустая строка |
secret key not valid | Ключ не подходит этому пользователю |
У Вас закончился баланс в боте. Пополните его! | Недостаточно средств |
operation_id is too long | Ключ длиннее 64 символов |
POST /v1/module/replenishment/create-conclusion
Создаёт заявку на вывод и отправляет пользователю в бот цепочку вопросов.
Нужен только public_key (без private_key). В боте должна быть включена система выводов с формой обратной связи.
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
public_key | string | да | Публичный ключ модуля |
user_id | integer | да | Telegram ID |
secret_key | string | да | Секрет пользователя |
amount | integer | да | Сумма вывода в копейках, больше 0 |
Если в боте задан процент за вывод, с баланса списывается сумма плюс комиссия. При нехватке средств заявка не создаётся.
{
"public_key": "...",
"user_id": 182352323552,
"secret_key": "k7f3a9b2c1d4e5f6",
"amount": 50000
}
В data:
replenishment_user— созданная заявка;bot_user— пользователь с балансом после списания.
POST /v1/module/referral/withdrawal-history
История заявок на вывод текущего пользователя.
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
public_key | string | да | Публичный ключ модуля |
user_id | integer | да | Telegram ID |
secret_key | string | да | Секрет пользователя |
limit | integer | нет | По умолчанию 20, максимум 100 |
offset | integer | нет | Сдвиг, по умолчанию 0 |
{
"public_key": "...",
"user_id": 182352323552,
"secret_key": "k7f3a9b2c1d4e5f6",
"limit": 20,
"offset": 0
}
{
"result": true,
"data": {
"total": 3,
"limit": 20,
"offset": 0,
"items": []
}
}
Методы Web App
Токен бота и ключи модуля не нужны. user_id — ID пользователя в боте.
| Метод | URL | Назначение |
|---|---|---|
index | POST /v1/bot/user/referral/index | Список рефералов |
count | POST /v1/bot/user/referral/count | Количество рефералов |
referrer | POST /v1/bot/user/referral/referrer | Кто пригласил |
personal-percent | POST /v1/bot/user/referral/personal-percent | Персональный реферальный процент |
statistics | POST /v1/bot/user/referral/statistics | Статистика по приглашённым |
balance-referral | POST /v1/bot/user/referral/balance-referral | Реферальные начисления на баланс |
referrals-balance | POST /v1/bot/user/referral/referrals-balance | Пополнения баланса рефералов |
replenishment-statistics | POST /v1/bot/user/referral/replenishment-statistics | Пополнения рефералов по типам |
conclusion-withdrawals | POST /v1/bot/user/referral/conclusion-withdrawals | Заявки на вывод |
withdrawal-history | POST /v1/bot/user/referral/withdrawal-history | История выводов с пагинацией |
Общие поля всех этих методов:
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
bot_id | integer | да | ID бота |
user_id | integer | да | ID пользователя в боте |
secret_user_key | string | да | Секрет пользователя |
В ответах secret_user_key не возвращается.
POST /v1/bot/user/referral/index
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
limit | integer | 5 | Записей на страницу, максимум 50 |
offset | integer | 0 | Сдвиг |
{
"bot_id": 12,
"user_id": 88,
"secret_user_key": "k7f3a9b2c1d4e5f6",
"limit": 50,
"offset": 0
}
В ответе — массив рефералов. Новые сверху.
POST /v1/bot/user/referral/count
{
"bot_id": 12,
"user_id": 88,
"secret_user_key": "k7f3a9b2c1d4e5f6"
}
data — строка с числом.
POST /v1/bot/user/referral/referrer
{
"result": true,
"data": {
"referrer": {
"id": 10,
"telegram_id": 111111111,
"username": "inviter"
}
}
}
Если пригласившего нет, referrer равен null.
POST /v1/bot/user/referral/personal-percent
{
"result": true,
"data": {
"personal_referral_percent": 15
}
}
Если процент не задан — HTTP 404 и сообщение Персональный реферальный процент не задан.
POST /v1/bot/user/referral/statistics
Статистика по числу приглашённых. Дополнительных полей нет.
POST /v1/bot/user/referral/balance-referral
Сумма и количество реферальных начислений на баланс текущего пользователя.
POST /v1/bot/user/referral/referrals-balance
Пополнения баланса у приглашённых, без системных типов операций.
POST /v1/bot/user/referral/replenishment-statistics
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
balance_id | integer[] | да | Типы операций, непустой массив |
balance_not_id | integer[] | нет | Типы, которые нужно исключить |
is_positive | boolean | нет | Только начисления. По умолчанию true |
{
"bot_id": 12,
"user_id": 88,
"secret_user_key": "k7f3a9b2c1d4e5f6",
"balance_id": [1, 2],
"is_positive": true
}
POST /v1/bot/user/referral/conclusion-withdrawals
Заявки на вывод. В боте должна быть включена система выводов с формой обратной связи.
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
limit | integer | 500 | Максимум 500 |
offset | integer | 0 | Сдвиг |
В ответе — массив заявок.
POST /v1/bot/user/referral/withdrawal-history
Та же история выводов, но без требования включённой формы. Ответ с пагинацией.
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
limit | integer | 20 | Максимум 100 |
offset | integer | 0 | Сдвиг |
{
"result": true,
"data": {
"total": 3,
"limit": 20,
"offset": 0,
"items": []
}
}
Другие API с тем же ключом
Тот же secret_user_key принимают публичные методы магазина, корзины и цифровых заказов.
Создание заказа из модуля: POST /v1/module/shop/order-create — те же public_key, private_key, Telegram ID и secret_key.
Типичные ошибки
| Сообщение | Причина |
|---|---|
bot_id not found | Не передан bot_id (Web App) |
not found user_id | Не передан user_id (Web App) |
Используйте официальный клиент телеграм и убедитесь, что у вас последняя версия. | Нет secret_user_key |
public_key not found / private_key not found | Нет ключей модуля |
secret_key not found | Нет секрета пользователя в модульном API |
secret key not valid | Ключ не подходит этому пользователю и боту |
amount not found / amount must be greater than 0 | Нет суммы или она ≤ 0 |
comment not found | Нет комментария у начисления или списания |
У Вас закончился баланс в боте. Пополните его! | Недостаточно средств |
operation_id is too long | Ключ длиннее 64 символов |
Примеры кода
Модуль: списать баланс (PHP)
<?php
const API_BASE = 'https://api.bot-t.com';
const PUBLIC_KEY = '...';
const PRIVATE_KEY = '...';
function moduleUserRequest(string $action, array $body): array
{
$url = API_BASE . '/v1/module/user/' . $action;
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(array_merge([
'public_key' => PUBLIC_KEY,
'private_key' => PRIVATE_KEY,
], $body)),
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
if (!is_array($data) || ($data['result'] ?? false) !== true) {
throw new RuntimeException($data['message'] ?? 'API error');
}
return $data['data'];
}
$checked = moduleUserRequest('check-secret', [
'id' => 182352323552,
'secret_key' => 'k7f3a9b2c1d4e5f6',
]);
moduleUserRequest('subtract-balance', [
'user_id' => 182352323552,
'secret_key' => 'k7f3a9b2c1d4e5f6',
'amount' => 1500,
'comment' => 'Оплата заказа 555',
'operation_id' => 'order-555-pay',
]);
Web App: список рефералов (JavaScript)
const API_BASE = 'https://api.bot-t.com';
async function referralRequest(action, body) {
const response = await fetch(`${API_BASE}/v1/bot/user/referral/${action}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
const json = await response.json();
if (!json.result) {
throw new Error(json.message || 'API error');
}
return json.data;
}
const referrals = await referralRequest('index', {
bot_id: 12,
user_id: 88,
secret_user_key: 'k7f3a9b2c1d4e5f6',
limit: 50,
offset: 0,
});
private_key модуля не вызывайте из браузера. Для Web App используйте только bot_id, user_id и secret_user_key.