Authentification
Tous les endpoints exigent un Bearer token dans l'en-tête Authorization.
Obtenir votre clé API
- Connectez-vous à Proxnum et ouvrez votre page profil
- Allez à la section « Gestion des clés API »
- Cliquez « Créer une clé API »
- Copiez le token affiché
Incluez le token API dans chaque requête :
Authorization: Bearer YOUR_API_TOKEN_HERE Accept: application/json Content-Type: application/json
Liens rapides :
- Codes pays canoniques (paramètre country dans l'API)
- Codes service canoniques (paramètre service dans l'API)
Format de réponse commun
Les erreurs utilisent une structure normalisée avec le champ code. Toutes les erreurs suivent ce modèle :
{
"success": false,
"code": "no_numbers",
"message": "No numbers available for the selected service and country"
}
Endpoints
GET /api/v1/resell/price?service=&country=
Obtenir prix de base et de vente pour un service et un pays. Estimez le coût avant commande.
Paramètres (query) : service (string), country (int)
Exemple de requête :
curl -s -X GET "https://proxnum.com/api/v1/resell/price?service=ig&country=6" \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/json"
Réponse succès :
{
"country": "6",
"service": "ig",
"base_price": 0.0334,
"sell_price": 0.1114892
}
GET /api/v1/prices
Tarification complète pour tous les services et pays. Retourne prix de base et prix revendeur.
Paramètres (query, optionnels) :
serviceservice (string) — filtrer par code service (ex. ig, wa, tg)countrycountry (int) — filtrer par code pays
Exemple (tous les prix) :
curl -s -X GET "https://proxnum.com/api/v1/prices" \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/json"
Exemple (filtré par pays) :
curl -s -X GET "https://proxnum.com/api/v1/prices?country=6" \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/json"
Réponse succès (filtrée par pays) :
{
"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 : Réponse imbriquée : premier niveau = codes pays, second = codes service. Chaque service contient base_price, sell_price et available (ou null).
POST /api/v1/resell/virtual/buy
Acheter un numéro temporaire (virtuel). Tente d'allouer un numéro et de débiter le compte.
Corps (JSON) : {"service":"ig","country":6}
Exemple de requête :
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}'
Réponse succès (normalisée) :
{
"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
}
}
Codes d'erreur courants :
{
"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
Vérifier le statut d'une activation. {id} accepte l'activation id retourné à l'achat.
Exemple de requête :
curl -s -X GET "https://proxnum.com/api/v1/resell/virtual/4390520873/status" \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/json"
Succès (code disponible) :
{
"success": true,
"status": "completed",
"code": "1234",
"activation": { "id": 737, "phone": "628...", "activation_id": "4390520873" }
}
POST /api/v1/resell/virtual/resend
Demander un renvoi/réactivation. Utilisez l'activation id dans le corps.
Corps : {"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"}'
Réponse (acceptée) :
{
"success": true,
"message": "Resend requested; new activation created",
"activation": { "id": 738, "activation_id": "4390520874", "phone": "628..." }
}
POST /api/v1/resell/virtual/cancel
Demander annulation et remboursement. Le serveur évalue si l'activation est remboursable.
Corps : {"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"}'
Accepté :
{
"success": true,
"code": "cancel_accepted",
"message": "Cancellation accepted, refund processed"
}
Rejeté :
{
"success": false,
"code": "cancel_rejected",
"message": "Cancellation rejected — activation already completed or not refundable"
}
GET /api/v1/resell/activations
Liste des activations de l'utilisateur (paginée). Paramètres page et per_page.
curl -s -X GET "https://proxnum.com/api/v1/resell/activations?page=1&per_page=25" \ -H "Authorization: Bearer $TOKEN" \ -H "Accept: application/json"
Numéros en location
Les numéros en location restent attribués à votre compte pendant la durée achetée et reçoivent tous les SMS qui leur sont envoyés. Utilisez ces endpoints pour afficher à vos clients les durées et prix disponibles, louer des numéros, lire les SMS reçus, annuler dans le délai autorisé et prolonger les locations actives.
Tous les endpoints de location sont aussi disponibles sans le préfixe /resell (par exemple /api/v1/rental/catalog). Le catalogue public /api/v1/rental/catalog ne nécessite pas de jeton.
Les réponses contiennent "ok" (true ou false), un code "error" en cas d’échec et un "message" lisible dans la langue de votre compte. Le code HTTP reflète le résultat (200 succès, 202 accepté et en attente, 4xx problème de requête, 503 temporairement indisponible).
Statuts de location
active— Le numéro est à vous et reçoit des SMS jusqu’à expires_at.cancelling— Une annulation a été demandée et attend sa confirmation. Aucun remboursement n’a encore été effectué.cancelled— L’annulation a été confirmée et amount_paid a été recrédité sur votre solde.expired— La période de location est terminée.
GET /api/v1/resell/rental/catalog?country=&hours=
Renvoie les durées de location proposées actuellement, les pays et les services avec votre prix et le stock pour un pays et une durée. La liste des durées provient en temps réel de notre fournisseur de numéros : lisez-la toujours dans durations[] au lieu de coder des valeurs en dur.
Paramètres : country (facultatif, identifiant numérique du pays, voir la page des codes pays) et hours (facultatif, l’une des valeurs de durations[].hours). Les valeurs invalides ou absentes sont remplacées par les valeurs par défaut renvoyées dans la réponse.
Exemple de requête :
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
Loue un numéro et débite votre solde. hours doit être l’une des valeurs durations[].hours du catalogue. Vous pouvez envoyer max_price : si le prix actuel est plus élevé, rien n’est débité et vous recevez l’erreur price_changed avec le nouveau prix.
Corps (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
}
}
Erreurs courantes : invalid_period (422), no_numbers (409), price_changed (409), insufficient_funds (402), option_unavailable (422), unavailable ou provider_unreachable (503, aucun débit).
GET /api/v1/resell/rental/{id}/status
Renvoie la location avec les SMS reçus (les plus récents d’abord). Chaque message contient le texte et, s’il est détecté, le code. Interrogez toutes les 5 à 10 secondes en attendant un message. id peut être notre identifiant de location ou l’identifiant d’activation renvoyé à l’achat.
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
Une location ne peut être annulée que dans les 2 minutes suivant l’achat, si elle n’a reçu aucun SMS et n’a pas été prolongée. L’annulation est confirmée auprès du fournisseur de numéros, ce qui peut prendre quelques minutes.
Corps : {"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."
}
Erreurs courantes : window_closed, sms_received, extended, cancel_pending (une demande est déjà en cours), not_active (toutes en 409).
GET /api/v1/resell/rental/{id}/extend-options
Liste les durées et prix de renouvellement disponibles pour une location active. Les prix sont lus en temps réel pour ce numéro précis.
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
Prolonge une location active de l’une des durées renvoyées par les options de prolongation et débite votre solde. Envoyez max_price pour ne jamais être débité plus que le prix affiché à votre client. Les locations prolongées ne peuvent plus être annulées.
Corps (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 }
}
Erreurs courantes : invalid_period (422), price_changed (409), insufficient_funds (402), not_active (409), unavailable (503).
GET /api/v1/resell/rentals
Liste paginée de vos locations, les plus récentes d’abord. Paramètres : page et per_page (1 à 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", "...": "..." } ] }
Notes d'implémentation
- Les opérations de débit sont idempotentes par commande ; vérifiez order ou transaction.
- Utilisez l'endpoint price pour simuler les coûts avant commande.
- Codes d'erreur : no_numbers, insufficient_balance, service_unavailable, cancel_rejected.
- Gérez toujours succès et erreurs dans votre intégration
- Implémentez la gestion des timeouts réseau
- Mettez en cache les listes pays et services
- Utilisez les webhooks pour les mises à jour en temps réel