Gift a premium subscription Surprise someone you love. Sent to their email.

Send a gift
Developers

Reseller APIs documentation.

Use our advanced Buyer API v2 for custom software, or connect PerfectPanel, RentalPanel, ExcelPanel and other standard SMM panels through the SMM Provider API. Both use the same reseller balance, pricing and live catalog.

Overview

Approved reseller accounts can sell the same live catalog in two different ways. Both integrations use your existing reseller key, prepaid balance, reseller pricing, stock and fulfilment engine; only the external protocol is different.

Developer APIhttps://aitoolspro.org/wp-json/reseller/v2
SMM Panel APIhttps://aitoolspro.org/smm-api/v2
CurrencyUSD

Choose the right API

IntegrationBest forDelivery
Developer API (Buyer API v2)Custom websites, AI Pro child panels, apps, bots and developer integrations.Delivery data can be returned through the authenticated API.
SMM Panel APIPerfectPanel, RentalPanel, ExcelPanel and standard SMM provider connections.The order email is sent in the Link field; credentials/access are emailed directly to that customer.

Already own an SMM panel? Use the SMM Panel API below. Do not connect your panel to the Buyer API v2 endpoint.

SMM Panel API

This endpoint follows the common POST-based SMM provider format. Add it as a provider in your SMM panel and use your approved reseller API key.

API URLhttps://aitoolspro.org/smm-api/v2
HTTP methodPOST
ResponseJSON

Service list

POST
key=rsk_YOUR_KEY&action=services
Example response
[
  {
    "service": 101,
    "name": "ChatGPT Plus 1 Month",
    "type": "Default",
    "category": "ChatGPT",
    "rate": "5000.00",
    "min": "1",
    "max": "8",
    "desc": "Enter the customer's delivery email in the Link field.",
    "refill": false,
    "cancel": true
  }
]

Pricing note: standard SMM panels calculate charge as rate × quantity ÷ 1000. A $5 per-unit product is therefore exposed as rate 5000, while your reseller wallet is still charged the real $5 unit price.

Add order

For digital products the Link field is the customer delivery email. The API also accepts url, email or customer_email aliases when the sending software supports them.

POST
key=rsk_YOUR_KEY&action=add&service=101&[email protected]&quantity=1
Success
{
  "order": 58421
}

Order status

POST
key=rsk_YOUR_KEY&action=status&order=58421
Example response
{
  "charge": "5.00",
  "start_count": "0",
  "status": "Completed",
  "remains": "0",
  "currency": "USD"
}

The status response never exposes customer credentials. Access details are delivered to the email supplied with the order.

Balance

POST
key=rsk_YOUR_KEY&action=balance
Response
{
  "balance": "100.84",
  "currency": "USD"
}

Automatic stock sync

SMM services use stable service IDs. When a product runs out of stock it becomes unavailable in the provider feed; when stock returns, the same service ID becomes available again. You do not need to recreate or remap the service.

  • Finite stock automatically limits the SMM max quantity.
  • Out-of-stock services are blocked even if the reseller panel has not synced yet.
  • No wallet deduction or provider purchase is made when the service is unavailable.
  • Restocking clears the catalog state so the next provider sync can reopen the same service.
Out-of-stock response
{
  "error": "Service temporarily unavailable"
}

Enable automatic provider/service synchronization in your SMM panel. The exact sync interval and automatic re-enable behavior are controlled by that panel software.

Developer API authentication

Create a key in your panel under Reseller API. Keys start with rsk_ and are shown only once, so store yours on your server when you create it. You can revoke a key at any time and restrict it to your server IP addresses.

Send the key in one of these ways (the first one found is used):

  • Authorization: Bearer rsk_... - recommended
  • X-API-Key: rsk_...
  • ?key=rsk_... query parameter, or "key" in the JSON body (avoid: URLs end up in logs)
curl
curl -s "https://aitoolspro.org/wp-json/reseller/v2/me" \
  -H "Authorization: Bearer rsk_YOUR_KEY"
Response
{
  "success": true,
  "account": { "id": 123, "name": "My Shop", "reseller": true,
               "discountPercent": 20, "balance": 48.5, "currency": "USD" },
  "key": { "prefix": "rsk_AbCdEf", "label": "My panel" },
  "limits": { "requestsPerMinute": 120 },
  "apiVersion": "2.0"
}

Rate limits

Each key may make 120 requests per minute. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Above the limit the API answers 429 RATE_LIMITED with a Retry-After header; wait that many seconds before trying again.

Poll the catalog every 30 to 60 seconds at most: stock and prices are refreshed about once a minute.

Safe retries

Send an Idempotency-Key header (1 to 100 characters: letters, digits and . _ : -) with every purchase, for example your own order number. Repeating the same request with the same key never buys twice; it returns the original order and its delivery once ready.

  • Same key, same body: the same order (HTTP 200, "idempotentReplay": true).
  • Same key, different product, quantity or customer_email: 422 IDEMPOTENCY_CONFLICT.
  • Same key while the first request is still running: 409 REQUEST_IN_PROGRESS. Retry in a minute.
  • A refused attempt (for example low balance) can be repeated with the same key after you fix the cause.

Keys are scoped to your reseller account, so one key per customer order is enough even if you run several shops.

Endpoints

MethodPathWhat it does
GET/meAccount, discount, balance and key details
GET/productsFull catalog at your reseller price, with live stock
GET/products/{productId}One product, including its full description
GET/balanceYour prepaid balance
POST/purchaseBuy a product from your balance
GET/orders/{orderCode}Status and delivery of one order
GET/orders?limit=20&page=1Your order history (limit 1-100)
GET/products

Prices are already your reseller price. Plans of one service are listed as separate products. availability.available is 0 when sold out; 999 means no fixed limit. When purchaseRequirements.customerEmail is true you must send customer_email (the end customer's address, where invites are sent). quantityFixed: 1 means one unit per request.

Response
{
  "success": true,
  "currency": "USD",
  "count": 1,
  "products": [
    {
      "productId": "svc_123",
      "name": "ChatGPT Plus - 1 Month",
      "description": "Private account with full access...",
      "image": "https://aitoolspro.org/wp-content/uploads/chatgpt.png",
      "category": "AI Tools",
      "productType": "account",
      "price": { "amount": 4.5, "currency": "USD", "text": "$4.50", "suggestedRetail": 5.5 },
      "availability": { "available": 12, "inStock": true },
      "purchaseRequirements": { "customerEmail": false, "minQuantity": 1, "maxQuantity": 20 }
    }
  ]
}
GET/balance
Response
{ "success": true, "balance": 48.5, "currency": "USD", "balanceText": "$48.50" }

Top up in your panel: Add funds.

Buying

POST/purchase
FieldRequiredNotes
product_idyesproductId from the catalog
quantityno1-20, default 1
customer_emailwhen requiredYour customer's email, for invite and slot products
referencenoYour own order reference (up to 100 characters), echoed back
max_unit_pricenoPrice protection: refuse with 409 PRICE_CHANGED if the price rose above this
curl
curl -s -X POST "https://aitoolspro.org/wp-json/reseller/v2/purchase" \
  -H "Authorization: Bearer rsk_YOUR_KEY" \
  -H "Idempotency-Key: order-1001" \
  -H "Content-Type: application/json" \
  -d '{"product_id":"svc_123","quantity":1,"reference":"order-1001"}'
Response (201 Created)
{
  "success": true,
  "idempotentReplay": false,
  "order": {
    "orderCode": "R7K2M9QX4PZA",
    "status": "completed",
    "productId": "svc_123",
    "quantity": 1,
    "reference": "order-1001",
    "createdAt": "2026-09-13T10:00:00+00:00",
    "deliveredAt": "2026-09-13T10:00:04+00:00"
  },
  "payment": { "amount": 4.5, "currency": "USD", "unitPrice": 4.5, "refundedAmount": 0, "balanceAfter": 44.0 },
  "delivery": { "items": [ { "Email": "[email protected]", "Password": "••••••••" } ] },
  "deliveryText": "Email: [email protected]\nPassword: ••••••••"
}

Your balance is charged the reseller price multiplied by the quantity. The response shows the current order state; products that support synchronous delivery may also return delivery details in that response.

Order status

processingPaid and being prepared. No delivery yet.
completedDelivered. delivery and deliveryText are included.
refundedCould not be delivered; the amount went back to your balance.
cancelledCancelled before delivery.

While an order is processing, either poll GET /orders/{orderCode} or repeat the same purchase with the same Idempotency-Key. Back off between checks: 1 minute, 2, 5, 15, then hourly.

curl
curl -s "https://aitoolspro.org/wp-json/reseller/v2/orders/R7K2M9QX4PZA" \
  -H "Authorization: Bearer rsk_YOUR_KEY"

Delivery format

delivery.items holds one object per delivered unit. Labelled lines such as "Email: ..." become fields; any other text is kept under Access or Note. deliveryText carries the same details as plain text, ready to show to your customer.

Delivery details are credentials. Show them only to the customer who bought them and never write them to public logs.

Errors

Every error has the same shape. Branch on error.code, show message to people.

Error body
{
  "success": false,
  "message": "Insufficient balance. You need $1.20 more. Top up, then retry with the same Idempotency-Key.",
  "error": { "code": "INSUFFICIENT_BALANCE", "message": "..." },
  "requestId": "req_..."
}
HTTPCodeMeaning
401UNAUTHORIZEDMissing, invalid or revoked key.
403FORBIDDENAccount not approved or suspended, or IP not allowed for this key.
403HTTPS_REQUIREDThe request was not made over HTTPS.
402INSUFFICIENT_BALANCEBalance too low. Top up and retry with the same Idempotency-Key.
404NOT_FOUNDUnknown product or order.
409OUT_OF_STOCKNot enough stock right now.
409PRICE_CHANGEDThe price is above your max_unit_price.
409PRICE_UPDATINGThe product is paused while its price is updated. Nothing was charged.
409REQUEST_IN_PROGRESSThe same Idempotency-Key is still running. Retry shortly.
410ORDER_NOT_DELIVEREDThat order could not be delivered and was refunded.
422VALIDATION_ERRORA field is invalid; the message names it.
422EMAIL_REQUIREDThis product needs customer_email.
422IDEMPOTENCY_CONFLICTIdempotency-Key reused with a different body.
429RATE_LIMITEDToo many requests. Wait for Retry-After.
503TEMPORARILY_UNAVAILABLEStock or price could not be verified. Nothing was charged; retry later.
503API_DISABLEDThe API is switched off for maintenance.
500SERVER_ERRORUnexpected error. Repeat purchases with the same Idempotency-Key to learn their real state.

Child panel setup

Running AI Pro Control on your own domain? Connect it in one minute:

  1. Open Control > API > Add provider.
  2. Adapter: AI Pro reseller API (parent panel).
  3. Base URL: https://aitoolspro.org
  4. Paste your rsk_ key, tick Enable, save, then press Test connection.
  5. Open API products and import the services you want to sell with your own prices.

Other Buyer API v2 software: use the base URL above with the paths /products, /balance and /purchase, and send the key as a Bearer token or X-API-Key header.

Get a child panel on your own domain

Best practices

  • Keep keys on your server. Never put a key in a browser, mobile app or public repository.
  • Use one key per shop or bot, restrict each key to your server IPs, and revoke keys you no longer use.
  • Always send an Idempotency-Key with purchases and reuse it for retries of the same order.
  • Check GET /balance before busy periods and top up early; low balance pauses orders.
  • Cache the catalog for 30-60 seconds instead of requesting it for every visitor.
Chat with us Sign in