Production API

GMT Partner API

Подключите свой Telegram-бот, сайт или сервис к GMT: показывайте каталог, создавайте заказы и автоматически получайте Telegram-аккаунты.

Base URLhttps://getmytelegram-api.duckdns.org/api/v1

UTF-8 · запросы и ответы JSON · все суммы в рублях

Быстрый старт

ШАГ 1

В GMT откройте Профиль → API для партнёров и создайте ключ.

ШАГ 2

Пополните обычный баланс GMT. Отдельного API-баланса нет.

ШАГ 3

Получите GET /products и выберите product_id.

ШАГ 4

Создайте POST /orders и проверяйте статус заказа.

Первый безопасный запрос

curl https://getmytelegram-api.duckdns.org/api/v1/me \
  -H "Authorization: Bearer ВАШ_API_КЛЮЧ"
Ничего не покупает: запрос только проверяет ключ и баланс.

Авторизация

Во все методы /api/v1/... передавайте:

Authorization: Bearer gmt_live_...
  • Одновременно действует один ключ.
  • Ключ можно снова посмотреть в меню бота.
  • После отзыва старый ключ сразу перестаёт работать.
  • Не передавайте ключ в URL.
Не вставляйте ключ в код публичного сайта. Покупки выполняются только вашим защищённым backend-сервером.

Сценарий покупки от А до Я

  1. Проверьте баланс: GET /me.
  2. Получите актуальные цену и остаток: GET /products.
  3. Покажите клиенту короткое условие о видеозаписи: GET /recommendations.
  4. После согласия отправьте POST /orders с новым Idempotency-Key.
  5. API атомарно спишет баланс и вернёт HTTP 202.
  6. Проверяйте GET /orders/{id} каждые 2–5 секунд до completed или failed.
  7. Скачайте архив либо возьмите номер и код из delivery.
Каталог→Подтверждение записи→POST /orders→processing→completed→Выдача
HTTP 202 означает «принято в обработку». Финальный результат находится в поле status.

Куда можно подключить API

ЛЮБОЙ TELEGRAM-БОТ

Добавьте отдельный раздел с аккаунтами. Тема основного бота не важна: накрутка, магазин, подписки или другой сервис.

САЙТ ИЛИ ПАНЕЛЬ

Показывайте каталог клиенту, а заказ создавайте только с backend. API-ключ не должен попадать в JavaScript браузера.

АВТОМАТИЗАЦИЯ

Подходит для CRM, витрины или внутреннего сервиса. Сохраняйте id заказа и Idempotency-Key в своей БД.

БЕЗ ОТДЕЛЬНОГО САЙТА

Ваш бот может обращаться к GMT API напрямую со своего сервера. Покупать домен для вашего бота не нужно.

Конструктор запроса

Заполните поля — страница соберёт готовый JSON и cURL. Запрос никуда не отправляется и ничего не покупает.

Нажмите «Собрать».

Форматы выдачи

formatКоличествоРезультат
tdata1–100, не больше остаткаZIP, затем download_url.
sessionjson1–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_idintegerДаID из каталога.
formatstringДаtdata, sessionjson, phonecode.
quantityintegerНетПо умолчанию 1; для phonecode только 1.
external_order_idstringНетУникальный ID в вашей системе, до 150 символов.
recommendations_acceptedbooleanДаСтрого 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
  }
}
Защита от двойного списания: при таймауте повторите тот же JSON с тем же Idempotency-Key. Вернётся существующий заказ с HTTP 200.
Не используйте один Idempotency-Key для разных заказов: получите 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

Первый код

  1. Создайте заказ с format: phonecode.
  2. Опрашивайте заказ, пока в delivery.phone не появится номер.
  3. Покажите номер клиенту. Он должен ввести его в Telegram и запросить код.
  4. Продолжайте GET: при completed код будет в delivery.code.
Важно: если не запросить код в Telegram вовремя, заказ будет возвращён, а деньги вернутся на баланс.

Повторный код

Метод доступен только для завершённого заказа и запускает ровно одну новую сессию кода. После ответа 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КодыПричина
400INVALID_JSON, INVALID_ORDER, INVALID_FORMAT, INVALID_QUANTITYНеверные данные.
400INVALID_EXTERNAL_ORDER_ID, INVALID_PAGINATIONСлишком длинный ID или неверные limit/offset.
400IDEMPOTENCY_KEY_REQUIRED, RECOMMENDATIONS_NOT_ACCEPTEDНет обязательного условия.
401UNAUTHORIZED, INVALID_API_KEYНет ключа, ключ неверен или отозван.
403IP_NOT_ALLOWEDIP не входит в разрешённый список ключа.
402INSUFFICIENT_BALANCEПополните баланс GMT.
404PRODUCT_NOT_FOUND, ORDER_NOT_FOUNDОбъект отсутствует или чужой.
405METHOD_NOT_ALLOWEDДля адреса выбран неверный HTTP-метод.
409OUT_OF_STOCK, IDEMPOTENCY_CONFLICT, EXTERNAL_ORDER_ID_CONFLICTКонфликт покупки.
409ORDER_NOT_READY, REISSUE_UNAVAILABLE, REISSUE_REJECTEDОперация недоступна.
410FILE_UNAVAILABLEФайл больше недоступен.
413PAYLOAD_TOO_LARGEТело запроса превышает 64 КБ.
415JSON_REQUIREDНужен Content-Type: application/json.
429RATE_LIMITEDБольше 120 запросов за минуту.
500INTERNAL_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 не выдаёт товар
☐ Возврат клиенту выполняется один раз