mobileproxy.app

API

Riferimento API

Un riferimento completo, endpoint per endpoint, dell'API REST di mobileproxy.app. Ogni percorso, campo ed esempio qui rispecchia il documento OpenAPI dal vivo su cui è costruita l'API. Base URL https://mobileproxy.app/api/v1.

Autenticazione e base URL

Ogni endpoint si trova sotto https://mobileproxy.app/api/v1 e richiede un bearer token. Creane uno nella dashboard in Per gli sviluppatori → Token API, oppure con POST /tokens mentre sei autenticato. Il segreto viene mostrato una sola volta — conservalo. Invialo a ogni richiesta:

Authorization: Bearer mpx_live_…

I token che iniziano con mpx_live_ sono i token del tuo account. Gli endpoint /device/* sono chiamati dall'app Android stessa e si autenticano con un token dispositivo per singolo telefono (mpxdev_…) emesso al pairing — normalmente non li chiami mai.

Provala dal vivo
La console interattiva ti permette di incollare un token e chiamare ogni endpoint dal browser, con corpi di richiesta e risposte reali. La specifica grezza è su /api/v1/openapi.json.

Gli errori sono in JSON con un messaggio leggibile e un codice per le macchine:

{ "error": "No such device.", "code": "not_found" }
CampoTipoDescrizione
401unauthorizedToken mancante, malformato o revocato.
403forbiddenToken valido ma non autorizzato.
404not_foundLa risorsa non esiste su questo account.
502control_plane_unavailableGateway/control plane momentaneamente irraggiungibile — riprova.

Account

GET /me — chi sono? Restituisce l'account più i conteggi in tempo reale di abbonamenti e token 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" }

Abbonamenti

Un abbonamento (id sub_…) è lo slot durevole che possiedi: il suo name amichevole, le impostazioni e i proxy persistono anche quando cambia il telefono al di sotto. Il suo device è il telefono che lo alimenta al momento (o null quando non è associato), ed è sostituibile — una sostituzione mantiene ogni endpoint proxy.

Elenca gli abbonamenti — ciascuno con il proprio dispositivo associato unito allo stato del gateway in tempo reale (online = il tunnel proxy è attivo):

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": "…" } } ] }

Crea un abbonamento (non associato), poi associa o sostituisci il telefono. POST /subscriptions/{id}/pair restituisce un PIN valido ~3 minuti; inserito nell'app Android, associa il telefono. Su uno slot che ha già un dispositivo si tratta di una sostituzione (mode: "swap") — il vecchio telefono viene dismesso e ogni proxy mantiene il proprio host:port e le credenziali:

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": "…" }, … }

Ottieni, aggiorna o annulla un abbonamento. POST modifica il nome, una description libera (max 200 caratteri, null la cancella), la preferenza wifi_split (messa in coda per il telefono associato, applicata al suo prossimo poll ~25 s), oppure shared_speed_kbps — come la velocità del dispositivo viene ripartita tra i suoi proxy. -1 (consigliato) la condivide automaticamente: il control plane misura la velocità reale del dispositivo dal throughput dal vivo (riequilibrio ~3 s), i proxy attivi nello stesso momento convergono verso quote uguali e un proxy che lavora da solo ottiene la velocità piena. Un valore > 0 ripartisce nello stesso modo quel totale fisso del dispositivo. I valori speed_limit_kbps per singolo proxy vengono conservati ma non applicati finché uno dei due è attivo; 0 disattiva la condivisione. DELETE smantella il suo dispositivo e i proxy, rilascia le porte del gateway ed elimina lo storico dello slot — irreversibile:

# 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" }

Proxy

Un proxy è un singolo endpoint mono-protocollo (SOCKS5 oppure HTTP) su un dispositivo, con la propria autenticazione, whitelist di IP di origine, limite di velocità e regole di dominio. Quanti un dispositivo può servirne contemporaneamente è un diritto del piano (10 su Standard, 20 su Pro) — creane uno per cliente o strumento e revocane uno qualsiasi senza toccare gli altri. Una creazione oltre il limite del tuo piano restituisce 409 proxy_limit_reached.

I proxy su un dispositivo condividono il suo IP
Ogni proxy su un dispositivo esce attraverso lo stesso IP dell'operatore e ruota insieme agli altri — creare un secondo proxy ti dà una seconda credenziale e policy, non un secondo IP. Per un altro IP, associa un altro telefono.

Crea un proxy — genera una nuova coppia username/password; la password viene restituita in chiaro una sola volta, qui. Scegli protocol (socks5 o http) e, facoltativamente, passa traffic_limit_bytes per dargli un tetto di traffico rigido fin dall'inizio:

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": "…" }
Ogni porta proxy è dual-stack (IPv4 + IPv6)
Connettiti tramite una delle due famiglie — endpoint è l'URI IPv4, endpoint_ipv6 la stessa porta su IPv6 (il letterale v6 è tra parentesi quadre, come da sintassi URL). La whitelist di IP di origine accetta indirizzi e CIDR IPv4 e IPv6, e anche le destinazioni possono essere IPv6: un CONNECT SOCKS5 verso un letterale IPv6 o un dominio solo AAAA esce attraverso l'IPv6 dell'operatore del telefono quando la SIM ne ha uno.

Modifica la policy di un proxy — modalità di autenticazione, whitelist IP, limite di velocità e regole di dominio, applicate dal vivo al gateway (protocol è fisso — elimina e ricrea invece):

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"] }'

Elenca i proxy — su un dispositivo, oppure ogni proxy dell'intero account:

# 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… }, … ] }

Revoca un proxy — arresta immediatamente quel singolo listener; ogni altro proxy sul dispositivo continua a funzionare:

curl -X DELETE \
  https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies/PROXY_ID \
  -H "Authorization: Bearer mpx_live_…"
# → { "deleted": true, "id": "acc_5f734b9270e8" }

Limiti di utilizzo per proxy e scadenza

Assegna a qualsiasi proxy un limite di utilizzo — ideale quando rivendi l'accesso e conteggi ogni cliente su un'allocazione di dati. Impostalo o modificalo in qualsiasi momento (0 lo cancella), alla creazione, tramite PATCH o con l'endpoint dedicato qui sotto. Quando bytes_used raggiunge il tetto, il proxy viene bloccato: mantiene la porta e le credenziali ma rifiuta ogni richiesta, e over_limit diventa true. Alza il limite oltre la quantità utilizzata — o cancellalo — e il proxy riprende immediatamente, stesso endpoint, senza riconfigurazione. L'elenco dei proxy riporta anche per ciascuno traffic_limit_bytes, bytes_used in tempo reale e 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 }

Scadenza a tempo — assegna a un proxy un istante expires_at (ISO 8601, nel futuro) alla creazione o tramite PATCH; null cancella una scadenza in sospeso. In quel momento il proxy viene dismesso — permanentemente, a differenza del blocco reversibile del limite di utilizzo. Per rinnovare un cliente, crea un nuovo proxy (nuova porta e credenziali). Perfetto per vendere pass giornalieri/settimanali:

# 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 remove

Configurazioni VPN (WireGuard e OpenVPN)

Trasforma qualsiasi proxy in una VPN per l'intero dispositivo. Ogni configurazione è un file WireGuard (.conf) o OpenVPN (.ovpn) che instrada un intero dispositivo — telefono, laptop, router — attraverso l'IP dell'operatore mobile di quel proxy. Un proxy può avere 1 di ciascun tipo — una configurazione WireGuard e una OpenVPN. Le configurazioni richiedono un proxy SOCKS5 + username/password affinché il gateway possa autenticarsi ad esso. Creare una configurazione richiede il componente aggiuntivo VPN sull'ordine del dispositivo (403 vpn_addon_required senza di esso) — le configurazioni esistenti restano elencate, scaricabili e revocabili.

Il file viene mostrato una sola volta
La risposta a una creazione include config_text — il file completo, che contiene la chiave privata / il certificato del client. Non è ricavabile di nuovo; conservalo quando lo crei. Puoi riscaricare esattamente lo stesso file in qualsiasi momento dall'endpoint /file, ma un file perso può essere sostituito solo revocando e creando una nuova configurazione.
# 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_…"

Usa il file come al solito: wg-quick up ./mpx-9f2c1a0b.conf per WireGuard, oppure importa il .ovpn in qualsiasi client OpenVPN. Tutto il traffico del dispositivo esce quindi attraverso l'IP dell'operatore del telefono, e ruotare l'IP di quel proxy ruota anche l'uscita della VPN.

Rotazione IP

La rotazione chiede all'operatore un IP nuovo. È per dispositivo — ogni proxy sul dispositivo ottiene il nuovo IP — messa in coda per il telefono e applicata entro un ciclo di poll (~25 s).

Best-effort sulle reti mobili
Se una nuova connessione produca un nuovo indirizzo è una decisione dell'operatore — alcuni riassegnano lo stesso IP su riconnessioni rapide. Conferma da exit_ip sul dispositivo o da /ip-history.

Ruota adesso — metti in coda una rotazione una tantum:

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; …" }

Rotazione a IP unico — passa unique: true per continuare a ruotare finché l'IP di uscita non è uno non visto negli ultimi window_min minuti dello storico IP di questo abbonamento (predefinito 60, max 1440), riprovando fino a max_attempts volte (predefinito 3, max 5). Ogni tentativo costa un ciclo completo di rotazione (~30–90 s); interroga la variante GET per lo stato di avanzamento. Gli operatori possono legittimamente riemettere un IP, quindi exhausted è un esito onesto possibile:

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", … }

Link di rotazione — un URL tokenizzato che ruota l'IP di questo dispositivo quando viene richiamato, senza header di autenticazione (il segreto è il token). Incollalo in qualsiasi strumento che supporti un "URL di rotazione". Elencali, creali e revocali:

# 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" }

Rotazione programmata (a tempo) — imposta un intervallo di rotazione automatica in minuti (0 la disattiva; max 1440). Persiste come rotation_interval_min sul dispositivo e invia un comando set_rotation_interval che il telefono applica al suo prossimo poll, così si riconnette da solo con quella cadenza:

# 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" }

Timeout modalità aereo — per quanto tempo il telefono tiene attiva la modalità aereo durante ogni cambio IP (airplane_seconds, 3–60, predefinito 5). Alcuni operatori rilasciano il vecchio lease solo dopo un'attesa più lunga; aumentalo se le rotazioni continuano a restituire lo stesso IP. Si applica allo stesso modo a rotazioni programmate, da dashboard e 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 personalizzato — i resolver che il telefono usa per le risoluzioni di dominio proxate (fino a 3 letterali IP; il telefono applica il primo e riconnette il suo tunnel). Un elenco vuoto ripristina il DNS predefinito dell'operatore:

# 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" }

Monitoraggio

Storico degli IP di uscita — gli IP di uscita recenti riportati dal telefono, deduplicati (una nuova riga solo quando l'IP è effettivamente cambiato). Il modo affidabile per verificare che una rotazione sia andata a buon fine:

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": "…" }, … ] }

Parametri di query facoltativi: from/to (ISO 8601) delimitano la finestra, limit limita le voci (predefinito 50, max 500), e group=day restituisce invece i conteggi di cambio per giorno — passa tz come tuo offset UTC in minuti così i giorni sono raggruppati nel tuo fuso orario. È ciò che alimenta il calendario dello storico IP della 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 } ] }

Avvisi IP — il server sorveglia la tua flotta (~ogni 60 s) e apre un avviso quando serve attenzione: stale_ip quando un dispositivo è online ma il suo IP di uscita non cambia da più della soglia dell'abbonamento (imposta stale_ip_alert_minutes su /rotation; 0 = disattivato, 2–10080), e duplicate_ip quando due dei tuoi dispositivi riportano lo stesso IP di uscita (il NAT dell'operatore può assegnare un unico indirizzo a due SIM — ruotane uno per separarli). Gli avvisi si risolvono automaticamente quando la condizione cessa; compaiono anche nella campanella degli avvisi della 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 }

Traffico per un dispositivo — byte conteggiati al gateway, suddivisi per proxy. Utile per fatturare i clienti a cui rivendi:

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 } ] }

Dettaglio del traffico giornaliero — byte inviati/ricevuti per giorno, da campioni con risoluzione al minuto conservati sul tier web, così la serie sopravvive alle sostituzioni di dispositivo e alla dismissione dei proxy. data_since segna il campione più vecchio — i giorni precedenti non hanno dati, il che non equivale a traffico zero. Passa tz (il tuo offset UTC in minuti) così i giorni sono raggruppati nel tuo fuso orario; finestre fino a 92 giorni:

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 } }

Uptime giornaliero — secondi up/down per giorno ricavati dal registro degli heartbeat del dispositivo (unificato tra le sostituzioni di dispositivo). Misura la vitalità degli heartbeat del dispositivo (cadenza ~25 s, soglia di gap ~90 s), non l'usabilità del tunnel end-to-end. current è lo stato in questo momento; uptime_pct copre la parte osservata di ogni giorno:

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 } ] }

Utilizzo su tutto l'account — un riepilogo su ogni dispositivo:

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 ricevuti — messaggi in arrivo sulla SIM di questo telefono, dal più recente. Utile per leggere i codici di verifica monouso (OTP) su telefoni che possiedi. Si basa sul permesso opzionale di ricezione SMS dell'app; se è stato rifiutato sul dispositivo, l'elenco resta vuoto:

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" }, … ] }

Server

Località del gateway — le località da cui vengono serviti i tuoi proxy:

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" } ] }

Token API

Elenca, crea e revoca i token API. Il segreto di un token appena creato viene mostrato una sola volta — conservalo subito; non è più recuperabile. La revoca ha effetto immediato:

# 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" }

Chiavi con ambito e in sola lettura

Delega l'accesso senza condividere il tuo account. Passa subscription_id per limitare un token a un singolo abbonamento, e readonly: true per limitarlo alle richieste GET. Un token con ambito può raggiungere solo gli endpoint di quell'abbonamento (più /me); un token in sola lettura viene rifiutato su qualsiasi scrittura. Entrambe sono restrizioni sovrapposte al tuo account — una chiave con ambito non può mai raggiungere i dati di un altro account.

# 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)
Suggerimento
Questo riferimento resta perfettamente allineato all'API. Per un browser in cui poter cliccare — con il tuo token e risposte dal vivo — apri la console interattiva, oppure leggi il documento OpenAPI grezzo.