Reseller API v1
Base URL https://smm.windelsai.com/api/v1. Authenticate with X-Api-Key: wind_….
Create a key in your dashboard. Machine-readable docs at
/api/docs/json.
Authentication & envelope
Every response is JSON: {success, data|error, meta?, requestId}.
Mutating POSTs accept an Idempotency-Key header. Rate limits are returned via
X-RateLimit-Limit, X-RateLimit-Remaining, and Retry-After.
curl https://smm.windelsai.com/api/v1/balance \
-H "X-Api-Key: wind_yourkey"
Key scopes
A key may have full access or an explicit allow-list. A request outside that allow-list returns
403 SCOPE_FORBIDDEN. Available scopes are:
services.read | Read services and resolved prices. |
|---|---|
orders.read | Read orders and refill statuses. |
orders.write | Place, refill, and cancel orders. |
account.read | Read wallet balance. |
referrals.read | Read referral and commission totals. |
Endpoints
| Path | Description | |
|---|---|---|
| GET | /services | List active services with your price. Filters: category, q, page, limit. |
| GET | /services/:public_id | Single service. |
| GET | /balance | Wallet balance and currency. |
| POST | /orders | Place an order. Body: {service, link, quantity, fields?, note?}. |
| POST | /orders/mass | Place up to 100 instructions. Body: {orders:[{service, link, quantity}]}. Returns separate successful and failed rows. |
| GET | /orders | List your orders (status, page, limit). |
| GET | /orders/:public_id | Order status, charge and status history. |
| POST | /orders/status | Bulk lookup: {orderIds:[…]} (max 100). |
| POST | /refills | Request a refill: {orderId}. |
| GET | /refills/:public_id | Refill status. |
| POST | /cancellations | Cancel an order: {orderId}. |
Dashboard endpoints (session-authenticated)
These power the panel's own pages and authenticate with your signed-in session, not an API
key — they are not part of the reseller API and are listed here so the surface
is documented in one place. State-changing calls need the CSRF token, which
https://smm.windelsai.com/csrf returns; send it as the X-CSRF-TOKEN header.
Base URL https://smm.windelsai.com/api.
| Path | Description | |
|---|---|---|
| POST | /payments/fundsvera/initialize | Start a bank-transfer deposit. Body: {amount}. Returns the account details to pay into. Your wallet is credited by the provider's webhook, never by returning to the site. |
| GET | /payments/history | Your deposits. |
| GET | /payments/:reference | One deposit by its reference. |
| GET | /referrals/my-code | Your referral code, link and click/sign-up counts. |
| POST | /referrals/validate | Check a code before signing up. Body: {code}. The only endpoint here reachable without a session; rate limited per IP. |
| GET | /referrals/dashboard | Referral totals and earnings summary. |
| GET | /referrals/history | People you referred and their qualification status. |
| GET | /earnings | Available, pending, locked and paid balances, kept separate. |
| GET | /earnings/history | The earnings ledger for your account. |
| POST | /withdrawals | Request a payout of available earnings. Body: {amount, method, destination?}. WALLET_CREDIT converts to spendable balance immediately; BANK_TRANSFER is reviewed by staff. |
| GET | /withdrawals/history | Your payout requests and their status. |
Deposited wallet funds cannot be withdrawn — only referral and campaign earnings are payable. The two balances are separate ledgers.
Place an order
curl -X POST https://smm.windelsai.com/api/v1/orders \
-H "X-Api-Key: wind_..." \
-H "Content-Type: application/json" \
-d '{"service":"01SVC...","link":
"https://instagram.com/u","quantity":1000}'
Order response
{
"success": true,
"data": {
"order": "01ORDER...",
"status": "PROCESSING",
"quantity": 1000,
"charge": "1.20000000",
"currency": "NGN"
},
"requestId": "..."
}
All monetary amounts are strings in DECIMAL(20,8) to avoid floating-point errors.