Reseller Developer API
Query wholesale stock, place orders using your PKR wallet, and retrieve delivered credentials.
1. Overview
JSON REST API over HTTPS. Orders settle atomically against your PKR wallet—if stock or balance is insufficient, zero funds are deducted.
https://numastore.pro/api/v1/resellerInstant credentials returned directly in the order response.
Queued as awaiting_delivery for custom activation; check status via GET /orders/:id.
2. Auth
Pass your secret key in the Authorization header (generate in Dashboard → Developer API).
Authorization: Bearer numa_live_YOUR_API_KEYLive keys start with numa_live_ and test keys start with numa_test_ (74 chars total). Keep keys strictly server-side.
Sandbox Testing
numa_test_...Use numa_test_YOUR_KEY on the exact same endpoints (/me, /products, /orders, /orders/:id). Includes a PKR 50,000 virtual wallet (resettable in Dashboard) with zero real charges.
| Sandbox Test Trigger | Simulated Behavior |
|---|---|
00000000-0000-0000-0000-000000000001automatic variant | Instant completed order with mock credentials. |
00000000-0000-0000-0000-000000000002manual variant | Returns awaiting_delivery, then auto-completes after 30s when polled via GET /orders/:id. |
00000000-0000-0000-0000-000000000409client_order_id: "test_out_of_stock" | Returns 409 out_of_stock. |
client_order_id: "test_insufficient_balance" | Returns 402 insufficient_balance. |
3. Rate Limits
Token-bucket limits enforced per reseller user_id.
| Tier / Header | Allowance | Description |
|---|---|---|
| Read (GET) | 60 req/min | /me, /products, /orders/:id |
| Write (POST) | 15 req/min | POST /orders |
| X-RateLimit-Limit | Integer | Max requests per 60s window |
| X-RateLimit-Remaining | Integer | Remaining requests in window |
| X-RateLimit-Reset | Epoch (sec) | Window reset timestamp |
4. GET /me
/api/v1/reseller/meReturns your account status, PKR wallet balance, subscription expiry, and monthly order count.
| Field | Type | Description |
|---|---|---|
| user_id | UUID | Reseller account ID |
| string | Account email | |
| wallet_balance | number | Available balance in PKR |
| reseller_expires_at | ISO 8601 | 30-day cycle expiry timestamp |
| monthly_api_order_count | number | API orders placed this month |
| api_key_prefix | string | Masked key prefix |
curl -H "Authorization: Bearer numa_live_YOUR_API_KEY" \
https://numastore.pro/api/v1/reseller/meResponse (200 OK)
{
"user_id": "8f14e45f-ceea-467f-a8c0-9b36b8e0d123",
"email": "partner@agency.pk",
"reseller_expires_at": "2026-12-11T09:00:00.000Z",
"reseller_discount_percent": null,
"wallet_balance": 18450,
"monthly_api_order_count": 42,
"quota_limit": null,
"api_key_prefix": "numa_live_4a9f...c81e",
"api_key_created_at": "2026-11-01T12:30:00.000Z"
}5. GET /products
/api/v1/reseller/productsReturns active products and variants with wholesale pricing, stock count, and required fields.
| Query Param | Type | Description |
|---|---|---|
| search | string | Filter by product name |
| category_id | UUID | Filter by category ID |
| in_stock | boolean | Pass true for in-stock variants only |
curl -H "Authorization: Bearer numa_live_YOUR_API_KEY" \
"https://numastore.pro/api/v1/reseller/products?in_stock=true&search=chatgpt"Response (200 OK)
{
"products": [
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "ChatGPT Plus",
"slug": "chatgpt-plus",
"category_id": "b4a1d800-1122-4000-8000-000000000001",
"requires": [],
"status": "active",
"variants": [
{
"id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
"name": "1 Month Private",
"duration": "30 Days",
"warranty": "Full 30-Day Replacement",
"delivery_type": "automatic",
"retail_price": 1500,
"reseller_price": 1200,
"reseller_discount_percent": 20,
"in_stock": true,
"stock_count": 14
}
]
}
]
}6. POST /orders
/api/v1/reseller/ordersPlaces a wholesale order using your PKR wallet; pass client_order_id for safe idempotent retries.
| Field | Type | Description |
|---|---|---|
| variant_id | UUID | Target variant ID (or product_id) |
| quantity | int (1–100) | Units to purchase |
| client_order_id | string | Optional idempotency key (max 128 chars) |
| customer_payload | object | Optional customer requirement inputs |
curl -X POST https://numastore.pro/api/v1/reseller/orders \
-H "Authorization: Bearer numa_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"variant_id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
"quantity": 1,
"client_order_id": "partner-ord-2026-0001",
"customer_payload": {
"account_email": "buyer@example.com"
}
}'{
"order_id": "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11",
"client_order_id": "partner-ord-2026-0001",
"status": "completed",
"source": "reseller_api",
"is_idempotent": false,
"credentials": [
{
"Email": "user01@numastore.pro",
"Password": "••••••••••••"
}
]
}{
"order_id": "c2ffde77-7a2b-4ce6-994b-49979b160c33",
"client_order_id": "partner-ord-2026-0002",
"status": "awaiting_delivery",
"source": "reseller_api",
"delivery_type": "manual",
"is_idempotent": false
}7. GET /orders/:id
/api/v1/reseller/orders/:idFetches order status and delivered credentials by order_id or client_order_id.
| Field | Type | Description |
|---|---|---|
| :id | string | UUID order_id or client_order_id |
| status | string | completed, awaiting_delivery, or cancelled |
| credentials | array | Delivered credential objects |
curl -H "Authorization: Bearer numa_live_YOUR_API_KEY" \
https://numastore.pro/api/v1/reseller/orders/partner-ord-2026-0001Response (200 OK)
{
"order_id": "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11",
"client_order_id": "partner-ord-2026-0001",
"status": "completed",
"source": "reseller_api",
"payment_status": "paid",
"delivery_status": "delivered",
"credentials": [
{
"Email": "user01@numastore.pro",
"Password": "••••••••••••"
}
],
"created_at": "2026-11-11T09:15:00.000Z"
}8. Errors
Errors return a JSON object with error and message fields.
| HTTP | error_code | Description |
|---|---|---|
| 401 | unauthorized | Missing or invalid API key |
| 402 | insufficient_balance | Wallet balance too low |
| 403 | not_a_reseller | Account not approved as reseller |
| 403 | reseller_expired | Reseller subscription expired |
| 404 | variant_not_found | Product or variant ID not found |
| 404 | not_found | Order not found |
| 409 | out_of_stock | Insufficient stock available |
| 422 | validation_error | Invalid request body |
| 429 | rate_limited | Too many requests |
| 500 | server_error | Internal error |
