Points d’accès de cette page
GET /v1/catalog/products: Produits, forfaits et prixPOST /v1/orders: Acheter un forfait sur le solde : service, trafic ou prolongation d’un portGET /v1/orders: Lister les commandesGET /v1/orders/{orderId}: Consulter une commande
URL de base https://africaproxies.com/api/v1. Authentification, erreurs et limites : voir la présentation de l’API.
Produits, forfaits et prix
GET/v1/catalog/products
Chaque produit, ses forfaits et ses prix, tels qu’ils sont facturés lors de la commande.
Public : aucune clé API requise.
Réponse 200 OK
{
"data": [
{
"id": "residential",
"name": "Residential proxies",
"description": "Residential IPs across 49 African locations for public price research, local SEO and your application tests. Prepaid traffic, billed per GB.",
"unit": "GB",
"plans": [
{
"id": "res-10",
"productId": "residential",
"name": "Team",
"quantity": 10,
"unit": "GB",
"durationDays": null,
"price": "5.94",
"pricePerUnit": "0.59",
"popular": false,
"features": [
"Prepaid traffic never expires",
"Country and city where available",
"Project credentials and traffic caps"
],
"available": true,
"countries": null
}
]
}
]
}Exemples de code
curl -s "https://africaproxies.com/api/v1/catalog/products"import os
import requests
API = "https://africaproxies.com/api/v1"
r = requests.get(f"{API}/catalog/products", timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://africaproxies.com/api/v1';
const res = await fetch(`${API}/catalog/products`);
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Acheter un forfait sur le solde : nouveau service, trafic supplémentaire ou prolongation d’un port
POST/v1/orders
Le paiement utilise toujours le solde prépayé. L’API calcule le prix (tarif du catalogue × quantity), débite le solde, crée ou prolonge le service, puis renvoie la commande completed avec son fulfillment. Les identifiants des proxies sont disponibles immédiatement.
- Nouveau trafic résidentiel :
{ "planId": "res-10" }. - Nouveau trafic à rotation 4G/5G par GB :
{ "planId": "mgb-10" }, un abonnement de trafic avecproductId: "mobile-gb", livré dansfulfillment.residentialSubscriptionId. - Ajouter du trafic à un abonnement existant :
{ "planId": "res-10", "options": { "subscriptionId": "res_9x2m4k" } }. Le forfait doit correspondre au produit de l’abonnement. - Nouveaux ports mobiles :
{ "planId": "mob-30d", "quantity": 1, "options": { "country": "AE" } }, aveccarrieren option. Voir les opérateurs du pays dans Ports mobiles. Les forfaits de zone couvrent uniquement les pays de leur zone, sinon422suroptions.country. - Prolonger un port mobile :
{ "planId": "mob-7d", "options": { "portId": "mob_2v8k1q" } }ajoute la durée du forfait àexpiresAt.
Solde insuffisant → 402 insufficient_balance, avec le montant manquant et un rechargement suggéré dans error.details (missing, suggestedTopUp). Aucune erreur ne provoque de débit. Pour payer la différence, créez un rechargement portant la même demande dans purchase (POST /v1/topups) : le forfait est acheté dès que le rechargement est crédité.
Authentification : clé API dans l'en-tête Authorization: Bearer API_KEY.
Paramètres
| Nom | Dans | Type | Requis | Description |
|---|---|---|---|---|
Idempotency-Key | header | string | Non | Clé unique, par exemple un UUID, pour renouveler une requête POST sans doublon. Conservée 24 h. — 128 caractères max. |
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
planId | string | Oui | — |
quantity | integer | Non | 1–100, par défaut 1 |
options | object | Non | — |
{
"planId": "res-10"
}{
"planId": "mob-30d",
"quantity": 1,
"options": {
"country": "AE",
"carrier": "etisalat",
"autoRenew": true
}
}{
"planId": "mob-7d",
"options": {
"portId": "mob_2v8k1q"
}
}{
"planId": "mgb-10"
}{
"planId": "mob-30d",
"options": {
"country": "AE",
"carrier": "etisalat"
}
}Réponse 201 Created
{
"id": "ord_4f8k2m9q",
"status": "completed",
"productId": "residential",
"planId": "res-10",
"planName": "Team",
"quantity": 1,
"unitPrice": "5.94",
"subtotal": "5.94",
"discount": "0.00",
"total": "5.94",
"promoCode": null,
"currency": "USD",
"topUpId": null,
"options": {},
"fulfillment": {
"residentialSubscriptionId": "res_9x2m4k",
"mobilePortIds": []
},
"createdAt": "2026-10-05T14:03:11Z",
"paidAt": "2026-10-05T14:03:11Z"
}Exemples de code
curl -s -X POST "https://africaproxies.com/api/v1/orders" \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"planId":"res-10"}'import os, uuid
import requests
API = "https://africaproxies.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}", "Idempotency-Key": str(uuid.uuid4())}
r = requests.post(f"{API}/orders", headers=HEADERS, json={"planId": "res-10"}, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
import { randomUUID } from 'node:crypto';
const API = 'https://africaproxies.com/api/v1';
const res = await fetch(`${API}/orders`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Idempotency-Key': randomUUID(), 'Content-Type': 'application/json' },
body: JSON.stringify({ planId: 'res-10' }),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Lister les commandes
GET/v1/orders
Authentification : clé API dans l'en-tête Authorization: Bearer API_KEY.
Paramètres
| Nom | Dans | Type | Requis | Description |
|---|---|---|---|---|
page | query | integer | Non | ≥ 1, par défaut 1 |
perPage | query | integer | Non | 1–100, par défaut 20 |
status | query | completed · cancelled | Non | Les commandes sont créées déjà payées (débitées du solde). completed — payées et livrées (identifiants de connexion disponibles immédiatement). |
productId | query | string | Non | Identifiant de produit du catalogue. Valeurs pour AfricaProxies : residential (GB), mobile (ports dédiés 4G/5G) et mobile-gb (trafic mobile à rotation 4G/5G par GB). Les clients doivent accepter la présence de valeurs inconnues. |
Réponse 200 OK
{
"data": [
{
"id": "ord_4f8k2m9q",
"status": "completed",
"productId": "residential",
"planId": "res-10",
"planName": "Team",
"quantity": 1,
"unitPrice": "5.94",
"subtotal": "5.94",
"discount": "0.00",
"total": "5.94",
"promoCode": null,
"currency": "USD",
"topUpId": null,
"options": {},
"fulfillment": {
"residentialSubscriptionId": "res_9x2m4k",
"mobilePortIds": []
},
"createdAt": "2026-10-05T14:03:11Z",
"paidAt": "2026-10-05T14:03:11Z"
}
],
"pagination": {
"page": 1,
"perPage": 20,
"total": 1,
"totalPages": 1
}
}Exemples de code
curl -s "https://africaproxies.com/api/v1/orders" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://africaproxies.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/orders", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://africaproxies.com/api/v1';
const res = await fetch(`${API}/orders`, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Obtenir une commande
GET/v1/orders/{orderId}
Authentification : clé API dans l'en-tête Authorization: Bearer API_KEY.
Paramètres
| Nom | Dans | Type | Requis | Description |
|---|---|---|---|---|
orderId | path | string | Oui | — |
Réponse 200 OK
{
"id": "ord_4f8k2m9q",
"status": "completed",
"productId": "residential",
"planId": "res-10",
"planName": "Team",
"quantity": 1,
"unitPrice": "5.94",
"subtotal": "5.94",
"discount": "0.00",
"total": "5.94",
"promoCode": null,
"currency": "USD",
"topUpId": null,
"options": {},
"fulfillment": {
"residentialSubscriptionId": "res_9x2m4k",
"mobilePortIds": []
},
"createdAt": "2026-10-05T14:03:11Z",
"paidAt": "2026-10-05T14:03:11Z"
}Exemples de code
curl -s "https://africaproxies.com/api/v1/orders/ord_4f8k2m9q" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://africaproxies.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/orders/ord_4f8k2m9q", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://africaproxies.com/api/v1';
const res = await fetch(`${API}/orders/ord_4f8k2m9q`, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());