GAMES DROP Logo

GamesDrop.io API - Руководство для мерчантов

[!WARNING] Все offer groups в этой документации являются PRODUCTION-офферами! Для тестирования используйте только Test Offer ID 999. API Base URL: https://partner.gamesdrop.io

Добро пожаловать в документацию Partner API GamesDrop.io! Это руководство содержит все необходимое для интеграции вашей реселлерской платформы с сетью GamesDrop.io. Интегрируясь с нами, вы получаете доступ к нашему каталогу из более чем 10 000 цифровых продуктов: от пополнения мобильных операторов до внутриигровой валюты популярных мобильных игр. Начните здесь, чтобы оптимизировать свои предложения продуктов и подключить своих клиентов к миру цифровых товаров.

Оглавление

  1. Авторизация
  2. Основные концепции
  3. API Endpoints
  4. Тестирование API
  5. Рекомендации по интеграции
  6. FAQ и Устранение неполадок
  7. Поддержка

Авторизация

Получение токена

Процесс получения

  1. Войдите в личный кабинет мерчанта
  2. Создайте новый магазин
  3. После создания магазина вы получите уникальный токен
  4. Формат токена: abcdef1234567890abcdef1234567890

Способы авторизации

Система поддерживает два способа авторизации в зависимости от типа запроса:

  1. API Токен магазина (Shop Token):

    • Используется для всех операций с товарами и заказами (создание заказа, проверка статуса, проверка баланса магазина).
    • Передается в заголовке: Authorization: <ваш_токен>
    • Пример: Authorization: abcdef1234567890abcdef1234567890
  2. JWT Токен (для управления):

    • Используется для личного кабинета и операций пополнения (Bank Transfer, PayPal и т.д.).
    • Передается как Bearer токен: Authorization: Bearer <jwt_token>
    • Примечание: JWT токен имеет ограниченный срок жизни.

Безопасность токена

  • 🔒 Токен является конфиденциальной информацией
  • ⚠️ Не передавайте токен третьим лицам
  • 📝 Токен нельзя восстановить после создания
  • 🔄 При необходимости можно сгенерировать новый токен (старый станет недействительным)

Основные концепции

Статусы заказов

СтатусОписаниеДействия
SUBMITTEDЗаказ создан и ожидает обработкиОжидать перехода в PROCESSING
PROCESSINGЗаказ в процессе обработкиОжидать завершения. Для прямых пополнений этот этап может занимать от 1 до 60 минут.
COMPLETEDЗаказ успешно выполненПолучить ключ/товар
CANCELEDЗаказ отменен из-за ошибкиПроверить поле message, создать новый заказ
FAILEDВнутренняя ошибка системыАвто-возврат, проверить message, прекратить опрос
REFUNDЗаказ возвращенОжидать возврат средств

Возможные ошибки

Код ошибкиОписаниеРешение
INVALID_TOKENНеверный токен авторизацииПроверить токен или получить новый
OFFER_NOT_FOUNDТовар не найден или нет доступаПроверить ID товара и права доступа
TRANSACTION_DUPLICATEДубликат транзакцииИспользовать новый transaction_id
WRONG_PRICEНеверная цена товараОбновить информацию о цене
ORDER_NOT_FOUNDЗаказ не найденПроверить ID заказа
ORDER_NOT_PROCESSINGЗаказ еще не в обработкеДождаться перехода в статус PROCESSING
ORDER_NOT_COMPLETEDЗаказ еще не завершенДождаться завершения заказа
ORDER_ALREADY_CANCELEDЗаказ уже отмененСоздать новый заказ
ORDER_ALREADY_REFUNDEDЗаказ уже возвращенСоздать новый заказ
SERVICE_UNAVAILABLEСервис временно недоступенПовторить попытку позже
INVALID_REQUEST_BODYНеверный формат запросаПроверить структуру запроса
INSUFFICIENT_BALANCEНедостаточно средств на балансеПополнить баланс или уменьшить сумму покупки
BALANCE_UNAVAILABLEБаланс временно недоступенПовторить запрос позже

Совместимость расчетов с поставщиками

GamesDrop работает с несколькими поставщиками. Некоторые поставщики работают через фиатные расчетные каналы, некоторые через USDT, а некоторые поддерживают оба варианта. Чтобы избежать валютных рисков, каждому партнерскому аккаунту назначается balance profile, а каждому офферу поставщика назначается settlement method.

Профили баланса:

ПрофильЗначение
FIATПартнер настроен на фиатные расчеты.
USDTПартнер настроен на расчеты в USDT.
MIXEDПартнер может использовать офферы поставщиков FIAT и USDT.

Методы расчетов офферов:

МетодЗначение
FIATОффер поставщика рассчитывается через фиатные каналы.
USDTОффер поставщика рассчитывается через USDT.
MIXEDОффер доступен как FIAT-, так и USDT-партнерам.

Правила совместимости:

Balance profile партнераВидимые / доступные к покупке методы офферов
FIATFIAT, MIXED
USDTUSDT, MIXED
MIXEDFIAT, USDT, MIXED

Catalog и product endpoints возвращают только совместимые офферы. Если оффер несовместим с профилем вашего аккаунта, он скрывается из sync и find-one, а создание заказа напрямую будет отклонено.

Этот слой совместимости не связан с наценкой на товар и конвертацией валют. GamesDrop возвращает финальную цену покупки, доступную вашему аккаунту; при создании заказа всегда используйте последнюю price, полученную из sync или find-one.

API Endpoints

Управление балансом

Проверка баланса

Вы можете проверить текущий баланс вашего аккаунта, используя API токен магазина.

HTTP
GET /api/v1/offers/balance
Authorization: {{token}}

[!NOTE] Эндпоинт /api/v1/balance (без /offers/) требует JWT-авторизацию и используется в основном для веб-интерфейса. Для интеграции по API используйте /api/v1/offers/balance с вашим Shop Token.

Response:

JSON
{
  "balance": 500.25,
  "draftBalance": 0.00,
  "isPostpaid": false,
  "balanceProfile": "USDT",
  "currency": {
    "id": 3,
    "code": "USD"
  },
  "partnerId": 123
}

Описание полей ответа:

КлючЗначениеДополнение
balancenumberТекущий доступный баланс в USD
draftBalancenumberЗарезервированные средства (в обработке)
isPostpaidbooleantrue: аккаунт с постоплатой (баланс не требуется для заказов). false: предоплатный аккаунт (нужно пополнять баланс).
balanceProfileFIAT | USDT | MIXEDОпределяет, какие settlement methods офферов поставщиков доступны вашему аккаунту.
partnerIdnumberУникальный ID вашего партнерского аккаунта
currencyobjectИнформация о валюте баланса (всегда USD)

История транзакций баланса

HTTP
GET /api/v1/balance/transactions?page=1&limit=20
Authorization: {{passwordHash}}

Response:

JSON
{
  "transactions": [
    {
      "id": 12,
      "amount": -75.00,
      "type": "PURCHASE",
      "description": "API Purchase - Virtual credits",
      "balanceAfter": 425.00,
      "createdAt": "2025-07-28T05:21:46.121Z"
    },
    {
      "id": 11,
      "amount": -50.00,
      "type": "PURCHASE",
      "description": "Test Purchase - Mobile game credits",
      "balanceAfter": 500.00,
      "createdAt": "2025-07-28T05:16:23.718Z"
    }
  ],
  "total": 25
}

Описание полей запроса:

КлючЗначениеДополнение
pagenumberНомер страницы (по умолчанию: 1)
limitnumberКоличество записей на странице (по умолчанию: 20)

Описание полей ответа:

КлючЗначениеДополнение
transactionsarrayСписок транзакций
transactions[].idnumberУникальный ID транзакции
transactions[].amountnumberСумма операции (отрицательная для списаний)
transactions[].typestringТип операции (DEPOSIT, PURCHASE, REFUND)
transactions[].descriptionstringОписание операции
transactions[].balanceAfternumberБаланс после операции
transactions[].createdAtstringДата и время операции (UTC)
totalnumberОбщее количество транзакций

Получение информации о товаре

HTTP
POST /api/v1/offers/find-one
Authorization: {{token}}

{
  "offerId": 1001
}

Response:

JSON
{
  "offerId": 1001,
  "productName": "PUBG MOBILE GIFT",
  "offerName": "60 UC",
  "platformCode": "mobile",
  "platformName": "Mobile",
  "regionCode": "GLB",
  "regionName": "Global",
  "count": 1,
  "price": 560.10,
  "currency": "RUB",
  "settlementMethod": "USDT",
  "balanceProfile": "USDT",
  "isSettlementCompatible": true,
  "isReturnDataForCustomer": true
}

Описание полей запроса:

КлючЗначениеДополнение
offerIdnumberВажно: должно быть числом, не строкой

Описание полей ответа:

КлючЗначениеДополнение
offerIdnumber-
productNamestring-
offerNamestring-
platformCodestringНормализованный код платформы, если доступен.
platformNamestringНазвание платформы для отображения, если доступно.
regionCodestringНормализованный код региона, если доступен, например GLB, EU, ROW, CIS, US, NA.
regionNamestringНазвание региона для отображения, если доступно, например Global, Europe, RoW, CIS.
countnumberКоличество единиц товара
pricenumber-
currencyKZT, USD, RUB, etc.Код валюты цены
settlementMethodFIAT | USDT | MIXEDМетод расчетов выбранного оффера поставщика.
balanceProfileFIAT | USDT | MIXEDВаш профиль баланса партнера.
isSettlementCompatiblebooleanВсегда true для возвращаемых офферов. Несовместимые офферы скрываются.
isReturnDataForCustomerbooleantrue: Ключ/Карта (вернет key). false: Прямое пополнение (на баланс).

Синхронизация каталога (B2B Sync)

Endpoint Sync предназначен для партнеров, которым нужно регулярно обновлять локальные базы товаров. Он возвращает плоский оптимизированный список доступных офферов, актуальные цены с учетом вашей наценки и наличие на складе в одном запросе.

Ответ включает только офферы, совместимые с вашим balanceProfile. Например, партнер с профилем USDT не получит в этой выдаче fiat-only офферы поставщиков.

Для отображения платформы и региона используйте поля platformCode/platformName и regionCode/regionName из ответа. Не считайте товар Global только потому, что в названии написано PC Steam CD Key; если товар действительно region-free, API вернет regionCode: "GLB" / regionName: "Global", когда эти данные доступны. Региональные варианты вроде EU, ROW, CIS, US и NA могут возвращаться отдельными offer groups.

HTTP
POST /api/v1/offers/sync
Authorization: {{token}}

{
  "limit": 1000,
  "page": 1,
  "category": "Top Up",
  "search": "genshin"
}

Описание полей запроса:

КлючЗначениеДополнение
limitnumberКоличество элементов на странице (максимум 5000). По умолчанию: 1000.
pagenumberНомер страницы. По умолчанию: 1.
searchstringНеобязательный текстовый поиск по названию товара.
categorystringНеобязательный фильтр по категории, например Top Up, Gift Cards. Также поддерживаются legacy aliases TOP_UP и GIFT_CARD.

Response:

JSON
{
  "count": 1250,
  "rows": [
    {
      "productId": 5,
      "productName": "PUBG Mobile",
      "offerGroupId": 101,
      "offerGroupName": "60 UC",
      "platformCode": "mobile",
      "platformName": "Mobile",
      "regionCode": "GLB",
      "regionName": "Global",
      "price": 0.99,
      "currency": "USD",
      "inStock": true
    }
  ]
}

Описание полей ответа:

КлючЗначениеДополнение
countnumberОбщее количество элементов, подходящих под фильтры.
rows[].offerGroupIdnumberID, который нужно передавать как offerId при создании заказа.
rows[].productNamestringНазвание продукта.
rows[].offerGroupNamestringНазвание продаваемого варианта.
rows[].platformCodestringНормализованный код платформы, если доступен.
rows[].platformNamestringНазвание платформы для отображения, если доступно.
rows[].regionCodestringНормализованный код региона, если доступен, например GLB, EU, ROW, CIS, US, NA. Не считайте товар Global только потому, что в названии написано PC Steam CD Key.
rows[].regionNamestringНазвание региона для отображения, если доступно, например Global, Europe, RoW, CIS, North America.
rows[].pricenumberФинальная стоимость покупки товара в вашей валюте.
rows[].inStockbooleantrue, если хотя бы один поставщик сейчас активен.
rows[].isRequiredGameUserIdbooleantrue, если товар требует идентификатор игрока.
rows[].isRequiredGameServerIdbooleantrue, если товар требует идентификатор сервера.

Создание заказа

HTTP
POST /api/v1/offers/create-order
Authorization: {{token}}

{
  "offerId": 1001,
  "price": 560.10,
  "transactionId": "test112321124214",
  "customer": {
    "email": "user@gmail.com",
    "gameUserId": "52357322414"
  }
}

Описание полей запроса:

КлючЗначениеДополнение
offerIdnumberВажно: должно быть числом, не строкой
pricenumberПоследняя цена покупки GamesDrop, полученная из find-one или sync. Не передавайте вашу розничную цену для клиента.
transactionIdstringУникальный идентификатор транзакции в вашей системе
customerundefined | object-
emailundefined | stringНеобязательное поле для отслеживания
gameUserIdundefined | stringОбязательно для некоторых типов товаров

Подтверждение цены и выбор поставщика

Поле price в create-order является подтверждением цены. Оно должно совпадать с ценой GamesDrop, которую ваша система получила из find-one или sync перед созданием заказа.

Не передавайте цену, которую видит ваш конечный клиент. Наценка вашего магазина управляется на вашей стороне и не является частью запроса заказа в GamesDrop.

Для товаров с несколькими поставщиками GamesDrop может выбрать лучшего доступного поставщика в момент создания заказа. Заказ будет принят только если подтвержденная price все еще покрывает требуемую цену покупки GamesDrop. Если цены поставщиков изменились или самый дешевый поставщик стал недоступен, API вернет WRONG_PRICE, OFFER_NOT_FOUND, OUT_OF_STOCK или SERVICE_UNAVAILABLE в зависимости от ситуации. В этом случае обновите цену оффера и попросите клиента повторить покупку.

Response:

JSON
{
  "orderId": 10222502,
  "count": 1,
  "price": 560.10,
  "currency": "RUB",
  "offerId": 1001,
  "productName": "PUBG MOBILE GIFT",
  "offerName": "60 UC",
  "status": "COMPLETED",
  "isReturnDataForCustomer": true,
  "key": "001434249936",
  "createdAt": "2024-05-28 10:08:04.296+00"
}

Описание полей ответа:

КлючЗначениеДополнение
orderIdnumber-
countnumberКоличество единиц товара
pricenumber-
currencyKZT | USD | EUR | RUB-
offerIdnumber-
productNamestring-
offerNamestring-
statusstringSUBMITTED, PROCESSING, COMPLETED, CANCELED
isReturnDataForCustomerbooleantrue: Товар-ключ. false: Прямое пополнение.
isRequiredGameUserIdbooleantrue, если товар требует идентификатор игрока.
isRequiredGameServerIdbooleantrue, если товар требует идентификатор сервера.
keystring (optional)Код активации/PIN. Присутствует ТОЛЬКО если isReturnDataForCustomer: true И статус COMPLETED.
createdAtstringUTC +0

Проверка статуса заказа

HTTP
POST /api/v1/offers/order-status
Authorization: {{token}}

{
  "orderId": 10222502
  // OR
  "transactionId": "test112321124214"
}

Описание полей запроса:

КлючЗначениеДополнение
orderIdnumberНеобязательно, если передан transactionId
transactionIdstringНеобязательно, если передан orderId

Response:

JSON
{
  "orderId": 10222502,
  "count": 1,
  "price": 560.10,
  "currency": "RUB",
  "offerId": 1001,
  "productName": "PUBG MOBILE GIFT",
  "offerName": "60 UC",
  "status": "COMPLETED",
  "isReturnDataForCustomer": true,
  "key": "001434249936",
  "createdAt": "2024-05-28 10:08:04.296+00"
}

Описание полей ответа:

КлючЗначениеДополнение
orderIdnumber-
countnumberКоличество единиц товара
pricenumber-
currencyKZT | USD | EUR | RUB-
offerIdnumber-
productNamestring-
offerNamestring-
statusstringТекущий статус: SUBMITTED, PROCESSING, COMPLETED, CANCELED, FAILED
messagestring (optional)Детальное сообщение об ошибке, если статус CANCELED или FAILED.
isReturnDataForCustomerbooleantrue: Товар-ключ. false: Прямое пополнение.
isRequiredGameUserIdbooleantrue, если товар требует идентификатор игрока.
isRequiredGameServerIdbooleantrue, если товар требует идентификатор сервера.
keystring (optional)Код активации/PIN. Присутствует ТОЛЬКО если isReturnDataForCustomer: true И статус COMPLETED.
createdAtstringUTC +0

Получение списка серверов

Для товаров, которым требуется идентификатор сервера (isRequiredGameServerId: true), вы можете получить список доступных серверов и показать его в вашем UI.

HTTP
POST /api/v1/partner/product-offer/servers
Authorization: {{token}}

{
  "offerId": 1001
}

Также можно использовать короткий эквивалентный путь:

HTTP
POST /api/v1/offers/servers
Authorization: {{token}}

Response:

JSON
{
  "Europe": "os_euro",
  "America": "os_usa",
  "Asia": "os_asia"
}

Примечание: используйте ключ, например "Europe", как label для отображения, а значение, например "os_euro", как gameServerId при создании заказа.

Проверка игрока

HTTP
POST /api/v1/offers/check-game-data
Authorization: {{token}}

{
  "offerId": 1001,
  "gameUserId": "52357322414",
  "gameServerId": "1234"
}

Описание полей запроса:

КлючЗначениеДополнение
offerIdnumberВажно: должно быть числом, не строкой
gameUserIdstringИдентификатор игрока
gameServerIdundefined | stringИдентификатор сервера (если требуется)

Успешный ответ:

JSON
{
  "status": "VALID",
  "gameUserLogin": "JJJ"
}

Описание полей успешного ответа:

КлючЗначениеДополнение
status"VALID"Игрок валиден
gameUserLoginstringЛогин игрока

Ответ при ошибке:

JSON
{
  "status": "INVALID"
}

Описание полей ответа с ошибкой:

КлючЗначениеДополнение
status"INVALID"Игрок не валиден

Тестирование API

Тестовый товар

Для тестирования интеграции с API доступен специальный тестовый товар:

  • ID товара: 999
  • Название: Steam US
  • Наименование: TEST OFFER GROUP
  • Цена: 23.09 KZT (важно использовать точное значение)
  • Возвращает ключ: Да

Пример запроса информации о тестовом товаре:

HTTP
POST /api/v1/offers/find-one
Authorization: {{token}}

{
  "offerId": 999
}

Пример создания тестового заказа:

HTTP
POST /api/v1/offers/create-order
Authorization: {{token}}

{
  "offerId": 999,
  "price": 23.09,
  "transactionId": "test_123456",
  "customer": {
    "email": "test@example.com",
    "gameUserId": "123456789"
  }
}

Особенности тестового товара:

  • Всегда возвращает успешный ответ при правильных параметрах
  • Генерирует тестовый ключ активации
  • Создаёт заказ со статусом COMPLETED
  • Проверка игрока всегда возвращает VALID для тестового товара
  • Работает в тестовом режиме без реального списания средств

Примеры работы с балансом

Проверка баланса перед покупкой:

JAVASCRIPT
// 1. Проверяем текущий баланс
const balanceResponse = await fetch('/api/v1/balance', {
  headers: { 'Authorization': 'your-token-here' }
});
const { balance } = await balanceResponse.json();

// 2. Получаем информацию о товаре
const offerResponse = await fetch('/api/v1/offers/find-one', {
  method: 'POST',
  headers: {
    'Authorization': 'your-token-here',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ offerId: 1001 })
});
const { price } = await offerResponse.json();

// 3. Проверяем достаточность средств
if (balance >= price) {
  // Создаем заказ
  console.log('Sufficient balance, creating order...');
} else {
  console.log('Insufficient balance, need to top up');
}

Получение истории транзакций:

JAVASCRIPT
const transactionsResponse = await fetch('/api/v1/balance/transactions', {
  headers: { 'Authorization': 'your-token-here' }
});
const { transactions, total } = await transactionsResponse.json();

console.log(`Total transactions: ${total}`);
transactions.forEach(tx => {
  console.log(`${tx.createdAt}: ${tx.type} ${tx.amount} (Balance: ${tx.balanceAfter})`);
});

Рекомендации по использованию

💰 Работа с балансом

  • Регулярно проверяйте баланс перед крупными покупками
  • Ведите учет транзакций для сверки с вашей системой
  • При недостатке средств уведомляйте пользователей о необходимости пополнения
  • Используйте пагинацию при запросе истории транзакций

🔍 Перед созданием заказа

  • Получите актуальную информацию о товаре
  • Проверьте достаточность баланса для покупки
  • Проверьте валидность игрока (в случае прямого пополнения)

📝 При создании заказа

  • Используйте уникальный transactionId
  • Указывайте последнюю цену GamesDrop, полученную из find-one или sync
  • Не передавайте вашу розничную цену для клиента в поле price
  • Указывайте offerId как число, не как строку
  • Заполняйте все необходимые поля для данного типа товара

✅ После создания заказа

  • Сохраните orderId
  • Проверяйте статус заказа
  • При статусе COMPLETED получите ключ/товар

⚠️ При возникновении ошибок

  • Проверьте токен
  • Убедитесь в корректности данных и формате запроса
  • Создайте новый заказ при необходимости

FAQ и Устранение неполадок

Типы товаров (Пополнение vs Ключи)

Наша система поддерживает два основных типа доставки. Вы можете различить их, используя поле isReturnDataForCustomer в ответе информации о товаре.

1. Подарочные карты / Ключи (isReturnDataForCustomer: true)

  • Что это: Клиент получает цифровой код, PIN или ссылку для ручной активации.
  • Поток:
    1. create-order возвращает status: "COMPLETED" и поле key.
    2. Вы показываете этот key своему клиенту.
  • Пример: Код пополнения Steam (Wallet Code), код на UC в PUBG.

2. Прямое пополнение (isReturnDataForCustomer: false)

  • Что это: Средства зачисляются напрямую на игровой аккаунт игрока. Код не возвращается.
  • Поток:
    1. Вы ОБЯЗАНЫ передать gameUserId (и иногда gameServerId) в запросе create-order.
    2. Мы рекомендуем сначала проверить валидность ID через /check-game-data.
    3. create-order возвращает status: "COMPLETED". Игрок получает товар в игре автоматически.
  • Пример: Пополнение Mobile Legends Diamonds по User ID.

Конвертация валют

  • Ваш баланс партнера: Всегда ведется в USD.
  • Цены товаров: Могут быть в разных валютах (RUB, KZT, EUR и т.д.) в зависимости от региона.
  • Как это работает:
    • Вам не нужно конвертировать средства вручную.
    • Когда вы покупаете товар с ценой в RUB (например, 500 RUB), система рассчитывает эквивалент в USD (например, $5.50) и списывает его с вашего USD баланса.
    • Убедитесь, что у вас достаточно баланса в USD для покрытия конвертированной суммы.
  • Совместимость расчетов с поставщиками: ваш каталог фильтруется по balanceProfile до возврата цен. Это предотвращает продажу fiat-only офферов USDT-only партнерам и наоборот.
  • Без ручной FX-наценки: GamesDrop не требует добавлять дополнительный процент на потери конвертации в API-запрос. Используйте последнюю цену, возвращенную find-one или sync. Любая настроенная B2B-наценка уже включена в возвращаемую цену покупки GamesDrop.

Частые вопросы

"Я вижу упоминание параметра 'it', что это?"

В нашем API нет параметра с именем it. Вероятно, это опечатка вместо id или недопонимание.

  • Идентификатор товара: offerId.
  • Идентификатор транзакции: transactionId.
  • Идентификатор пользователя: gameUserId.

"Как проверить валидность ID игрока?"

Используйте эндпоинт POST /api/v1/offers/check-game-data. Он вернет VALID и никнейм игрока, если ID верен. Это настоятельно рекомендуется для товаров с прямым пополнением, чтобы избежать ошибок.

Поддержка

При возникновении вопросов обращайтесь в техническую поддержку:

Рекомендации по обработке ошибок

🔍 Проверка перед запросом

  • Валидация токена
  • Проверка ID товара
  • Актуальность цены
  • Уникальность transaction_id
  • Корректность формата данных (особенно offerId как число)

🛠 Обработка ответов

  • Обработка всех кодов ошибок
  • Логирование ошибок
  • Механизм повторных попыток

📊 Работа с заказами

  • Сохранение ID заказов
  • Мониторинг статусов
  • Актуализация данных

Telegram Stars

🌟 GamesDrop интегрировал поддержку Telegram Stars! Теперь вы можете отправлять Telegram Stars пользователям через те же стандартные API эндпоинты.

Доступные продукты Telegram Stars

Для Partner API offerId должен быть числовым GamesDrop offer group ID, который возвращается sync или find-one. Строковые ID ниже являются внутренними идентификаторами продуктов провайдера и приведены только для справки.

Internal Provider Product IDКоличество StarsДинамическая цена
telegram_stars_5050Основана на курсе TON
telegram_stars_100100Основана на курсе TON
telegram_stars_500500Основана на курсе TON
telegram_stars_10001000Основана на курсе TON

Как работает ценообразование:

  • A6-Gateway получает актуальный TON/USD курс от kernel currency API
  • Цена рассчитывается на основе Fragment.com коэффициентов (100 Stars ≈ 0.3 TON)
  • Цены обновляются в реальном времени при каждом запросе

Использование тех же эндпоинтов

1. Получение информации о Telegram Stars:

HTTP
POST /api/v1/offers/find-one
Authorization: {{token}}

{
  "offerId": 1001
}

Response:

JSON
{
  "offerId": 1001,
  "productName": "Telegram Stars",
  "offerName": "100 Stars",
  "count": 1,
  "price": 0.77,
  "currency": "USD",
  "isReturnDataForCustomer": true
}

2. Создание заказа на Telegram Stars:

HTTP
POST /api/v1/offers/create-order
Authorization: {{token}}

{
  "offerId": 1001,
  "price": 0.77,
  "transactionId": "tg_stars_12345",
  "customer": {
    "email": "user@example.com",
    "gameUserId": "143594291"
  }
}

Response при успешной доставке:

JSON
{
  "orderId": 10228901,
  "count": 1,
  "price": 0.78,
  "currency": "USD",
  "offerId": 1001,
  "productName": "Telegram Stars",
  "offerName": "100 Stars",
  "status": "COMPLETED",
  "isReturnDataForCustomer": true,
  "fulfillmentData": {
    "telegram_user_id": 143594291,
    "stars_amount": 100,
    "transaction_id": "tg_tx_abc123",
    "delivery_status": "completed"
  },
  "createdAt": "2025-08-26T12:30:15.234Z"
}

Response при ошибке доставки:

JSON
{
  "orderId": 10228902,
  "status": "CANCELED",
  "message": "Failed to deliver Stars: user not found",
  "fulfillmentData": {
    "telegram_user_id": 123456789,
    "stars_amount": 100,
    "delivery_status": "failed",
    "error_message": "user not found"
  },
  "createdAt": "2025-08-26T12:30:15.234Z"
}

🔑 Важные особенности Telegram Stars

gameUserId требования:

  • gameUserId должен быть числовой Telegram User ID для создания заказа
  • Получить User ID можно двумя способами:
    1. 📞 Через @userinfobot в Telegram
    2. 🆕 Через наш API валидации (см. раздел ниже)
  • Пример: "gameUserId": "143594291"
  • ❌ НЕ username (@username) для создания заказа

Статусы доставки:

  • COMPLETED - Stars успешно доставлены пользователю
  • CANCELED - Не удалось доставить (неверный user ID, заблокирован бот, etc.)

Типичные ошибки доставки:

  • "user not found" - неверный Telegram User ID
  • "STARGIFT_INVALID" - пользователь не может получить Stars (restrictions)
  • "bot was blocked by user" - пользователь заблокировал бота

🆔 Валидация Telegram пользователей

🎯 Новый endpoint для валидации username и получения User ID!

Если ваши пользователи знают только свой @username, используйте этот endpoint для получения User ID перед созданием заказа.

Endpoint валидации:

HTTP
POST https://gamesdrop.io/api/aggregator/a6/telegram/user-info
Authorization: {{token}}
Content-Type: application/json

{
  "username": "@igoryan34"
}

Response при успешной валидации:

JSON
{
  "valid": true,
  "username": "igoryan34",
  "userInfo": {
    "id": 143594291,
    "first_name": "Igor",
    "username": "igoryan34",
    "photo_url": "AQADAgADRKgxGzMTjwgABCAI..."
  },
  "message": "User account verified successfully"
}

Response при невозможности получить User ID:

JSON
{
  "valid": true,
  "username": "igoryan34",
  "userInfo": {
    "username": "igoryan34",
    "first_name": "igoryan34"
  },
  "message": "Username format is valid, but user details are not publicly available. Full verification requires user interaction with the bot."
}

Описание полей запроса:

КлючЗначениеДополнение
usernamestringTelegram username с @ или без

Описание полей ответа:

КлючЗначениеДополнение
validbooleanВсегда true для корректных username
usernamestringОчищенный username без @
userInfo.idnumber🎯 User ID для заказов (если доступен)
userInfo.first_namestringИмя пользователя
userInfo.usernamestringUsername пользователя
userInfo.photo_urlstringURL аватара (если доступен)
messagestringОписание результата валидации

⚠️ Важные особенности:

  • Endpoint возвращает User ID только если пользователь взаимодействовал с ботом
  • Если userInfo.id отсутствует, попросите пользователя написать боту @gamesdrop_api_bot
  • Можно передавать как "@username", так и "username"
  • Можно также передавать User ID для получения дополнительной информации

📱 Интеграция для разработчиков

Пример полного flow на JavaScript с валидацией username:

JAVASCRIPT
// 1. Валидировать username и получить User ID
const validateTelegramUser = async (username) => {
  const response = await fetch('https://gamesdrop.io/api/aggregator/a6/telegram/user-info', {
    method: 'POST',
    headers: {
      'Authorization': 'your-token-here',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ username })
  });

  const result = await response.json();

  if (result.valid && result.userInfo && result.userInfo.id) {
    return {
      userId: result.userInfo.id,
      firstName: result.userInfo.first_name,
      username: result.userInfo.username
    };
  } else {
    throw new Error('Unable to get User ID. Please ask user to message @gamesdrop_api_bot first.');
  }
};

// 2. Найти числовой offer group ID в синхронизированном каталоге
const getTelegramStarsOfferGroupId = async (starsAmount) => {
  const response = await fetch('/api/v1/offers/sync', {
    method: 'POST',
    headers: {
      'Authorization': 'your-token-here',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ limit: 5000, page: 1, search: 'Telegram Stars' })
  });
  const catalog = await response.json();
  const row = catalog.rows.find((item) =>
    item.productName?.includes('Telegram Stars') &&
    item.offerGroupName?.includes(String(starsAmount))
  );
  if (!row) {
    throw new Error(`Telegram Stars offer group not found for ${starsAmount} Stars`);
  }
  return row.offerGroupId;
};

// 3. Получить актуальную цену
const getStarsPrice = async (starsAmount) => {
  const offerGroupId = await getTelegramStarsOfferGroupId(starsAmount); // Получаем из синхронизированного каталога
  const response = await fetch('/api/v1/offers/find-one', {
    method: 'POST',
    headers: {
      'Authorization': 'your-token-here',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      offerId: offerGroupId
    })
  });
  return response.json();
};

// 4. Отправить Stars пользователю
const sendStarsByUsername = async (usernameOrId, starsAmount) => {
  // Сначала получаем User ID если передали username
  let userId;
  if (isNaN(usernameOrId)) {
    // Это username, нужно получить User ID
    const userInfo = await validateTelegramUser(usernameOrId);
    userId = userInfo.userId;
    console.log(`✅ Validated user: ${userInfo.firstName} (@${userInfo.username}) - ID: ${userId}`);
  } else {
    // Это уже User ID
    userId = parseInt(usernameOrId);
  }

  // Получаем цену
  const { offerId, price } = await getStarsPrice(starsAmount);

  // Создаем заказ
  const response = await fetch('/api/v1/offers/create-order', {
    method: 'POST',
    headers: {
      'Authorization': 'your-token-here',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      offerId: offerId,
      price: price,
      transactionId: `stars_${Date.now()}`,
      customer: {
        email: "optional@example.com",
        gameUserId: userId.toString()
      }
    })
  });

  const result = await response.json();

  if (result.status === 'COMPLETED') {
    console.log(`✅ Successfully sent ${starsAmount} Stars to User ID ${userId}`);
    return result;
  } else {
    console.error(`❌ Failed to send Stars: ${result.message}`);
    throw new Error(result.message);
  }
};

// Использование:
// С username:
sendStarsByUsername('@igoryan34', 100)
  .then(order => console.log('Order created:', order.orderId))
  .catch(error => console.error('Delivery failed:', error));

// С User ID:
sendStarsByUsername('143594291', 100)
  .then(order => console.log('Order created:', order.orderId))
  .catch(error => console.error('Delivery failed:', error));

💼 B2B кейсы использования

1. Награды в играх:

JAVASCRIPT
// Наградить игрока за достижение
await sendStars(userTelegramId, 50);

2. Промо-кампании:

JAVASCRIPT
// Отправить Stars всем участникам конкурса
const winners = [143594291, 987654321, 456789123];
for (const userId of winners) {
  await sendStars(userId, 100);
}

3. Кэшбек программы:

JAVASCRIPT
// Вернуть часть покупки в виде Stars
const cashbackAmount = Math.floor(purchaseAmount * 0.05); // 5% кэшбек
const starsAmount = Math.min(cashbackAmount * 100, 1000); // конвертируем в Stars
await sendStars(userTelegramId, starsAmount);

⚡ Performance и лимиты

  • Rate limiting: 30 запросов в секунду на Telegram API
  • Minimum amount: 1 Star
  • Maximum amount: 2500 Stars за одну транзакцию
  • Retry logic: Автоматические повторы при временных ошибках
  • Delivery time: Мгновенная доставка (< 3 секунды)

🛡️ Безопасность

  • Валидация Telegram User ID перед отправкой
  • Проверка баланса GamesDrop перед созданием заказа
  • Логирование всех операций для аудита
  • Защита от дублированных транзакций через transactionId