Prices in US Dollar (USD). Switch to USDT, Euro, INR or your currency β€” live rates.
Wallet checkout Add funds once, then buy any in-stock plan Your balance is charged only when you place the order.
Shop plans

Reseller API

Wholesale API documentation

Connect your website or Telegram bot to OTT24x7. Fetch your wholesale catalogue and buy stock with a Bearer token. Unlocked resellers only.

Base URL: http://myvirtualmarket.com Β· OpenAPI: /reseller/openapi.json

Authentication

Issue a key in the reseller panel β†’ API. The raw token is shown once. Send it on every request:

Authorization: Bearer rs_live_xxxxxxxx_secret

Or: X-Reseller-Token: YOUR_TOKEN

POST /reseller/check-token

curl -s -X POST http://myvirtualmarket.com/reseller/check-token \
  -H "Authorization: Bearer YOUR_TOKEN"

Products

price is what you pay (admin wholesale rate). Charge your buyers whatever you want.

GET /reseller/products

curl -s http://myvirtualmarket.com/reseller/products \
  -H "Authorization: Bearer YOUR_TOKEN"
{
  "ok": true,
  "products": [
    {
      "id": 12,
      "name": "ChatGPT Go 3 months",
      "category": "ai",
      "price": 149,
      "retail_price": 199,
      "delivery_type": "auto",
      "stock": 36,
      "in_stock": true
    }
  ]
}

GET /reseller/products/{id}

curl -s http://myvirtualmarket.com/reseller/products/12 \
  -H "Authorization: Bearer YOUR_TOKEN"

Purchase

Debits spendable wallet (not 7-day activation holds). Auto products return keys in delivery_payload. Manual products return status: pending.

POST /reseller/purchase

curl -s -X POST http://myvirtualmarket.com/reseller/purchase \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"product_id":12,"quantity":1}'
{
  "ok": true,
  "order_id": 1042,
  "status": "delivered",
  "product_id": 12,
  "product_name": "ChatGPT Go 3 months",
  "quantity": 1,
  "amount_charged": 149,
  "formatted_amount": "β‚Ή149",
  "delivery_type": "auto",
  "delivered_qty": 1,
  "delivery_payload": ["CODE-123"],
  "balance": 2351,
  "held": 5000
}

Optional: qty instead of quantity, buyer_info object, voucher_code for a 100% product voucher.

Python

import requests
BASE = "http://myvirtualmarket.com"
H = {"Authorization": "Bearer YOUR_TOKEN"}
products = requests.get(BASE + "/reseller/products", headers=H).json()["products"]
buy = requests.post(BASE + "/reseller/purchase", headers=H, json={"product_id": 12, "quantity": 1}).json()
print(buy.get("delivery_payload"))

Wallet

GET /reseller/balance

curl -s http://myvirtualmarket.com/reseller/balance \
  -H "Authorization: Bearer YOUR_TOKEN"
{
  "ok": true,
  "balance": 7351,
  "spendable": 2351,
  "held": 5000,
  "formatted_balance": "β‚Ή7,351",
  "formatted_spendable": "β‚Ή2,351",
  "formatted_held": "β‚Ή5,000",
  "discount_pct": 20
}

Purchases fail with funds_on_hold if spendable is too low. Top up at /reseller/wallet.

Orders

GET /reseller/orders

Query ?filter=today|7d|30d|delivered|pending|failed|refunded

curl -s "http://myvirtualmarket.com/reseller/orders?filter=7d" \
  -H "Authorization: Bearer YOUR_TOKEN"

GET /reseller/orders/{order_id}

Includes keys / delivery_payload when delivered.

curl -s http://myvirtualmarket.com/reseller/orders/1042 \
  -H "Authorization: Bearer YOUR_TOKEN"

Errors

HTTPerrorMeaning
401missing_tokenNo Bearer header
401invalid_tokenUnknown or rotated key
403token_disabledYou disabled the key
403activation_lockedPay β‚Ή activation to unlock
403reseller_disabledAccount not approved
402funds_on_hold / insufficient_balanceNeed spendable wallet
404product_not_foundInactive or missing SKU
403product_hiddenHidden for your account
409out_of_stockNot enough auto stock
429rate_limitedSlow down (120 req/min)

Also: GET /reseller/categories, GET /reseller/settings, POST /reseller/rotate-token, POST /reseller/disable-token.