GMT Partner API
Подключите свой Telegram-бот, сайт или сервис к GMT: показывайте каталог, создавайте заказы и автоматически получайте Telegram-аккаунты.
https://getmytelegram-api.duckdns.org/api/v1UTF-8 · запросы и ответы JSON · все суммы в рублях
Быстрый старт
В GMT откройте Профиль → API для партнёров и создайте ключ.
Пополните обычный баланс GMT. Отдельного API-баланса нет.
Получите GET /products и выберите product_id.
Создайте POST /orders и проверяйте статус заказа.
Первый безопасный запрос
curl https://getmytelegram-api.duckdns.org/api/v1/me \ -H "Authorization: Bearer ВАШ_API_КЛЮЧ"
Авторизация
Во все методы /api/v1/... передавайте:
Authorization: Bearer gmt_live_...
- Одновременно действует один ключ.
- Ключ можно снова посмотреть в меню бота.
- После отзыва старый ключ сразу перестаёт работать.
- Не передавайте ключ в URL.
Сценарий покупки от А до Я
- Проверьте баланс:
GET /me. - Получите актуальные цену и остаток:
GET /products. - Покажите клиенту короткое условие о видеозаписи:
GET /recommendations. - После согласия отправьте
POST /ordersс новымIdempotency-Key. - API атомарно спишет баланс и вернёт HTTP
202. - Проверяйте
GET /orders/{id}каждые 2–5 секунд доcompletedилиfailed. - Скачайте архив либо возьмите номер и код из
delivery.
status.Куда можно подключить API
Добавьте отдельный раздел с аккаунтами. Тема основного бота не важна: накрутка, магазин, подписки или другой сервис.
Показывайте каталог клиенту, а заказ создавайте только с backend. API-ключ не должен попадать в JavaScript браузера.
Подходит для CRM, витрины или внутреннего сервиса. Сохраняйте id заказа и Idempotency-Key в своей БД.
Ваш бот может обращаться к GMT API напрямую со своего сервера. Покупать домен для вашего бота не нужно.
Конструктор запроса
Заполните поля — страница соберёт готовый JSON и cURL. Запрос никуда не отправляется и ничего не покупает.
Нажмите «Собрать».
Форматы выдачи
| format | Количество | Результат |
|---|---|---|
tdata | 1–100, не больше остатка | ZIP, затем download_url. |
sessionjson | 1–100, не больше остатка | ZIP SESSION + JSON. |
phonecode | Только 1 | Сначала phone; после запроса кода в Telegram появятся code и twofa_password. |
Проверить подключение
Ключ используется браузером только для запроса к этому же домену и не сохраняется.
Результат появится здесь.
GET/me
Проверяет ключ и возвращает общий баланс GMT.
{
"success": true,
"data": {"telegram_id": 123456789, "balance_rub": 2500.0, "currency": "RUB"}
}GET/recommendations
Возвращает короткое обязательное условие о видеозаписи. Покажите его клиенту один раз непосредственно перед покупкой.
{
"success": true,
"data": {"version": "2026-09-07", "text": "🔴 Важно перед покупкой..."}
}После согласия передайте в заказе "recommendations_accepted": true.
GET/products
Актуальный каталог с ценами и остатками.
{
"success": true,
"data": [{
"id": 123,
"name": "Россия | Telegram 14+ дней",
"description": "Описание товара",
"country_code": "RU",
"country": "🇷🇺 Россия",
"stock": 304,
"price_rub": 227.17,
"formats": ["tdata", "sessionjson", "phonecode"]
}]
}GET/products/{product_id}
Один товар. Скрытый или отсутствующий товар возвращает PRODUCT_NOT_FOUND.
POST/orders
Создаёт и оплачивает заказ с общего баланса.
Заголовки
Authorization: Bearer ВАШ_API_КЛЮЧ Content-Type: application/json Idempotency-Key: order-2026-000042
| Поле | Тип | Обязательно | Значение |
|---|---|---|---|
product_id | integer | Да | ID из каталога. |
format | string | Да | tdata, sessionjson, phonecode. |
quantity | integer | Нет | По умолчанию 1; для phonecode только 1. |
external_order_id | string | Нет | Уникальный ID в вашей системе, до 150 символов. |
recommendations_accepted | boolean | Да | Строго true. |
curl -X POST https://getmytelegram-api.duckdns.org/api/v1/orders \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-2026-000042" \
-d '{
"product_id": 123,
"format": "tdata",
"quantity": 1,
"external_order_id": "my-order-42",
"recommendations_accepted": true
}'Ответ HTTP 202
{
"success": true,
"data": {
"id": 8421,
"external_order_id": "my-order-42",
"status": "processing",
"product": {"id": 123, "name": "Россия | Telegram 14+ дней"},
"format": "tdata",
"quantity": 1,
"amount_rub": 227.17,
"created_at": "2026-09-04 02:10:00",
"completed_at": null
}
}
IDEMPOTENCY_CONFLICT.GET/orders/{order_id}
Состояние заказа текущего партнёра.
Готовый архив
{
"success": true,
"data": {
"id": 8421, "status": "completed", "format": "tdata",
"quantity": 1, "amount_rub": 227.17,
"download_url": "/api/v1/orders/8421/download"
}
}Готовый «Номер + код»
{
"success": true,
"data": {
"id": 8422, "status": "completed", "format": "phonecode",
"delivery": {"phone": "+79990000000", "code": "12345", "twofa_password": null}
}
}GET/orders?limit=20&offset=0
Список от новых к старым. limit 1–100, offset от 0.
GET/orders/{order_id}/download
Скачивает ZIP готового заказа. Авторизация обязательна.
curl -L https://getmytelegram-api.duckdns.org/api/v1/orders/8421/download \ -H "Authorization: Bearer ВАШ_API_КЛЮЧ" \ --output order_8421.zip
Пока заказ не готов: HTTP 409, ORDER_NOT_READY.
POST/orders/{order_id}/phonecode
Первый код
- Создайте заказ с
format: phonecode. - Опрашивайте заказ, пока в
delivery.phoneне появится номер. - Покажите номер клиенту. Он должен ввести его в Telegram и запросить код.
- Продолжайте GET: при
completedкод будет вdelivery.code.
Повторный код
Метод доступен только для завершённого заказа и запускает ровно одну новую сессию кода. После ответа 202 клиент снова запрашивает код в Telegram. Пока идёт ожидание, delivery.code и delivery.twofa_password равны null, чтобы старый код нельзя было принять за новый. Тело запроса не требуется.
curl -X POST https://getmytelegram-api.duckdns.org/api/v1/orders/8422/phonecode \ -H "Authorization: Bearer ВАШ_API_КЛЮЧ"
{
"success": true,
"data": {"order_id": 8422, "status": "waiting"}
}Опрашивайте заказ: phonecode_reissue_status станет completed или failed, а успешный новый код появится в delivery.code. При ошибке покажите клиенту понятный текст из phonecode_reissue_error.
GET/transactions?limit=30&offset=0
Пополнения, списания и возвраты общего баланса.
{
"success": true,
"data": [{
"id": 991, "amount": -227.17, "operation_type": "api_purchase_reserve",
"reason": "API-заказ №8421", "order_id": 8421, "created_at": "2026-09-04 02:10:00"
}],
"pagination": {"limit": 30, "offset": 0}
}Статусы
| status | Действие |
|---|---|
processing | Повторить GET через 2–5 секунд. |
completed | Выдать файл или delivery клиенту. |
failed | Не выдавать товар; автоматический возврат уже выполнен. |
refunded | Средства возвращены, товар не выдаётся. |
Ошибки
{
"success": false,
"error": {"code": "INSUFFICIENT_BALANCE", "message": "Недостаточно средств на балансе GMT"},
"request_id": "9d1805c1..."
}Сохраняйте request_id для поиска запроса поддержкой.
| HTTP | Коды | Причина |
|---|---|---|
| 400 | INVALID_JSON, INVALID_ORDER, INVALID_FORMAT, INVALID_QUANTITY | Неверные данные. |
| 400 | INVALID_EXTERNAL_ORDER_ID, INVALID_PAGINATION | Слишком длинный ID или неверные limit/offset. |
| 400 | IDEMPOTENCY_KEY_REQUIRED, RECOMMENDATIONS_NOT_ACCEPTED | Нет обязательного условия. |
| 401 | UNAUTHORIZED, INVALID_API_KEY | Нет ключа, ключ неверен или отозван. |
| 403 | IP_NOT_ALLOWED | IP не входит в разрешённый список ключа. |
| 402 | INSUFFICIENT_BALANCE | Пополните баланс GMT. |
| 404 | PRODUCT_NOT_FOUND, ORDER_NOT_FOUND | Объект отсутствует или чужой. |
| 405 | METHOD_NOT_ALLOWED | Для адреса выбран неверный HTTP-метод. |
| 409 | OUT_OF_STOCK, IDEMPOTENCY_CONFLICT, EXTERNAL_ORDER_ID_CONFLICT | Конфликт покупки. |
| 409 | ORDER_NOT_READY, REISSUE_UNAVAILABLE, REISSUE_REJECTED | Операция недоступна. |
| 410 | FILE_UNAVAILABLE | Файл больше недоступен. |
| 413 | PAYLOAD_TOO_LARGE | Тело запроса превышает 64 КБ. |
| 415 | JSON_REQUIRED | Нужен Content-Type: application/json. |
| 429 | RATE_LIMITED | Больше 120 запросов за минуту. |
| 500 | INTERNAL_ERROR | Временная внутренняя ошибка. |
Ошибки после принятия заказа
Иногда заказ принимается с HTTP 202, но поставщик не может завершить выдачу. Тогда GET /orders/{id} вернёт status: failed, а поле error.code будет одним из следующих:
| Код | Значение |
|---|---|
OUT_OF_STOCK | Остаток закончился между загрузкой каталога и покупкой. |
PHONECODE_BUSY | Все линии формата «Номер + код» временно заняты. |
SUPPLIER_TIMEOUT | Поставщик не ответил вовремя. |
SUPPLIER_ERROR | Поставщик отклонил или не выполнил заказ. |
Полный пример на Python
import time
import uuid
import requests
ORIGIN = "https://getmytelegram-api.duckdns.org"
BASE_URL = ORIGIN + "/api/v1"
API_KEY = "gmt_live_..."
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
catalog = requests.get(f"{BASE_URL}/products", headers=HEADERS, timeout=20)
catalog.raise_for_status()
product = catalog.json()["data"][0]
response = requests.post(
f"{BASE_URL}/orders",
headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())},
json={
"product_id": product["id"],
"format": "tdata",
"quantity": 1,
"external_order_id": "my-order-42",
"recommendations_accepted": True,
},
timeout=30,
)
response.raise_for_status()
order_id = response.json()["data"]["id"]
while True:
response = requests.get(f"{BASE_URL}/orders/{order_id}", headers=HEADERS, timeout=20)
response.raise_for_status()
order = response.json()["data"]
if order["status"] == "completed":
break
if order["status"] in {"failed", "refunded"}:
raise RuntimeError(order.get("error", order["status"]))
time.sleep(3)
archive = requests.get(ORIGIN + order["download_url"], headers=HEADERS, timeout=60)
archive.raise_for_status()
with open(f"order_{order_id}.zip", "wb") as file:
file.write(archive.content)
Проверка на Node.js
const baseUrl = "https://getmytelegram-api.duckdns.org/api/v1";
const apiKey = process.env.GMT_API_KEY;
const response = await fetch(baseUrl + "/me", {
headers: {Authorization: "Bearer " + apiKey}
});
const body = await response.json();
if (!response.ok) throw new Error(body.error.code + ": " + body.error.message);
console.log(body.data.balance_rub);Надёжность и безопасность
- Используйте только
https://и храните ключ в переменной окружения backend. - Новый заказ — новый случайный
Idempotency-Key. - При таймауте повторяйте исходный запрос с тем же ключом, а не создавайте новый.
- Перед покупкой снова проверяйте цену и остаток.
- Не выдавайте товар до
completed. - Лимит: 120 запросов в минуту на ключ.
Для генераторов клиентов: OpenAPI 3.1 JSON.
Проверка перед запуском
☐ API-ключ в .env
☐ Idempotency-Key хранится с заказом
☐ ID GMT-заказа сохраняется в БД
☐ Перед покупкой обновляются цена и остаток
☐ Условие о видеозаписи показано
☐ Повтор POST идёт с тем же ключом
☐ Ожидается completed
☐ ZIP скачивается с Authorization
☐ Повторная выдача не списывает деньги
☐ request_id пишется в лог
☐ failed/refunded не выдаёт товар
☐ Возврат клиенту выполняется один раз