Points de terminaison sur cette page
GET /v1/catalog/products: produits, offres et tarifsPOST /v1/orders: acheter une offre avec le solde (nouveau service, trafic supplémentaire ou prolongation de port)GET /v1/orders: lister les commandesGET /v1/orders/{orderId}: obtenir une commande
URL de base https://localserpproxy.com/api/v1. Authentification, erreurs et limites : consultez la présentation de l’API.
Produits, offres et tarifs
GET/v1/catalog/products
Tous les produits avec leurs offres et tarifs, 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 traffic for manual local search, advertising, price and application checks in US cities. State, city and ZIP selection, subject to available exits; no promise of GPS position or rankings.",
"unit": "GB",
"plans": [
{
"id": "res-10",
"productId": "residential",
"name": "Local team",
"quantity": 10,
"unit": "GB",
"durationDays": null,
"price": "7.50",
"pricePerUnit": "0.75",
"popular": false,
"features": [
"US city selection, subject to availability",
"Traffic stays until used",
"Rotating or sticky sessions"
],
"available": true,
"countries": null
}
]
}
]
}Exemples de code
curl -s "https://localserpproxy.com/api/v1/catalog/products"import os
import requests
API = "https://localserpproxy.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://localserpproxy.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 avec le solde (nouveau service, trafic supplémentaire ou prolongation de port)
POST/v1/orders
Le paiement est toujours effectué depuis le solde prépayé : le prix est calculé par l’API (prix du catalogue × quantity), le solde est débité, le service est créé ou prolongé et la commande est renvoyée completed avec son fulfillment. Les identifiants du proxy sont disponibles immédiatement.
- Nouveau trafic résidentiel :
{ "planId": "res-10" }. - Nouveau trafic rotatif 4G/5G (par GB) :
{ "planId": "mgb-10" }(un abonnement de trafic avecproductId: "mobile-gb", livré enfulfillment.residentialSubscriptionId). - Ajouter du trafic à un abonnement existant :
{ "planId": "res-10", "options": { "subscriptionId": "res_9x2m4k" } }: le forfait doit appartenir au produit de l’abonnement. - Nouveau(x) port(s) mobile(s) :
{ "planId": "mob-us-30d", "quantity": 1, "options": { "country": "US" } }, avec éventuellementcarrier(voir les opérateurs d’un pays dans Ports mobiles). Les forfaits par zone couvrent uniquement les pays de leur zone (422suroptions.countrysinon). - Prolonger un port mobile :
{ "planId": "mob-us-7d", "options": { "portId": "mob_2v8k1q" } }ajoute la durée du forfait àexpiresAt.
Solde insuffisant → 402 insufficient_balance, avec le montant manquant et une suggestion de recharge dans error.details (missing, suggestedTopUp). Aucun montant n’est débité en cas d’erreur. Pour payer la différence, lancez une recharge contenant la même requête dans purchase (POST /v1/topups) : le forfait est acheté dès que la recharge est créditée.
Authentification : clé API dans l’en-tête Authorization: Bearer API_KEY.
Paramètres
| Nom | Dans | Type | Obligatoire | Description |
|---|---|---|---|---|
Idempotency-Key | header | string | Non | Clé unique (par exemple un UUID) pour réessayer une requête POST en toute sécurité. Conservée 24 h. — 128 caractères max. |
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
planId | string | Oui | — |
quantity | integer | Non | 1–100, par défaut 1 |
options | object | Non | — |
{
"planId": "res-10"
}{
"planId": "mob-us-30d",
"quantity": 1,
"options": {
"country": "US",
"carrier": "verizon",
"autoRenew": true
}
}{
"planId": "mob-us-7d",
"options": {
"portId": "mob_2v8k1q"
}
}{
"planId": "mgb-10"
}{
"planId": "mob-us-30d",
"options": {
"country": "US",
"carrier": "verizon"
}
}Réponse 201 Created
{
"id": "ord_4f8k2m9q",
"status": "completed",
"productId": "residential",
"planId": "res-10",
"planName": "Local team",
"quantity": 1,
"unitPrice": "7.50",
"subtotal": "7.50",
"discount": "0.00",
"total": "7.50",
"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://localserpproxy.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://localserpproxy.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://localserpproxy.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());Liste des commandes
GET/v1/orders
Authentification : clé API dans l’en-tête Authorization: Bearer API_KEY.
Paramètres
| Nom | Dans | Type | Obligatoire | 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 comme déjà payées (déduites du solde). completed — payée et livrée (identifiants disponibles immédiatement). |
productId | query | string | Non | ID du produit dans le catalogue. Valeurs pour LocalSERP Proxy : residential (GB), mobile (ports dédiés 4G/5G) et mobile-gb (trafic rotatif 4G/5G par GB). Les clients doivent accepter les valeurs inconnues. |
Réponse 200 OK
{
"data": [
{
"id": "ord_4f8k2m9q",
"status": "completed",
"productId": "residential",
"planId": "res-10",
"planName": "Local team",
"quantity": 1,
"unitPrice": "7.50",
"subtotal": "7.50",
"discount": "0.00",
"total": "7.50",
"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://localserpproxy.com/api/v1/orders" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://localserpproxy.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://localserpproxy.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());Récupérer une commande
GET/v1/orders/{orderId}
Authentification : clé API dans l’en-tête Authorization: Bearer API_KEY.
Paramètres
| Nom | Dans | Type | Obligatoire | Description |
|---|---|---|---|---|
orderId | path | string | Oui | — |
Réponse 200 OK
{
"id": "ord_4f8k2m9q",
"status": "completed",
"productId": "residential",
"planId": "res-10",
"planName": "Local team",
"quantity": 1,
"unitPrice": "7.50",
"subtotal": "7.50",
"discount": "0.00",
"total": "7.50",
"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://localserpproxy.com/api/v1/orders/ord_4f8k2m9q" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://localserpproxy.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://localserpproxy.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());