TDUgame

Документация API

API v1.2

Создавайте плагины и автоматизации для TDUgame

Аутентификация
X-Api-Key
Передавайте ключ заголовком в каждом запросе к /v1/*.
Лимит запросов
120 / 60 секунд
На один API-ключ. При превышении сервер отвечает 429.
Базовый URL
tdugame.ru/api
Полный адрес — https://tdugame.ru/api. Методы начинаются с /v1.
Идемпотентность
Idempotency-Key
Заголовок на /rent и /extend защищает от двойного списания при повторе запроса.
🔑
Ваш API-ключ
Заголовок X-Api-Key для запросов к /v1/*
Проверяем...

Начало работы

Сгенерируйте ключ выше, затем используйте его в заголовке X-Api-Key:

# пример curl -H "X-Api-Key: tdu_your_key_here" \ https://tdugame.ru/api/v1/balance
🧩 Плагин для FunPay Cardinal
Готовый плагин для продавцов на FunPay: лоты, автовыдача и продление арендованных аккаунтов TDUgame.

Подключается к FunPayCardinal и работает только через этот API — по вашему ключу.

TDUgameResell для FunPay FunPayCardinal✓ Бесплатно

★ Единственный с мини-приложением в Telegram. Автосоздание лотов, автовыдача, коды Steam Guard, продление, умное скрытие лотов без наличия, журнал ошибок с советами и автообновление. Смотреть скриншоты и возможности →

Версия: 2.10.1 Обновлён: 14 октября 2026 Размер: 528 КБ

Что умеет

Установка шаг за шагом

Плагин работает внутри программы FunPay Cardinal — она сама заходит на ваш аккаунт FunPay и управляет лотами. Сначала ставим Cardinal, потом подключаем плагин.

1
Подготовьте компьютер или сервер

Cardinal должен работать круглосуточно, иначе заказы не будут выдаваться автоматически. Подойдёт арендованный виртуальный сервер (Ubuntu 22–24) или обычный компьютер, который не выключается.

2
Установите FunPay Cardinal

Официальный репозиторий: github.com/sidor0912/FunPayCardinal. Выберите свою систему:

  • Linux (Ubuntu) — выполните одну команду и следуйте подсказкам установщика:
    wget https://raw.githubusercontent.com/sidor0912/FunPayCardinal/main/install-fpc.sh -O install-fpc.sh && bash install-fpc.sh
  • Windows — установите Python 3.11 (на первом экране отметьте «Add python.exe to PATH»), скачайте архив Cardinal с GitHub и распакуйте. Запустите Setup.bat, дождитесь установки пакетов, затем Start.bat.
  • Docker — инструкция есть в README репозитория.
3
Пройдите первичную настройку Cardinal

При первом запуске Cardinal задаст несколько вопросов в консоли:

  • golden_key — ключ вашего аккаунта FunPay (берётся из cookie сайта funpay.com, расширением для браузера вроде Cookie-Editor).
  • User-Agent вашего браузера.
  • Токен Telegram-бота — создайте своего бота у @BotFather командой /newbot и вставьте выданный токен.
  • Пароль для доступа к боту.

После настройки запустите Cardinal ещё раз, откройте своего бота в Telegram и отправьте ему пароль — бот станет вашей панелью управления.

4
Добавьте плагин в Cardinal

Скачайте плагин кнопкой выше, затем в диалоге со своим ботом отправьте команду /menu и нажмите «🧩 Плагины»:

Меню Cardinal: кнопка «Плагины»

Так выглядит меню вашего бота. В списке плагинов нажмите «Добавить плагин»:

Список плагинов Cardinal

Нажмите «➕ Добавить плагин» и отправьте боту скачанный файл TDUgameResellPlugin.py как документ:

Загрузка файла плагина в бота

После загрузки перезапустите Cardinal командой /restart, чтобы плагин подключился.

Устанавливайте плагины только из источников, которым доверяете: плагин работает с вашим аккаунтом FunPay. Этот файл общается только с API TDUgame по вашему ключу.
5
Вставьте API-ключ TDUgame

Сгенерируйте ключ в блоке «API-ключ» выше на этой странице и пополните баланс — аренды списываются с баланса ключа. В боте откройте «🧩 Плагины» → TDUgameResell → «⚙️ Настройки» → «🔑 API ключ» и отправьте ключ сообщением:

Меню плагина TDUgameResell

Меню плагина. Нажмите «🔑 API ключ» — бот попросит прислать ключ:

Ввод API-ключа TDUgame
6
Создайте лоты

Откройте «📦 Создание лотов». При первом запуске пройдите короткий мастер (тексты лота, сроки аренды, наценка), затем нажмите «➕ Создать недостающие» — плагин покажет план и создаст лоты на FunPay.

Создание лотов

Кнопка «🆕 Новые игры» включает автосоздание лотов на новые игры каталога, «🚫 Исключения» — список игр, которые создавать не нужно.

Скриншоты сделаны в настоящем боте с плагином (ключ и баланс на них заменены). Внешний вид Telegram у вас может немного отличаться.

Аккаунт FunPay должен быть в рублях. FunPay разрешает создавать не больше 500 новых лотов за 24 часа — плагин сам следит за лимитом и продолжит позже.

📖 Каталог (без ключа)
Список игр и расчёт цены аренды — публично, без авторизации.
GET/productsСписок игр в каталоге

Параметры

search (query, необязательно) — поиск по названию игры

Пример ответа

[{ "id": 279, "name": "MECCHA CHAMELEON", "pricePerHourRub": 1, "availableAccounts": 239, "minHours": 1, "maxHours": 720 }]
GET/products/{id}Одна игра по ID

Точечный доступ вместо вытягивания всего каталога — удобно, если плагин работает с конкретной игрой.

Пример ответа

{ "id": 790, "name": "Little Nightmares Complete Edition", "pricePerHourRub": 1, "availableAccounts": 3, "minHours": 1, "maxHours": 720 }

Ошибки

404 not_found — игры с таким ID нет

POST/products/{id}/quoteРасчёт цены аренды

Точный расчёт стоимости — та же формула, что при оформлении заказа, скидка за длительность нелинейная.

Тело запроса

{ "hours": 24, "quantity": 1 }

Пример ответа

{ "priceRub": 42, "priceUsd": 0.51, "discountPercent": 12 }
🔌 Reseller API
Требует X-Api-Key. Аренда, управление активными арендами, логин/пароль, код Steam Guard — для автоматизаций (например, плагин FunPayCardinal).
GET/v1/balanceБаланс кошелька

Пример ответа

{ "balanceRub": 1200 }
GET/v1/productsСписок продуктов

То же самое, что публичный /products, но с ключом — для единообразия остального reseller-API.

GET/v1/products/{id}Одна игра по ID

Идентично публичному /products/{id}, но с ключом.

POST/v1/products/{id}/quoteРассчитать цену

Идентично публичному /products/{id}/quote.

GET/v1/price-tableЦены всех игр на нужные сроки

Цены «игра × срок» одним запросом — чтобы не вызывать /quote на каждую пару. Нужно для массового выставления лотов; цены ориентировочные, точная сумма списания приходит в ответе /v1/rent и считается в /v1/products/{id}/quote.

Параметры

hours — сроки в часах через запятую (до 40 значений); без параметра — стандартный набор от 1 часа до 30 дней.

Пример ответа

{ "hours": [1, 24], "prices": { "218": { "1": 4, "24": 48 } }, "ready": true }
GET/v1/funpay-mapКатегории FunPay для игр

В какой раздел FunPay обычно выставляют конкретную игру и какие поля формы для неё нужны. productId — тот же id, что в /v1/products. Используется плагином для автосоздания лотов.

Пример ответа

{ "games": [ { "productId": 2, "name": "Rust", "aliases": [], "funpay": { "categoryId": 92, "subcategoryId": 250, "subcategoryType": "common", "fields": { "fields[type]": "Аренда" } } } ] }
POST/v1/rentАрендовать аккаунт

Списывает стоимость с баланса ключа и сразу арендует.

Заголовки

Idempotency-Key (необязательно, но рекомендуется) — свой уникальный ID запроса. Повторный вызов с тем же ключом (например, при ретрае после таймаута) вернёт тот же результат и не спишет деньги повторно.

Тело запроса

{ "productId": 279, "hours": 24, "quantity": 1 }

Пример ответа

{ "rentalUids": ["7a6543f9-..."], "failedCount": 0, "priceRub": 42, "balanceRub": 158 }
GET/v1/rentalsАктивные аренды

Пример ответа

[{ "rentalUid": "7a6543f9-...", "productName": "DayZ", "status": "active", "expiresAt": "2026-09-22T10:00:00.000Z" }]
GET/v1/rentals/{uid}Статус одной аренды

Точечная проверка вместо сканирования всего списка активных аренд.

Пример ответа

{ "rentalUid": "7a6543f9-...", "productName": "DayZ", "status": "active", "expiresAt": "2026-09-22T10:00:00.000Z" }
GET/v1/rentals/{uid}/credentialsПолучить логин/пароль

Пример ответа

{ "login": "jk97211859", "password": "fOsfEMUAzo1Y28qW" }
GET/v1/rentals/{uid}/codeКод Steam Guard

Одноразовый код, меняется при каждом запросе.

Пример ответа

{ "code": "ABCDE", "expiresIn": 30 }
POST/v1/rentals/{uid}/extendПродлить аренду

Заголовки

Idempotency-Key (необязательно) — так же, как в /v1/rent, защищает от двойного списания при ретрае.

Тело запроса

{ "hours": 24 }

Пример ответа

{ "priceRub": 42, "balanceRub": 116, "expiresAt": "2026-09-22T10:00:00.000Z" }
POST/v1/rentals/{uid}/terminateЗавершить аренду досрочно

Пример ответа

{ "status": "terminated" }
🔔 Вебхуки
Уведомления о смене статуса аренды — вместо поллинга /v1/rentals.

Настройте URL ниже (доступно, если уже сгенерирован API-ключ) — при каждом событии мы отправим на него POST с телом:

{ "event": "rental.expiring_soon", "data": { "rentalUid": "7a6543f9-...", "productName": "DayZ", "expiresAt": "2026-09-22T10:00:00.000Z" }, "timestamp": "2026-09-21T09:00:00.000Z" }

События

eventКогда
rental.createdсразу после успешного /v1/rent
rental.extendedсразу после успешного /v1/rentals/{uid}/extend
rental.expiring_soonпримерно за час до истечения (разово)
rental.expiredсрок аренды истёк и не продлился автоматически
rental.terminatedаренда завершена досрочно через /v1/rentals/{uid}/terminate

Проверка подписи

Каждый запрос подписан заголовком X-TDUgame-Signature — HMAC-SHA256 от тела запроса на вашем webhookSecret:

// Node.js const crypto = require("crypto"); const expected = crypto.createHmac("sha256", webhookSecret) .update(rawRequestBody) .digest("hex"); // сравнить с заголовком X-TDUgame-Signature
⚙️
Настройка вебхука
URL, на который придут уведомления о событиях аренды
Проверяем...

⚠️ Коды ошибок (/v1/*)

HTTPErrorОписание
401invalid_api_keyКлюч отсутствует, неверен или отозван
403account_disabledАккаунт заблокирован
403not_activeАренда не активна (истекла/завершена)
400insufficient_balanceНедостаточно средств на балансе
400no_stockНет свободных аккаунтов на нужное количество
404not_foundТовар или аренда не найдены / не принадлежат вам
409operation_inflightКод уже запрашивается, подождите
429rate_limitedПревышен лимит запросов
502catalog_unavailableТехнический сбой, попробуйте позже

OpenAPI-спецификация: открыть · сырой .json