Authentication
All endpoints require a Bearer token in the Authorization header.
How to Get Your API Key
- Sign in to your Proxnum account and navigate to your Profile page
- Scroll to the "API Keys management" section
- Click "Create API key" to generate a new key
- Copy the displayed API token
Include your API token in every request:
Authorization: Bearer YOUR_API_TOKEN_HERE Accept: application/json Content-Type: application/json
Quick links:
- Canonical country codes (used as country in the API)
- Canonical service codes (used as service in the API)
Common Response Format
Errors use a normalized structure so your integration can switch on code reliably. All error responses follow this pattern:
{
"success": false,
"code": "no_numbers",
"message": "No numbers available for the selected service and country"
}
Endpoints
GET /api/v1/resell/price?service=&country=
Get base and sell price for a given service and country. Use this to estimate cost before placing a chargeable order.
Parameters (query): service (string), country (int)
Example request:
curl -s -X GET "https://proxnum.com/api/v1/resell/price?service=ig&country=6" \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/json"
Success response:
{
"country": "6",
"service": "ig",
"base_price": 0.0334,
"sell_price": 0.1114892
}
GET /api/v1/prices
Get comprehensive pricing for all available services and countries. This endpoint returns base prices and your reseller sell prices for all combinations.
Parameters (query, optional):
serviceservice (string) - Filter by specific service code (e.g., ig, wa, tg)countrycountry (int) - Filter by specific country code
Example request (all prices):
curl -s -X GET "https://proxnum.com/api/v1/prices" \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/json"
Example request (filtered by country):
curl -s -X GET "https://proxnum.com/api/v1/prices?country=6" \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/json"
Success response (filtered by country):
{
"success": true,
"prices": {
"6": {
"ig": {
"base_price": 0.0334,
"sell_price": 0.1114892,
"available": 245
},
"wa": {
"base_price": 0.0389,
"sell_price": 0.1298737,
"available": 189
},
"tg": {
"base_price": 0.0223,
"sell_price": 0.0744551,
"available": 521
},
"go": {
"base_price": 0.0278,
"sell_price": 0.0928206,
"available": 312
}
}
}
}
Note: The response structure is a nested object where the first level keys are country codes, and the second level keys are service codes. Each service contains base_price (your cost), sell_price (your reseller price), and available (number of available numbers, or null if unknown).
POST /api/v1/resell/virtual/buy
Buy a temporary (virtual) number. The call will attempt to allocate a number and charge your account.
Body (JSON): {"service":"ig","country":6}
Example request:
curl -s -X POST "https://proxnum.com/api/v1/resell/virtual/buy" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"service":"ig","country":6}'
Success response (normalized):
{
"success": true,
"activation": {
"id": 737,
"phone": "62895406203932",
"activation_id": "4390520873",
"msg": "Waiting Sms",
"date_created": "2025-11-08 21:50:34",
"amount_paid": 0.111489,
"status": 1
}
}
Common error codes:
{
"success": false,
"code": "no_numbers",
"message": "No numbers available for this service in the selected country"
}
{
"success": false,
"code": "insufficient_balance",
"message": "Not enough balance to place the order"
}
GET /api/v1/resell/virtual/{id}/status
Check the status of an activation. {id} accepts activation id string returned by purchase.
Example request:
curl -s -X GET "https://proxnum.com/api/v1/resell/virtual/4390520873/status" \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/json"
Success (when a code is available):
{
"success": true,
"status": "completed",
"code": "1234",
"activation": { "id": 737, "phone": "628...", "activation_id": "4390520873" }
}
POST /api/v1/resell/virtual/resend
Request a resend/reactivation for an activation. Use the activation id string in the body.
Body: {"activation_id":"4390520873"}
curl -s -X POST "https://proxnum.com/api/v1/resell/virtual/resend" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"activation_id":"4390520873"}'
Response (accepted):
{
"success": true,
"message": "Resend requested; new activation created",
"activation": { "id": 738, "activation_id": "4390520874", "phone": "628..." }
}
POST /api/v1/resell/virtual/cancel
Request cancellation and refund for an activation. Our server evaluates whether the activation is refundable and returns a normalized result.
Body: {"activation_id":"4390520873"}
curl -s -X POST "https://proxnum.com/api/v1/resell/virtual/cancel" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"activation_id":"4390520873"}'
Accepted:
{
"success": true,
"code": "cancel_accepted",
"message": "Cancellation accepted, refund processed"
}
Rejected:
{
"success": false,
"code": "cancel_rejected",
"message": "Cancellation rejected — activation already completed or not refundable"
}
GET /api/v1/resell/activations
List activations for the authenticated user (paginated). Supports page and per_page query parameters.
curl -s -X GET "https://proxnum.com/api/v1/resell/activations?page=1&per_page=25" \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/json"
Rental numbers
Rental numbers stay assigned to your account for the period you buy and receive every SMS sent to them. Use these endpoints to show your customers the available periods and prices, rent numbers, read incoming SMS, cancel within the allowed window and extend active rentals.
All rental endpoints are also available without the /resell prefix (for example /api/v1/rental/catalog). The public catalog at /api/v1/rental/catalog does not require a token.
Rental responses contain "ok" (true or false), an "error" code when something fails and a human-readable "message" in the language of your account. The HTTP status code reflects the result (200 success, 202 accepted and pending, 4xx request problem, 503 temporarily unavailable).
Rental statuses
active— The number is yours and receives SMS until expires_at.cancelling— A cancellation was requested and is waiting for confirmation. No refund has been made yet.cancelled— The cancellation was confirmed and amount_paid was returned to your balance.expired— The rental period ended.
GET /api/v1/resell/rental/catalog?country=&hours=
Returns the rental periods currently offered, the countries and the services with your price and stock for one country and period. The list of periods comes live from our number supply, so always read it from durations[] instead of hard-coding values.
Query parameters: country (optional, numeric country id, see the country codes page) and hours (optional, one of durations[].hours). Invalid or missing values fall back to the defaults returned in the response.
Example request:
curl -s "https://proxnum.com/api/v1/resell/rental/catalog?country=187&hours=168" \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/json"
{
"ok": true,
"country": "187",
"hours": 168,
"durations": [
{ "hours": 24, "label": "1 day" },
{ "hours": 72, "label": "3 days" },
{ "hours": 168, "label": "1 week" },
{ "hours": 720, "label": "30 days" }
],
"countries": [ { "id": "187", "name": "USA" }, { "id": "16", "name": "United Kingdom" } ],
"services": [
{ "code": "wa", "name": "WhatsApp", "icon": "...", "price": 4.2, "stock": 35 }
],
"cancel_window_seconds": 120
}
POST /api/v1/resell/rental/buy
Rents a number and charges your balance. hours must be one of the durations[].hours values from the catalog. Optionally send max_price: if the current price is higher, nothing is charged and you receive error price_changed with the new price.
Body (JSON): {"service":"wa","country":187,"hours":168,"max_price":4.20}
curl -s -X POST "https://proxnum.com/api/v1/resell/rental/buy" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"service":"wa","country":187,"hours":168,"max_price":4.20}'
{
"ok": true,
"error": null,
"message": "Your rental number is ready.",
"price": 4.2,
"balance": 25.8,
"rental": {
"id": 512,
"phone": "14155550123",
"service": "wa",
"service_name": "WhatsApp",
"country": "187",
"country_name": "USA",
"status": "active",
"amount_paid": 4.2,
"hours": 168,
"purchased_at": "2026-10-03T12:00:00+03:00",
"expires_at": "2026-10-10T12:00:00+03:00",
"cancel_until": "2026-10-03T12:02:00+03:00",
"can_cancel": true,
"cancel_pending": false,
"can_extend": true
}
}
Common errors: invalid_period (422), no_numbers (409), price_changed (409), insufficient_funds (402), option_unavailable (422), unavailable or provider_unreachable (503, you were not charged).
GET /api/v1/resell/rental/{id}/status
Returns the rental with its received SMS (newest first). Each message includes the text and, when one is detected, the code. Poll every 5 to 10 seconds while you wait for a message. id can be our rental id or the activation id returned on purchase.
curl -s "https://proxnum.com/api/v1/resell/rental/512/status" \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/json"
{
"ok": true,
"rental": {
"id": 512,
"phone": "14155550123",
"status": "active",
"expires_at": "2026-10-10T12:00:00+03:00",
"can_cancel": false,
"can_extend": true,
"messages": [
{ "id": 9001, "sender": "WhatsApp", "text": "Your WhatsApp code: 123-456", "code": "123456", "date": "2026-10-03T12:05:10+03:00" }
]
}
}
POST /api/v1/resell/rental/cancel
A rental can be cancelled only within 2 minutes of purchase, if it has not received any SMS and has not been extended. The cancellation is confirmed with the number supplier, which can take a few minutes.
Body: {"id":512}
curl -s -X POST "https://proxnum.com/api/v1/resell/rental/cancel" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"id":512}'
HTTP/1.1 202 Accepted
{
"ok": true,
"pending": true,
"refunded": 0,
"message": "Cancellation requested. Your refund will be added once the cancellation is confirmed, usually within a few minutes.",
"rental": { "id": 512, "status": "cancelling", "cancel_pending": true }
}
HTTP/1.1 200 OK
{
"ok": true,
"pending": false,
"refunded": 4.2,
"balance": 30,
"rental": { "id": 512, "status": "cancelled" }
}
HTTP/1.1 409 Conflict
{
"ok": false,
"error": "sms_received",
"message": "This number has already received an SMS, so it cannot be cancelled."
}
Common errors: window_closed, sms_received, extended, cancel_pending (a request is already in progress), not_active (all 409).
GET /api/v1/resell/rental/{id}/extend-options
Lists the renewal periods and prices available for one active rental. Prices are read live for that specific number.
curl -s "https://proxnum.com/api/v1/resell/rental/512/extend-options" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"
{
"ok": true,
"options": [
{ "hours": 24, "label": "1 day", "price": 1.1 },
{ "hours": 168, "label": "1 week", "price": 5.0 }
]
}
POST /api/v1/resell/rental/{id}/extend
Extends an active rental by one of the periods returned by extension options and charges your balance. Send max_price to make sure you are never charged more than the price you showed your customer. Extended rentals can no longer be cancelled.
Body (JSON): {"hours":168,"max_price":5.00}
curl -s -X POST "https://proxnum.com/api/v1/resell/rental/512/extend" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"hours":168,"max_price":5.00}'
{
"ok": true,
"message": "Rental extended by 1 week.",
"price": 5,
"balance": 25,
"rental": { "id": 512, "status": "active", "expires_at": "2026-10-17T12:00:00+03:00", "can_cancel": false }
}
Common errors: invalid_period (422), price_changed (409), insufficient_funds (402), not_active (409), unavailable (503).
GET /api/v1/resell/rentals
Paginated list of your rentals, newest first. Query parameters: page and per_page (1 to 100).
curl -s "https://proxnum.com/api/v1/resell/rentals?page=1&per_page=25" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"
{ "ok": true, "total": 3, "page": 1, "per_page": 25, "data": [ { "id": 512, "phone": "14155550123", "status": "active", "...": "..." } ] }
Implementation Notes
- All charging operations are idempotent per-order where possible; check the returned order or transaction fields for canonical identifiers.
- Use the price endpoint to dry-run costs before placing chargeable requests.
- Normalized error codes you may see include: no_numbers, insufficient_balance, service_unavailable, cancel_rejected.
- Always handle both success and error responses in your integration
- Implement proper error handling for network timeouts
- Cache country and service lists to reduce API calls
- Use webhooks where available for real-time status updates