Оптовый API цифровых подписок
Подключите каталог к своему Telegram-боту или сайту
GemHub AI поставляет лицензии и подписки для AI (ChatGPT Plus, Gemini Advanced), мультимедиа (Spotify, YouTube, Duolingo) и связи (Telegram Premium). С помощью Reseller API вы можете автоматически продавать эти товары своим клиентам по оптовым ценам в сомони (TJS) со списанием с единого баланса и моментальной выдачей ключей.
idempotencyKey исключает списания при сбоях.🔑 Где взять собственный API-ключ?
API-ключ генерируется мгновенно и бесплатно через официального Telegram-бота. Вам не нужно ждать одобрения заявки или связываться с менеджером — начните интеграцию прямо сейчас.
Перейдите в Telegram-бота @gemhubaibot и нажмите Start.
Отправьте боту команду /api (или /apikey). Бот сразу закрепит за вами профиль партнера.
Бот пришлет ваш персональный секретный токен вида gh_res_... и покажет вашу наценку.
Пополните счет в сомони (TJS) через DC Next (0% комиссии), картой Корти Милли или USDT.
/api
🔄 Схема работы интеграции
Reseller API работает в синхронном режиме. Весь цикл от оплаты покупателем до выдачи лицензии происходит в один HTTP-запрос.
productId и уникальным idempotencyKey.credentials (ссылка, аккаунт или код) для клиента.503 FULFILLMENT_FAILED. Деньги партнера никогда не блокируются.🔐 Авторизация запросов
Каждый запрос к защищенным эндпоинтам должен содержать ваш секретный API-ключ в HTTP-заголовке X-API-Key или Authorization: Bearer.
# Способ 1: заголовок X-API-Key (рекомендуется)
X-API-Key: gh_res_0ac2b09a4ad965ab9fe6986efd57cb27
# Способ 2: стандартный Bearer-токен
Authorization: Bearer gh_res_0ac2b09a4ad965ab9fe6986efd57cb27
.env). Никогда не передавайте ключ в клиентский JavaScript, браузер или публичные репозитории.📐 Формат данных и валюта TJS
Формат JSON и сомони (TJS)
- Все ответы возвращаются с
Content-Type: application/json; charset=utf-8. - Основная расчетная валюта оптового шлюза — таджикский сомони (TJS).
- Цены возвращаются числом (например:
8.0или245.0). - Время передается в формате ISO 8601 UTC.
Каталог и живой склад
productId— постоянный символьный идентификатор позиции (например:chatgpt_plus,gemini_advanced_18m).stock— суммарный доступный остаток на локальном складе и прямых шлюзах поставщиков.- В каталоге возвращаются только активные товары с готовой автовыдачей.
🔁 Идемпотентность заказов
При создании заказа (POST /orders) параметр idempotencyKey является строго обязательным (от 6 до 128 символов). Это гарантирует защиту от двойного списания денег при нестабильном интернете или перезапусках ваших скриптов.
POST https://gemhubai.shop/api/v1/reseller/orders
X-API-Key: gh_res_...
{
"productId": "gemini_advanced_18m",
"idempotencyKey": "order_ext_20261015_001",
"customerAccount": "[email protected]"
}
Если запрос с тем же idempotencyKey отправляется повторно, шлюз не списывает деньги второй раз, а возвращает уже созданный ранее заказ с флагом "duplicate": true.
⏱️ Лимиты запросов (Rate Limits)
Стандартный лимит для одного партнера составляет 120 запросов в минуту на чтение каталога и 20 запросов в минуту на создание заказов. При превышении возвращается 429 RATE_LIMIT_EXCEEDED.
Проверяет доступность шлюза и валидность вашего API-ключа.
curl -s "https://gemhubai.shop/api/v1/reseller/ping" \
-H "X-API-Key: YOUR_API_KEY"
{
"ok": true,
"reseller": "@your_username",
"status": "active",
"balanceTjs": 150.0,
"currency": "TJS",
"build": "gemhub-reseller-api v1.2",
"serverTime": "2026-10-15T15:00:00.000Z"
}
Возвращает актуальный остаток сомони на балансе, размер установленной оптовой наценки и статистику покупок.
curl -s "https://gemhubai.shop/api/v1/reseller/me" \
-H "X-API-Key: YOUR_API_KEY"
{
"ok": true,
"partner": {
"id": "res_1175046908",
"name": "@my_reseller_bot",
"userId": 1175046908,
"balanceTjs": 150.0,
"marginTjs": 5.0,
"totalOrders": 12,
"totalSpentTjs": 1420.0,
"currency": "TJS",
"isActive": true,
"createdAt": "15.10.2026 03:07"
},
"serverTime": "2026-10-15T15:00:00.000Z"
}
Возвращает список всех доступных товаров с вашими индивидуальными оптовыми ценами (wholesalePriceTjs), ориентировочной розничной ценой, расчетной прибылью с единицы и текущим остатком на складе.
curl -s "https://gemhubai.shop/api/v1/reseller/products" \
-H "X-API-Key: YOUR_API_KEY"
{
"ok": true,
"count": 39,
"currency": "TJS",
"products": [
{
"id": "gemini_advanced_18m",
"title": "Google One + Gemini Advanced (18 мес)",
"description": "2 TB облака Google One и доступ к Gemini Advanced.",
"instructions": "Перейдите по ссылке инвайта и подтвердите вход в семейную группу.",
"category": "ai",
"inStock": true,
"stock": 50,
"wholesalePriceTjs": 8.0,
"retailPriceTjs": 19.0,
"yourProfitTjs": 11.0,
"supplierCostTjs": 5.0,
"customMarginTjs": 3.0
},
{
"id": "chatgpt_plus",
"title": "ChatGPT Plus (1 месяц)",
"description": "Персональная подписка: GPT-4o, DALL-E 3, холст и анализ файлов.",
"instructions": "Войдите на chatgpt.com полученными данными.",
"category": "ai",
"inStock": true,
"stock": 25,
"wholesalePriceTjs": 245.0,
"retailPriceTjs": 269.0,
"yourProfitTjs": 24.0,
"supplierCostTjs": 240.0,
"customMarginTjs": 5.0
}
]
}
Списывает оптовую стоимость с вашего TJS-баланса, закупает товар и моментально возвращает клиенту данные для доступа.
Параметры запроса (JSON Body)
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
productId | string | Да | Идентификатор товара из каталога (например: gemini_advanced_18m). |
idempotencyKey | string | Да | Уникальный ключ заказа в вашей базе (6–128 символов) для защиты от повторных списаний. |
customerAccount | string | Опционально | Email покупателя (нужен только для товаров, активируемых на аккаунт клиента). |
curl -X POST "https://gemhubai.shop/api/v1/reseller/orders" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"productId": "gemini_advanced_18m",
"idempotencyKey": "my-bot-order-98214",
"customerAccount": "[email protected]"
}'
{
"ok": true,
"order": {
"id": "ORD-C9028FA12E",
"productId": "gemini_advanced_18m",
"productTitle": "Google One + Gemini Advanced (18 мес)",
"status": "delivered",
"wholesalePriceTjs": 8.0,
"credentials": {
"type": "promo_link",
"promoUrl": "https://one.google.com/promo/family/invite/...",
"instructions": "Перейдите по ссылке и подтвердите подключение к семейной группе."
},
"newBalanceTjs": 142.0,
"createdAt": "15.10.2026, 15:32"
}
}
Повторное получение информации и реквизитов ранее созданного заказа по его номеру id.
curl -s "https://gemhubai.shop/api/v1/reseller/orders/ORD-C9028FA12E" \
-H "X-API-Key: YOUR_API_KEY"
{
"ok": true,
"order": {
"id": "ORD-C9028FA12E",
"productId": "gemini_advanced_18m",
"productTitle": "Google One + Gemini Advanced (18 мес)",
"status": "delivered",
"wholesalePriceTjs": 8.0,
"credentials": {
"type": "promo_link",
"promoUrl": "https://one.google.com/promo/family/invite/...",
"instructions": "Перейдите по ссылке и подтвердите подключение к семейной группе."
},
"createdAt": "15.10.2026, 15:32"
}
}
💎 Ценообразование и оптовая маржа
Все расчеты ведутся в сомони (TJS). Оптовая стоимость для партнера рассчитывается прозрачно: Себестоимость поставщика + Фиксированная наценка партнера.
📦 Форматы выдачи (поле credentials)
В зависимости от типа подписки объект credentials в ответе заказа содержит готовые данные для отправки клиенту:
- Инвайт-ссылка (
type: "promo_link"): полеpromoUrlсо ссылкой на автоматическое подключение подписки (Google One, Canva Teams и др.). - Готовый аккаунт (
type: "account"): поляloginиpasswordдля входа в сервис. - Лицензионный ключ (
type: "code"): полеcodeс кодом активации подписки. - Инструкция (
instructions): пошаговое описание на русском языке, которое можно сразу переслать покупателю.
🚨 Справочник кодов ошибок
В случае ошибки API возвращает соответствующий HTTP-код и тело ответа {"ok": false, "error": "КОД", "message": "Описание"}.
| HTTP | Код ошибки | Причина и необходимое действие |
|---|---|---|
| 400 | MISSING_PRODUCT_ID | Не указан productId товара. Передайте ID из каталога. |
| 400 | INVALID_IDEMPOTENCY_KEY | Ключ идемпотентности короче 6 или длиннее 128 символов. |
| 401 | UNAUTHORIZED / INVALID_API_KEY | Не передан или не найден API-ключ. Проверьте заголовок X-API-Key. |
| 402 | INSUFFICIENT_BALANCE | Недостаточно сомони на балансе. Пополните счет в боте @gemhubaibot. |
| 404 | PRODUCT_NOT_FOUND | Товар временно снят с продажи или не существует в каталоге. |
| 404 | ORDER_NOT_FOUND | Заказ с указанным ID не найден или оформлен другим партнером. |
| 409 | ORDER_PROCESSING | Запрос с данным idempotencyKey уже обрабатывается прямо сейчас. Подождите пару секунд. |
| 409 | OUT_OF_STOCK | Товар временно закончился у поставщиков. |
| 429 | RATE_LIMIT_EXCEEDED | Превышен лимит запросов в минуту. Повторите запрос через 30–60 секунд. |
| 503 | FULFILLMENT_FAILED | Ошибка выдачи у внешнего поставщика. Средства мгновенно возвращены на ваш баланс. |
💻 Примеры кода интеграции
import requests
API_KEY = "gh_res_0ac2b09a4ad965ab9fe6986efd57cb27"
BASE_URL = "https://gemhubai.shop/api/v1/reseller"
HEADERS = {"X-API-Key": API_KEY}
# 1. Проверяем баланс партнера
me = requests.get(f"${BASE_URL}/me", headers=HEADERS).json()
print("Баланс партнера:", me["partner"]["balanceTjs"], "TJS")
# 2. Получаем актуальный каталог и цены
catalog = requests.get(f"${BASE_URL}/products", headers=HEADERS).json()
for p in catalog.get("products", []):
print(f"- {p['title']}: {p['wholesalePriceTjs']} TJS (Остаток: {p['stock']})")
# 3. Покупаем подписку клиенту
payload = {
"productId": "gemini_advanced_18m",
"idempotencyKey": "order_client_98231",
"customerAccount": "[email protected]"
}
res = requests.post(f"${BASE_URL}/orders", json=payload, headers=HEADERS).json()
if res.get("ok"):
print("✅ Доступ успешно выдан!")
print("Реквизиты:", res["order"]["credentials"])
print("Новый остаток баланса:", res["order"]["newBalanceTjs"], "TJS")
else:
print("❌ Ошибка покупки:", res.get("error"), res.get("message"))
import axios from 'axios';
const API_KEY = 'gh_res_0ac2b09a4ad965ab9fe6986efd57cb27';
const BASE_URL = 'https://gemhubai.shop/api/v1/reseller';
const client = axios.create({
baseURL: BASE_URL,
headers: { 'X-API-Key': API_KEY }
});
async function main() {
// 1. Проверяем баланс
const { data: me } = await client.get('/me');
console.log(`Баланс партнера: ${me.partner.balanceTjs} TJS`);
// 2. Создаем заказ с защитой от дублей
const { data: orderRes } = await client.post('/orders', {
productId: 'chatgpt_plus',
idempotencyKey: 'bot_order_' + Date.now(),
customerAccount: '[email protected]'
});
if (orderRes.ok) {
console.log('✅ Товар выдан:', orderRes.order.credentials);
console.log('Остаток на балансе:', orderRes.order.newBalanceTjs, 'TJS');
}
}
main().catch(console.error);
# 1. Проверка доступности и статуса ключа
curl -s "https://gemhubai.shop/api/v1/reseller/ping" \
-H "X-API-Key: YOUR_API_KEY"
# 2. Получение каталога и оптовых цен
curl -s "https://gemhubai.shop/api/v1/reseller/products" \
-H "X-API-Key: YOUR_API_KEY"
# 3. Создание заказа
curl -X POST "https://gemhubai.shop/api/v1/reseller/orders" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"productId": "gemini_advanced_18m",
"idempotencyKey": "unique_tx_order_001"
}'
❓ Частые вопросы (FAQ)
Как пополнить баланс реселлера?
Баланс привязан к вашему Telegram-профилю. Пополнить счет в сомони (TJS) можно прямо в боте @gemhubaibot через кошелек DC Next (Dushanbe City) без комиссии (0%), любой картой Корти Милли или криптовалютой USDT. Средства мгновенно зачисляются на счет.
Как получить или перевыпустить API-ключ?
Отправьте команду /api в боте @gemhubaibot. Бот сразу выдаст ваш действующий ключ. При необходимости перевыпуска ключа обратитесь в поддержку @gemhubai.
Что произойдет, если у внешнего поставщика закончился товар?
Система защищает средства партнера. Если поставщик не смог выдать лицензию, списанные сомони автоматически возвращаются на ваш баланс, а API отдает статус 503 FULFILLMENT_FAILED. Деньги никогда не зависают.
Есть ли комиссия за создание заказов через API?
Нет. За закупку товаров комиссия 0%. С вашего баланса списывается ровно указанная оптовая стоимость wholesalePriceTjs.
💬 Поддержка и контакты
По всем техническим вопросам интеграции, индивидуальным скидкам на большие объемы и сотрудничеству: