API
Référence de l'API
Une référence complète, endpoint par endpoint, de l'API REST de mobileproxy.app. Chaque chemin, champ et exemple reflète ici le document OpenAPI en direct sur lequel l'API est construite. URL de base https://mobileproxy.app/api/v1.
Authentification et URL de base
Chaque endpoint se trouve sous https://mobileproxy.app/api/v1 et nécessite un jeton bearer. Créez-en un dans le dashboard sous Pour les développeurs → Jetons API, ou avec POST /tokens une fois connecté. Le secret n'est affiché qu'une seule fois — conservez-le. Envoyez-le à chaque requête :
Authorization: Bearer mpx_live_…Les jetons commençant par mpx_live_ sont vos jetons de compte. Les endpoints /device/* sont appelés par l'application Android elle-même et s'authentifient avec un jeton d'appareil par téléphone (mpxdev_…) émis lors de l'appairage — vous ne les appelez normalement jamais.
Les erreurs sont en JSON, avec un message lisible et un code machine :
{ "error": "No such device.", "code": "not_found" }| Champ | Type | Description |
|---|---|---|
| 401 | unauthorized | Jeton manquant, mal formé ou révoqué. |
| 403 | forbidden | Jeton valide mais non autorisé. |
| 404 | not_found | La ressource n'existe pas sur ce compte. |
| 502 | control_plane_unavailable | Passerelle / plan de contrôle brièvement injoignable — réessayez. |
Compte
GET /me — qui suis-je ? Renvoie le compte ainsi que les décomptes en direct des abonnements et des jetons API.
curl https://mobileproxy.app/api/v1/me \
-H "Authorization: Bearer mpx_live_…"
# → { "id": "u_8c31f0", "email": "[email protected]",
# "created_at": "2026-06-28T14:02:11.000Z",
# "subscriptions": 3, "api_tokens": 2,
# "plan": "beta", "balance": "0.00" }Abonnements
Un abonnement (id sub_…) est l'emplacement durable que vous possédez : son name convivial, ses réglages et ses proxys persistent même lorsque le téléphone qui le fait fonctionner change. Son device est le téléphone qui l'alimente actuellement (ou null lorsqu'il n'est pas appairé), et il est interchangeable — un changement conserve chaque endpoint de proxy.
Lister les abonnements — chacun avec son appareil appairé fusionné avec le statut de passerelle en direct (online = le tunnel proxy est actif) :
curl https://mobileproxy.app/api/v1/subscriptions \
-H "Authorization: Bearer mpx_live_…"
# → { "subscriptions": [ {
# "id": "sub_760c1fc8ddab", "name": "Paris SFR",
# "status": "active", "wifi_split": true, "created_at": "…",
# "device": { "id": "phone_ac862619408e", "model": "Galaxy S8",
# "hardware_id": "352091081234567", "hardware_type": "imei",
# "status": "online", "exit_ip": "77.136.66.63",
# "carrier": "SFR", "last_seen": "…", "paired_at": "…" } } ] }Créer un abonnement (non appairé), puis appairer ou changer le téléphone. POST /subscriptions/{id}/pair renvoie un PIN valide ~3 minutes ; saisi dans l'application Android, il lie le téléphone. Sur un emplacement qui possède déjà un appareil, il s'agit d'un changement (mode: "swap") — l'ancien téléphone est retiré et chaque proxy conserve son host:port et ses identifiants :
curl -X POST https://mobileproxy.app/api/v1/subscriptions \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" -d '{ "name": "Paris SFR" }'
# → { "id": "sub_760c1fc8ddab", "status": "unpaired", "device": null, … }
# Pair (or swap) a phone into it
curl -X POST https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/pair \
-H "Authorization: Bearer mpx_live_…"
# → { "subscription_id": "sub_760c1fc8ddab", "mode": "new",
# "pairing": { "pin": "483-119-702", "expires_at": "…" }, … }Récupérer, modifier ou annuler un abonnement. POST modifie le nom, une description libre (max 200 caractères, null l'efface), la préférence wifi_split (mise en file d'attente pour le téléphone appairé, appliquée à son prochain sondage ~25 s), ou shared_speed_kbps — la façon dont la vitesse de l'appareil est répartie entre ses proxys. -1 (recommandé) la partage automatiquement : le plan de contrôle mesure la vitesse réelle de l'appareil à partir du débit en direct (rééquilibrage ~3 s), les proxys actifs en même temps convergent vers des parts égales, et un proxy travaillant seul obtient la vitesse maximale. Une valeur > 0 répartit de la même façon ce total fixe d'appareil. Les valeurs speed_limit_kbps par proxy sont conservées mais non appliquées tant que l'un ou l'autre est actif ; 0 désactive le partage. DELETE démantèle son appareil et ses proxys, libère les ports de la passerelle et supprime l'historique de l'emplacement — irréversible :
# Fetch one subscription
curl https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID \
-H "Authorization: Bearer mpx_live_…"
# Rename / describe / set Wi-Fi split / share the device's speed equally (auto)
curl -X POST https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "name": "Paris SFR", "description": "Client X — farm slot 2", "wifi_split": true, "shared_speed_kbps": -1 }'
# Cancel (irreversible)
curl -X DELETE https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID \
-H "Authorization: Bearer mpx_live_…"
# → { "deleted": true, "id": "sub_760c1fc8ddab" }Proxys
Un proxy est un endpoint mono-protocole (SOCKS5 ou HTTP) sur un appareil, avec sa propre authentification, sa liste blanche d'IP source, sa limite de vitesse et ses règles de domaine. Le nombre de proxys qu'un appareil peut servir en même temps dépend du forfait (10 sur Standard, 20 sur Pro) — créez-en un par client ou par outil, et révoquez-en un sans toucher aux autres. Une création au-delà du plafond de votre forfait renvoie 409 proxy_limit_reached.
Créer un proxy — génère un nom d'utilisateur/mot de passe neuf ; le mot de passe est renvoyé en clair une seule fois, ici. Choisissez le protocol (socks5 ou http) et passez éventuellement traffic_limit_bytes pour lui fixer un plafond de trafic dur dès le départ :
curl -X POST https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "protocol": "socks5", "traffic_limit_bytes": 5368709120 }'
# → { "id": "acc_5f734b9270e8", "subscription_id": "sub_760c1fc8ddab",
# "protocol": "socks5",
# "host": "173.249.36.102", "host_v6": "2a02:c207:2319:6018::1",
# "port": 30000,
# "username": "u04c770", "password": "k7Qp2mXe9wZ4",
# "endpoint": "socks5h://u04c770:[email protected]:30000",
# "endpoint_ipv6": "socks5h://u04c770:k7Qp2mXe9wZ4@[2a02:c207:2319:6018::1]:30000",
# "ip_whitelist": [], "speed_limit_kbps": 0,
# "domain_mode": "none", "domain_rules": [],
# "status": "active", "traffic_limit_bytes": 5368709120, "bytes_used": 0,
# "over_limit": false, "created_at": "…" }endpoint est l'URI IPv4, endpoint_ipv6 le même port en IPv6 (le littéral v6 est entre crochets, selon la syntaxe des URL). La liste blanche d'IP source accepte les adresses et CIDR IPv4 et IPv6, et les destinations peuvent aussi être en IPv6 : un CONNECT SOCKS5 vers un littéral IPv6 ou un domaine uniquement AAAA sort via l'IPv6 de l'opérateur du téléphone lorsque la SIM en possède une.Modifier la politique d'un proxy — mode d'authentification, liste blanche d'IP, limite de vitesse et règles de domaine, appliqués en direct à la passerelle (le protocol est fixe — supprimez et recréez à la place) :
curl -X PATCH \
https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies/PROXY_ID \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "speed_limit_kbps": 2000,
"domain_mode": "whitelist", "domain_rules": ["api.example.com"] }'Lister les proxys — sur un seul appareil, ou tous les proxys de l'ensemble du compte :
# One device
curl https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies \
-H "Authorization: Bearer mpx_live_…"
# Account-wide
curl https://mobileproxy.app/api/v1/proxies \
-H "Authorization: Bearer mpx_live_…"
# → { "proxies": [ { …Proxy… }, … ] }Révoquer un proxy — arrête immédiatement cet unique écouteur ; tous les autres proxys de l'appareil continuent de fonctionner :
curl -X DELETE \
https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies/PROXY_ID \
-H "Authorization: Bearer mpx_live_…"
# → { "deleted": true, "id": "acc_5f734b9270e8" }Limites de consommation par proxy et expiration
Donnez à n'importe quel proxy une limite de consommation — idéal lorsque vous revendez de l'accès et facturez à chaque client une enveloppe de données. Définissez-la ou modifiez-la à tout moment (0 l'efface), à la création, via PATCH, ou avec l'endpoint dédié ci-dessous. Lorsque bytes_used atteint le plafond, le proxy est bloqué : il conserve son port et ses identifiants mais refuse chaque requête, et over_limit passe à true. Relevez la limite au-dessus de la quantité consommée — ou effacez-la — et le proxy reprend immédiatement, même endpoint, sans reconfiguration. La liste des proxys indique aussi pour chacun son traffic_limit_bytes, son bytes_used en direct et son over_limit.
curl -X POST \
https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies/PROXY_ID/limit \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "traffic_limit_bytes": 10737418240 }' # 10 GB — or 0 to remove
# → { "proxy_id": "acc_5f734b9270e8", "subscription_id": "sub_760c1fc8ddab",
# "traffic_limit_bytes": 10737418240, "over_limit": false }Expiration temporelle — donnez à un proxy un instant expires_at (ISO 8601, dans le futur) à la création ou via PATCH ; null efface une expiration en attente. À ce moment, le proxy est retiré — de façon permanente, contrairement au blocage réversible de la limite de consommation. Pour renouveler un client, créez un nouveau proxy (nouveau port et nouveaux identifiants). Parfait pour vendre des pass à la journée / à la semaine :
# A proxy that stops serving in 7 days
curl -X POST https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "protocol": "socks5", "expires_at": "2026-07-13T09:00:00Z" }'
# Extend or clear it later
curl -X PATCH \
https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies/PROXY_ID \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "expires_at": "2026-07-20T09:00:00Z" }' # or null to removeConfigurations VPN (WireGuard et OpenVPN)
Transformez n'importe quel proxy en VPN complet pour l'appareil. Chaque configuration est un fichier WireGuard (.conf) ou OpenVPN (.ovpn) qui fait passer tout un appareil — téléphone, ordinateur portable, routeur — par l'IP mobile de l'opérateur de ce proxy. Un proxy peut avoir 1 de chaque type — une configuration WireGuard et une OpenVPN. Les configurations nécessitent un proxy SOCKS5 + nom d'utilisateur/mot de passe pour que la passerelle puisse s'y authentifier. Créer une configuration nécessite l<strong>option VPN</strong> sur la commande de lappareil (403 vpn_addon_required sans elle) — les configurations existantes restent listées, téléchargeables et révocables.
config_text — le fichier complet, contenant la clé privée / le certificat du client. Il n'est pas re-dérivable ; conservez-le lors de sa création. Vous pouvez re-télécharger exactement le même fichier à tout moment depuis l'endpoint /file, mais un fichier perdu ne peut être remplacé qu'en révoquant et en créant une nouvelle configuration.# Create a WireGuard config on a proxy
curl -X POST \
https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies/PROXY_ID/vpn-configs \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "kind": "wireguard", "name": "My laptop" }'
# → { "id": "vpn_9f2c1a0b7e", "kind": "wireguard", "client_ip": "10.77.0.2",
# "config_text": "[Interface]\nPrivateKey = …\n[Peer]\n…", … }
# ...or OpenVPN
curl -X POST \
https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies/PROXY_ID/vpn-configs \
-H "Authorization: Bearer mpx_live_…" -H "Content-Type: application/json" \
-d '{ "kind": "openvpn" }'
# List a proxy's configs (metadata + per-kind usage vs the 1-per-kind cap)
curl https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies/PROXY_ID/vpn-configs \
-H "Authorization: Bearer mpx_live_…"
# Re-download the file straight to disk
curl -OJ \
https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies/PROXY_ID/vpn-configs/vpn_9f2c1a0b7e/file \
-H "Authorization: Bearer mpx_live_…"
# Revoke (drops the WireGuard peer / OpenVPN cert and kills any live session)
curl -X DELETE \
https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies/PROXY_ID/vpn-configs/vpn_9f2c1a0b7e \
-H "Authorization: Bearer mpx_live_…"Utilisez le fichier comme d'habitude : wg-quick up ./mpx-9f2c1a0b.conf pour WireGuard, ou importez le .ovpn dans n'importe quel client OpenVPN. Tout le trafic de l'appareil sort alors par l'IP de l'opérateur du téléphone, et faire tourner l'IP de ce proxy fait aussi tourner la sortie du VPN.
Rotation d'IP
La rotation demande à l'opérateur une nouvelle IP. Elle est par appareil — chaque proxy de l'appareil obtient la nouvelle IP — mise en file d'attente pour le téléphone et appliquée en un cycle de sondage (~25 s).
exit_ip sur l'appareil ou depuis /ip-history.Faire tourner maintenant — mettre en file une rotation ponctuelle :
curl -X POST https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/change-ip \
-H "Authorization: Bearer mpx_live_…"
# → { "status": "rotating", "subscription_id": "sub_760c1fc8ddab",
# "command_id": "cmd_a41b",
# "note": "IP rotation on mobile networks is best-effort; …" }Rotation à IP unique — passez unique: true pour continuer à tourner jusqu'à ce que l'IP de sortie soit une IP non vue dans les window_min dernières minutes de l'historique des IP de cet abonnement (par défaut 60, max 1440), avec jusqu'à max_attempts nouvelles tentatives (par défaut 3, max 5). Chaque tentative coûte un cycle de rotation complet (~30–90 s) ; sondez la variante GET pour la progression. Les opérateurs peuvent légitimement réémettre une IP, donc exhausted est une issue honnête possible :
curl -X POST https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/change-ip \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "unique": true, "window_min": 60, "max_attempts": 3 }'
# → { "status": "rotating", "request_id": "rr_18d2c4", "command_id": "cmd_a41b",
# "unique": { "window_min": 60, "max_attempts": 3 }, … }
# Poll for the outcome (active | succeeded | exhausted | superseded | expired)
curl https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/change-ip \
-H "Authorization: Bearer mpx_live_…"
# → { "request_id": "rr_18d2c4", "status": "succeeded",
# "attempts_used": 2, "attempts_max": 3, "window_min": 60,
# "started_ip": "77.136.66.63", "result_ip": "77.136.67.101", … }Liens de rotation — une URL à jeton qui fait tourner l'IP de cet appareil lorsqu'elle est récupérée, sans en-tête d'authentification (le secret est le jeton). Collez-la dans tout outil qui prend en charge une « URL de rotation ». Listez-les, créez-les et révoquez-les :
# List rotation links
curl https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/rotation-links \
-H "Authorization: Bearer mpx_live_…"
# → { "rotation_links": [ { "token": "rk_9f2c81d4e7",
# "url": "https://mobileproxy.app/rotate/rk_9f2c81d4e7", "created_at": "…" } ] }
# Create one
curl -X POST https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/rotation-links \
-H "Authorization: Bearer mpx_live_…"
# → { "token": "rk_9f2c81d4e7", "url": "https://mobileproxy.app/rotate/rk_9f2c81d4e7" }
# Revoke one
curl -X DELETE https://mobileproxy.app/api/v1/rotation-links/ROTATION_TOKEN \
-H "Authorization: Bearer mpx_live_…"
# → { "deleted": true, "token": "rk_9f2c81d4e7" }Rotation planifiée (temporisée) — définissez un intervalle de rotation automatique en minutes (0 la désactive ; max 1440). Il persiste en tant que rotation_interval_min sur l'appareil et pousse une commande set_rotation_interval que le téléphone applique à son prochain sondage, de sorte qu'il re-numérote de lui-même à cette cadence :
# Read the current settings
curl https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/rotation \
-H "Authorization: Bearer mpx_live_…"
# → { "subscription_id": "sub_760c1fc8ddab", "interval_minutes": 0,
# "airplane_seconds": 5, "stale_ip_alert_minutes": 0 }
# Rotate automatically every 15 minutes
curl -X POST https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/rotation \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "interval_minutes": 15 }'
# → { "status": "set", "subscription_id": "sub_760c1fc8ddab",
# "interval_minutes": 15, "airplane_seconds": 5,
# "stale_ip_alert_minutes": 0, "command_id": "cmd_a41b" }Délai du mode Avion — combien de temps le téléphone maintient le mode Avion activé pendant chaque changement d'IP (airplane_seconds, 3–60, par défaut 5). Certains opérateurs ne libèrent l'ancien bail qu'après un maintien plus long ; augmentez cette valeur si les rotations renvoient toujours la même IP. S'applique aux rotations planifiées, du dashboard et de l'API :
curl -X POST https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/rotation \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "airplane_seconds": 20 }'
# → { "status": "set", "subscription_id": "sub_760c1fc8ddab",
# "interval_minutes": 15, "airplane_seconds": 20,
# "stale_ip_alert_minutes": 0, "command_id": "cmd_b52c" }DNS personnalisé — les résolveurs que le téléphone utilise pour les recherches de domaines via le proxy (jusqu'à 3 littéraux IP ; le téléphone applique le premier et re-numérote son tunnel). Une liste vide restaure le DNS par défaut de l'opérateur :
# Read
curl https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/dns \
-H "Authorization: Bearer mpx_live_…"
# → { "subscription_id": "sub_760c1fc8ddab", "dns_servers": [] }
# Set (and later send [] to go back to carrier DNS)
curl -X POST https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/dns \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "dns_servers": ["1.1.1.1", "8.8.8.8"] }'
# → { "status": "set", "subscription_id": "sub_760c1fc8ddab",
# "dns_servers": ["1.1.1.1", "8.8.8.8"], "command_id": "cmd_c63d" }Monitoring
Historique des IP de sortie — les IP de sortie récentes signalées par le téléphone, dédoublonnées (une nouvelle ligne seulement quand l'IP a réellement changé). La façon fiable de vérifier qu'une rotation a abouti :
curl https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/ip-history \
-H "Authorization: Bearer mpx_live_…"
# → { "subscription_id": "sub_760c1fc8ddab", "ip_history": [
# { "ip": "77.136.66.63", "carrier": "SFR", "ts": "…" }, … ] }Paramètres de requête optionnels : from/to (ISO 8601) bornent la fenêtre, limit plafonne les entrées (par défaut 50, max 500), et group=day renvoie plutôt des décomptes de changements par jour — passez tz comme votre décalage UTC en minutes pour que les jours soient regroupés dans votre fuseau horaire. C'est ce qui alimente le calendrier d'historique des IP du dashboard :
# Entries for one day
curl "https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/ip-history?from=2026-07-04T22:00:00Z&to=2026-07-05T22:00:00Z&limit=500" \
-H "Authorization: Bearer mpx_live_…"
# Per-day counts for a month (tz = minutes east of UTC, e.g. 120 for CEST)
curl "https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/ip-history?group=day&tz=120&from=2026-06-30T22:00:00Z&to=2026-07-31T22:00:00Z" \
-H "Authorization: Bearer mpx_live_…"
# → { "subscription_id": "sub_760c1fc8ddab", "days": [
# { "day": "2026-07-03", "changes": 9 }, { "day": "2026-07-05", "changes": 2 } ] }Alertes IP — le serveur surveille votre parc (~toutes les 60 s) et ouvre une alerte lorsque quelque chose nécessite attention : stale_ip lorsqu'un appareil est en ligne mais que son IP de sortie n'a pas changé depuis plus longtemps que le seuil de l'abonnement (définissez stale_ip_alert_minutes sur /rotation ; 0 = désactivé, 2–10080), et duplicate_ip lorsque deux de vos appareils signalent la même IP de sortie (le NAT de l'opérateur peut attribuer une adresse à deux SIM — faites tourner l'une pour les séparer). Les alertes se résolvent automatiquement lorsque la condition disparaît ; elles apparaissent aussi dans la cloche d'alertes du dashboard :
# Turn on stale-IP alerts: warn after 60 min without an IP change
curl -X POST https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/rotation \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "stale_ip_alert_minutes": 60 }'
# Poll open alerts (feed this to your own monitoring)
curl https://mobileproxy.app/api/v1/alerts \
-H "Authorization: Bearer mpx_live_…"
# → { "alerts": [
# { "id": "42", "sub_id": "sub_760c1fc8ddab", "sub_name": "Galaxy S8",
# "kind": "stale_ip",
# "message": "IP unchanged for 75 min (alert threshold 60 min) — still 77.136.66.44",
# "detail": { "ip": "77.136.66.44", "age_min": 75, "threshold_min": 60 },
# "created_at": "…", "resolved_at": null, "seen_at": null },
# { "id": "41", "sub_id": "sub_9d8e7f6a5b4c", "sub_name": "Galaxy A32",
# "kind": "duplicate_ip",
# "message": "Exit IP 77.136.67.33 is also used by “Galaxy S8” — rotate one device to separate them",
# "detail": { "ip": "77.136.67.33",
# "shared_with": [ { "sub_id": "sub_760c1fc8ddab", "name": "Galaxy S8" } ] },
# "created_at": "…", "resolved_at": null, "seen_at": null } ],
# "unseen": 2 }
# Include resolved history; filter to one subscription
curl "https://mobileproxy.app/api/v1/alerts?status=all&subscription=SUBSCRIPTION_ID" \
-H "Authorization: Bearer mpx_live_…"
# Reset the dashboard's unseen badge (never resolves anything)
curl -X POST https://mobileproxy.app/api/v1/alerts/seen \
-H "Authorization: Bearer mpx_live_…"
# → { "status": "ok", "marked": 2 }Trafic d'un appareil — octets comptés à la passerelle, répartis par proxy. Pratique pour facturer les clients à qui vous revendez :
curl https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/traffic \
-H "Authorization: Bearer mpx_live_…"
# → { "subscription_id": "sub_760c1fc8ddab",
# "bytes_sent": 10485760, "bytes_recv": 262144000, "bytes_total": 272629760,
# "per_proxy": [ { "proxy_id": "acc_5f734b9270e8",
# "bytes_sent": 10485760, "bytes_recv": 262144000 } ] }Détail du trafic quotidien — octets envoyés/reçus par jour, à partir d'échantillons à la minute conservés côté web, de sorte que la série survit aux changements d'appareil et au retrait des proxys. data_since marque l'échantillon le plus ancien — les jours antérieurs n'ont pas de données, ce qui n'est pas la même chose qu'un trafic nul. Passez tz (votre décalage UTC en minutes) pour que les jours soient regroupés dans votre fuseau horaire ; fenêtres jusqu'à 92 jours :
curl "https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/traffic/by-day?tz=120" \
-H "Authorization: Bearer mpx_live_…"
# → { "subscription_id": "sub_760c1fc8ddab", "tz": 120, "data_since": "…",
# "days": [ { "day": "2026-07-06", "bytes_sent": 10485760,
# "bytes_recv": 262144000, "bytes_total": 272629760 } ],
# "total": { "bytes_sent": 10485760, "bytes_recv": 262144000,
# "bytes_total": 272629760 } }Disponibilité quotidienne — secondes actives/inactives par jour, repliées à partir de l'enregistrement de heartbeat de l'appareil (unifié entre les changements d'appareil). Elle mesure la vivacité du heartbeat de l'appareil (cadence ~25 s, seuil d'écart ~90 s), pas l'utilisabilité de bout en bout du tunnel. current est l'état actuel ; uptime_pct couvre la partie observée de chaque jour :
curl "https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/uptime?tz=120" \
-H "Authorization: Bearer mpx_live_…"
# → { "subscription_id": "sub_760c1fc8ddab", "tz": 120, "current": "up",
# "data_since": "…",
# "days": [ { "day": "2026-07-06", "up_seconds": 31547,
# "down_seconds": 253, "uptime_pct": 99.2 } ] }Consommation à l'échelle du compte — un cumul sur chaque appareil :
curl https://mobileproxy.app/api/v1/usage/summary \
-H "Authorization: Bearer mpx_live_…"
# → { "subscriptions": 3, "proxies": 5,
# "bytes_sent": 31457280, "bytes_recv": 786432000, "bytes_total": 817889280 }SMS / OTP
SMS reçus — messages entrants sur la SIM de ce téléphone, du plus récent au plus ancien. Utile pour lire des codes de vérification à usage unique (OTP) sur des téléphones que vous possédez. Cela dépend de l'autorisation optionnelle de réception de SMS de l'application ; si elle a été refusée sur l'appareil, la liste reste vide :
curl https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/sms \
-H "Authorization: Bearer mpx_live_…"
# → { "subscription_id": "sub_760c1fc8ddab", "messages": [
# { "id": "1042", "sender": "+15550101",
# "body": "Your verification code is 314159",
# "received_at": "2026-07-05T14:12:00.000Z" }, … ] }Serveurs
Emplacements des passerelles — les emplacements depuis lesquels vos proxys sont servis :
curl https://mobileproxy.app/api/v1/servers/locations \
-H "Authorization: Bearer mpx_live_…"
# → { "locations": [ { "id": "eu-de-1", "host": "173.249.36.102",
# "region": "EU · Germany (Frankfurt)", "country": "DE",
# "protocols": ["socks5"], "pool": "mobile" } ] }Jetons API
Lister, créer et révoquer des jetons API. Le secret d'un jeton nouvellement créé n'est affiché qu<strong>une seule fois</strong> — conservez-le tout de suite ; il nest plus jamais récupérable. La révocation prend effet immédiatement :
# List (metadata only — never the secret)
curl https://mobileproxy.app/api/v1/tokens \
-H "Authorization: Bearer mpx_live_…"
# → { "tokens": [ { "id": "tk_51ad", "name": "storefront",
# "prefix": "mpx_live_9f2c", "created_at": "…", "last_used_at": "…" } ] }
# Create (secret shown once)
curl -X POST https://mobileproxy.app/api/v1/tokens \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "name": "storefront" }'
# → { "id": "tk_51ad", "name": "storefront",
# "token": "mpx_live_9f2c81d4e7…", "prefix": "mpx_live_9f2c",
# "scope_subscription_id": null, "readonly": false,
# "note": "Store this token now — it will not be shown again." }
# Revoke
curl -X DELETE https://mobileproxy.app/api/v1/tokens/TOKEN_ID \
-H "Authorization: Bearer mpx_live_…"
# → { "deleted": true, "id": "tk_51ad" }Clés à portée limitée et en lecture seule
Déléguez l'accès sans partager votre compte. Passez subscription_id pour limiter un jeton à un seul abonnement, et readonly: true pour le restreindre aux requêtes GET. Un jeton à portée limitée ne peut atteindre que les endpoints de cet abonnement (plus /me) ; un jeton en lecture seule est refusé sur toute écriture. Les deux sont des restrictions superposées à votre compte — une clé à portée limitée ne peut jamais atteindre les données d'un autre compte.
# A read-only key for ONE subscription — safe to hand a teammate or a monitor
curl -X POST https://mobileproxy.app/api/v1/tokens \
-H "Authorization: Bearer mpx_live_…" \
-H "Content-Type: application/json" \
-d '{ "name": "customer-42",
"subscription_id": "sub_760c1fc8ddab",
"readonly": true }'
# → { …, "scope_subscription_id": "sub_760c1fc8ddab", "readonly": true }
# With that key: a GET on its own subscription works…
curl https://mobileproxy.app/api/v1/subscriptions/sub_760c1fc8ddab/traffic \
-H "Authorization: Bearer mpx_live_scoped…" # 200
# …but another subscription, the account-wide list, or any write is refused.
curl -X POST https://mobileproxy.app/api/v1/subscriptions/sub_760c1fc8ddab/change-ip \
-H "Authorization: Bearer mpx_live_scoped…" # 401 (read-only)