ProdSeller API
Resell products from your balance on any bot or website. Authenticate with your API key, list available products, create orders deducted from your balance, and get instant key delivery.
API Key Auth
Send your key in the X-API-Key header with every request.
Balance-based
Orders are deducted directly from your USDT balance — no payment step needed.
Rate limit
300 requests per 15 minutes per IP. Use the X-RateLimit-* headers to track usage.
Authentication
Every request must include your API key in the X-API-Key request header. Get or generate your key in the ProdSeller admin panel under API Manager.
Header format
X-API-Key: psk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# curl curl -H "X-API-Key: psk_YOUR_KEY" https://prodseller.com/v1/balance
Error Handling
All errors return a JSON object with an error field and a standard HTTP status code.
// Error response shape { "error": "Solde insuffisant" }
| Code | Meaning |
|---|---|
| 401 | API key missing, invalid, or disabled |
| 400 | Bad request — missing or invalid parameter |
| 402 | Insufficient balance |
| 404 | Resource not found |
| 409 | Conflict — e.g., out of stock |
| 429 | Rate limit exceeded |
| 500 | Internal server error |
Endpoints
Returns all active products available for purchase. price is the actual unit price your API key will be charged at POST /v1/orders — it already reflects any account-specific or API-wide fixed price set for this product. publicPrice is the standard listed price, shown for reference/comparison only.
{
"products": [
{
"id": "64abc...",
"name": "Netflix 1 Month",
"description": "Premium account",
"price": 4.99, // what you will actually be charged
"publicPrice": 5.99, // standard listed price, for reference
"imageUrl": "https://...",
"delivery": { "type": "instant" },
"sold": 120,
"inStock": true
}
]
}
| Parameter | Type | Description |
|---|---|---|
| id * | string | MongoDB product ID |
{
"id": "64abc...",
"name": "Netflix 1 Month",
"price": 4.99, // what you will actually be charged
"publicPrice": 5.99, // standard listed price, for reference
"stock": 47, // null for custom-delivery products
"delivery": { "type": "instant" }
}
Returns the balance and membership tier of the user linked to the API key.
{
"telegramId": 123456789,
"username": "mybot",
"balance": 25.50,
"membership": "gold"
}
Purchases a product and delivers the key(s) instantly. The order amount is deducted from your balance. Your membership discount is applied automatically.
Recommended: prevent duplicate charges
Send a stable, unique Idempotency-Key header for each customer checkout (maximum 100 characters). Retrying the same checkout with the same key returns the first order without charging the balance again.
Request body
| Field | Type | Description |
|---|---|---|
| productId * | string | Product ID to purchase |
| quantity | number | Quantity (default: 1) |
{
"productId": "64abc...",
"quantity": 1
}
{
"orderId": "64xyz...",
"status": "delivered",
"product": { "id": "64abc...", "name": "Netflix 1 Month" },
"quantity": 1,
"amount": 4.99,
"membershipDiscount": 5,
"bulkDiscount": null,
"discountAmount": 0.25,
"deliveredKey": "email:pass123", // single key
"deliveredKeys": ["key1", "key2"], // multiple (quantity > 1)
"createdAt": "2026-01-15T10:30:00Z"
}
Returns your own order history (every order placed with this account's API key), newest first. Use this to recover order IDs if your integration didn't store them.
| Parameter | Type | Description |
|---|---|---|
| page | number | Page number, default 1 |
| limit | number | Results per page, default 50, max 200 |
| status | string | Filter by status: pending | paid | delivered | failed |
{
"orders": [
{
"orderId": "64xyz...",
"status": "delivered",
"product": { "id": "...", "name": "..." },
"quantity": 1,
"amount": 4.99,
"deliveredKey": "email:pass",
"createdAt": "2026-08-10T12:00:00.000Z"
}
],
"pagination": { "page": 1, "limit": 50, "total": 3, "pages": 1 }
}
| Parameter | Type | Description |
|---|---|---|
| id * | string | Order ID returned from POST /orders |
{
"orderId": "64xyz...",
"status": "delivered", // pending | paid | delivered | failed
"product": { "id": "...", "name": "..." },
"quantity": 1,
"amount": 4.99,
"deliveredKey": "email:pass"
}
Code Examples
Python
import requests API_KEY = "psk_YOUR_KEY_HERE" BASE_URL = "https://prodseller.com/v1" HEADERS = { "X-API-Key": API_KEY } # 1. List products products = requests.get(f"{BASE_URL}/products", headers=HEADERS).json()["products"] product = products[0] print(f"Buying: {product['name']} — ${product['price']}") # 2. Check balance balance = requests.get(f"{BASE_URL}/balance", headers=HEADERS).json()["balance"] print(f"Balance: ${balance}") # 3. Create order order = requests.post(f"{BASE_URL}/orders", headers=HEADERS, json={ "productId": product["id"], "quantity": 1 }).json() print(f"Key: {order.get('deliveredKey')}")
Node.js
const API_KEY = 'psk_YOUR_KEY_HERE'; const BASE_URL = 'https://prodseller.com/v1'; const headers = { 'X-API-Key': API_KEY, 'Content-Type': 'application/json', 'Idempotency-Key': 'checkout_123' }; // List products const { products } = await fetch(`${BASE_URL}/products`, { headers }).then(r => r.json()); // Buy first product const order = await fetch(`${BASE_URL}/orders`, { method: 'POST', headers, body: JSON.stringify({ productId: products[0].id, quantity: 1 }) }).then(r => r.json()); console.log('Delivered key:', order.deliveredKey);
Telegram Bot (python-telegram-bot)
from telegram import Update from telegram.ext import CommandHandler, ApplicationBuilder import requests API_KEY = "psk_YOUR_KEY" HEADERS = { "X-API-Key": API_KEY } BASE = "https://prodseller.com/v1" async def buy(update: Update, context): args = context.args if not args: await update.message.reply_text("Usage: /buy <productId>") return resp = requests.post(f"{BASE}/orders", headers=HEADERS, json={ "productId": args[0], "quantity": 1 }) order = resp.json() if "error" in order: await update.message.reply_text(f"❌ {order['error']}") else: key = order.get("deliveredKey", "(pending delivery)") await update.message.reply_text(f"✅ Order #{order['orderId'][:8]}\n\n🔑 {key}") app = ApplicationBuilder().token("BOT_TOKEN").build() app.add_handler(CommandHandler("buy", buy)) app.run_polling()