mobileproxy.app

API

Referință API

O referință completă, endpoint cu endpoint, pentru API-ul REST mobileproxy.app. Fiecare cale, câmp și exemplu de aici reflectă documentul OpenAPI live din care este construit API-ul. URL de bază https://mobileproxy.app/api/v1.

Autentificare și URL de bază

Fiecare endpoint se află sub https://mobileproxy.app/api/v1 și necesită un bearer token. Creați unul în dashboard, la Pentru dezvoltatori → Tokenuri API, sau cu POST /tokens în timp ce sunteți autentificat. Secretul este afișat o singură dată — salvați-l. Trimiteți-l la fiecare cerere:

Authorization: Bearer mpx_live_…

Tokenurile care încep cu mpx_live_ sunt tokenurile de cont. Endpoint-urile /device/* sunt apelate de aplicația Android însăși și se autentifică cu un token de dispozitiv per telefon (mpxdev_…) emis la pairing — în mod normal nu le apelați niciodată.

Încercați live
Consola interactivă vă permite să lipiți un token și să apelați fiecare endpoint din browser, cu corpuri de cerere și răspunsuri reale. Specificația brută se află la /api/v1/openapi.json.

Erorile sunt în format JSON, cu un mesaj lizibil și un cod pentru mașini:

{ "error": "No such device.", "code": "not_found" }
CâmpTipDescriere
401unauthorizedToken lipsă, malformat sau revocat.
403forbiddenToken valid, dar fără permisiune.
404not_foundResursa nu există în acest cont.
502control_plane_unavailableGateway/control plane temporar inaccesibil — reîncercați.

Cont

GET /me — cine sunt? Returnează contul plus numărul live de abonamente și tokenuri 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" }

Abonamente

Un abonament (id sub_…) este slotul durabil pe care îl dețineți: name-ul prietenos, setările și proxy-urile sale persistă chiar dacă telefonul din spatele lui se schimbă. device-ul său este telefonul care îl alimentează în prezent (sau null când este nepereche) și este schimbabil — un schimb păstrează fiecare endpoint proxy.

Listați abonamentele — fiecare cu dispozitivul său pereche îmbinat cu statusul live al gateway-ului (online = tunelul proxy este activ):

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ți un abonament (nepereche), apoi faceți pereche sau schimbați telefonul. POST /subscriptions/{id}/pair returnează un PIN valabil ~3 minute; introdus în aplicația Android, leagă telefonul. Pe un slot care are deja un dispozitiv, aceasta este o schimbare (mode: "swap") — vechiul telefon este retras și fiecare proxy își păstrează host:port și credențialele:

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

Obțineți, actualizați sau anulați un abonament. POST schimbă numele, o description liberă (max 200 de caractere, null o șterge), preferința wifi_split (pusă în coadă către telefonul pereche, aplicată la următorul său poll ~25 s) sau shared_speed_kbps — cum este împărțită viteza dispozitivului între proxy-urile sale. -1 (recomandat) o partajează automat: control plane măsoară viteza reală a dispozitivului din throughput-ul live (reechilibrare ~3 s), proxy-urile ocupate în același timp converg la cote egale din ea, iar un proxy care lucrează singur primește viteză maximă. O valoare > 0 împarte în același mod acel total fix al dispozitivului. Valorile speed_limit_kbps per proxy sunt păstrate, dar nu sunt aplicate cât timp oricare dintre acestea este activă; 0 dezactivează partajarea. DELETE demontează dispozitivul și proxy-urile sale, eliberează porturile gateway-ului și șterge istoricul slotului — ireversibil:

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

Un proxy este un singur endpoint cu un singur protocol (SOCKS5 sau HTTP) pe un dispozitiv, cu propriul auth, whitelist de IP sursă, limită de viteză și reguli de domeniu. Câte poate servi un dispozitiv simultan este o alocare a planului (10 pe Standard, 20 pe Pro) — creați câte unul per client sau instrument și revocați oricare fără a le atinge pe celelalte. O creare peste plafonul planului dvs. returnează 409 proxy_limit_reached.

Proxy-urile de pe un dispozitiv partajează IP-ul acestuia
Fiecare proxy de pe un dispozitiv iese prin același IP de operator și se rotește împreună — crearea unui al doilea proxy vă oferă o a doua credențială și politică, nu un al doilea IP. Pentru un alt IP, faceți pereche un alt telefon.

Creați un proxy — generează un username/password nou; parola este returnată în clar o singură dată, aici. Alegeți protocol (socks5 sau http) și opțional transmiteți traffic_limit_bytes pentru a-i da un plafon de trafic strict de la început:

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": "…" }
Fiecare port proxy este dual-stack (IPv4 + IPv6)
Conectați-vă prin oricare familie — endpoint este URI-ul IPv4, endpoint_ipv6 același port peste IPv6 (litera v6 este între paranteze drepte, conform sintaxei URL). Whitelist-ul de IP sursă acceptă adrese și CIDR-uri IPv4 și IPv6, iar destinațiile pot fi și ele IPv6: un SOCKS5 CONNECT către o literă IPv6 sau un domeniu doar-AAAA iese prin IPv6-ul de operator al telefonului atunci când SIM-ul are unul.

Editați politica unui proxy — modul de auth, whitelist-ul IP, limita de viteză și regulile de domeniu, aplicate live la gateway (protocol este fix — ștergeți și recreați în schimb):

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

Listați proxy-urile — pe un singur dispozitiv, sau fiecare proxy din întregul cont:

# 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ți un proxy — oprește imediat acel listener; fiecare alt proxy de pe dispozitiv continuă să funcționeze:

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

Limite de utilizare per proxy și expirare

Dați oricărui proxy o limită de utilizare — ideală când revindeți acces și contorizați fiecare client la o alocație de date. Setați-o sau modificați-o oricând (0 o șterge), la creare, prin PATCH, sau cu endpoint-ul dedicat de mai jos. Când bytes_used atinge plafonul, proxy-ul este blocat: își păstrează portul și credențialele, dar refuză fiecare cerere, iar over_limit devine true. Ridicați limita peste cantitatea folosită — sau ștergeți-o — și proxy-ul se reia imediat, același endpoint, fără reconfigurare. Listarea proxy-urilor raportează de asemenea pentru fiecare traffic_limit_bytes, bytes_used live și 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 }

Expirare pe bază de timp — dați unui proxy un moment expires_at (ISO 8601, în viitor) la creare sau prin PATCH; null șterge o expirare în așteptare. În acel moment proxy-ul este retras — permanent, spre deosebire de blocarea reversibilă a limitei de utilizare. Pentru a reînnoi un client, creați un proxy nou (port și credențiale noi). Perfect pentru vânzarea de abonamente pe zi/săptămână:

# 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

Configurări VPN (WireGuard și OpenVPN)

Transformați orice proxy într-un VPN pentru întregul dispozitiv. Fiecare configurare este un fișier WireGuard (.conf) sau OpenVPN (.ovpn) care tunelează un întreg dispozitiv — telefon, laptop, router — prin IP-ul de operator mobil al acelui proxy. Un proxy poate avea câte 1 din fiecare tip — o configurare WireGuard și una OpenVPN. Configurările necesită un proxy SOCKS5 + username/password pentru ca gateway-ul să se poată autentifica la el. Crearea unei configurări necesită add-on-ul VPN pe comanda dispozitivului (403 vpn_addon_required fără el) — configurările existente rămân listate, descărcabile și revocabile.

Fișierul este afișat o singură dată
Răspunsul la o creare include config_text — fișierul complet, care conține cheia privată / certificatul clientului. Nu poate fi re-derivat; salvați-l când îl creați. Puteți re-descărca exact același fișier oricând de la endpoint-ul /file, dar un fișier pierdut poate fi înlocuit doar revocând și creând o configurare nouă.
# 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_…"

Folosiți fișierul ca de obicei: wg-quick up ./mpx-9f2c1a0b.conf pentru WireGuard, sau importați .ovpn în orice client OpenVPN. Tot traficul dispozitivului iese apoi prin IP-ul de operator al telefonului, iar rotirea IP-ului acelui proxy rotește și ieșirea VPN-ului.

Rotație IP

Rotația cere operatorului un IP nou. Este per dispozitiv — fiecare proxy de pe dispozitiv primește noul IP — pusă în coadă către telefon și aplicată într-un ciclu de poll (~25 s).

Best-effort pe rețelele mobile
Dacă un re-dial produce o adresă nouă depinde de operator — unii reasignează același IP la re-dial-uri rapide. Confirmați din exit_ip pe dispozitiv sau din /ip-history.

Rotiți acum — puneți în coadă o rotație unică:

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

Rotație cu IP unic — transmiteți unique: true pentru a continua rotația până când IP-ul de ieșire este unul nevăzut în ultimele window_min minute din istoricul IP al acestui abonament (implicit 60, max 1440), reîncercând de până la max_attempts ori (implicit 3, max 5). Fiecare încercare costă un ciclu complet de rotație (~30–90 s); interogați varianta GET pentru progres. Operatorii pot reemite legitim un IP, așa că exhausted este un rezultat onest posibil:

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

Linkuri de rotație — un URL cu token care rotește IP-ul acestui dispozitiv când este accesat, fără header de auth (secretul este tokenul). Lipiți-l în orice instrument care acceptă un „rotation URL”. Listați-le, creați-le și revocați-le:

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

Rotație programată (cronometrată) — setați un interval de rotație automată în minute (0 o dezactivează; max 1440). Persistă ca rotation_interval_min pe dispozitiv și trimite o comandă set_rotation_interval pe care telefonul o aplică la următorul său poll, așa că re-dial-ează singur în acel ritm:

# 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 mod avion — cât timp menține telefonul modul avion ACTIV la fiecare schimbare de IP (airplane_seconds, 3–60, implicit 5). Unii operatori eliberează vechiul lease doar după o menținere mai lungă; măriți această valoare dacă rotațiile returnează mereu același IP. Se aplică la fel pentru rotațiile programate, din dashboard și prin 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 personalizat — resolverele pe care telefonul le folosește pentru căutările de domenii proxate (până la 3 litere IP; telefonul îl aplică pe primul și re-dial-ează tunelul). O listă goală restabilește DNS-ul implicit al operatorului:

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

Monitorizare

Istoric IP de ieșire — IP-urile de ieșire recente raportate de telefon, deduplicate (o linie nouă doar când IP-ul chiar s-a schimbat). Modul fiabil de a verifica dacă o rotație a reușit:

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 de interogare opționali: from/to (ISO 8601) delimitează fereastra, limit plafonează intrările (implicit 50, max 500), iar group=day returnează în schimb numărul de schimbări pe zi — transmiteți tz ca decalajul dvs. față de UTC în minute, pentru ca zilele să fie grupate în fusul dvs. orar. Acesta alimentează calendarul de istoric IP din 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 } ] }

Alerte IP — serverul vă supraveghează flota (~la fiecare 60 s) și deschide o alertă când ceva necesită atenție: stale_ip când un dispozitiv este online, dar IP-ul său de ieșire nu s-a schimbat mai mult decât pragul abonamentului (setați stale_ip_alert_minutes pe /rotation; 0 = dezactivat, 2–10080), și duplicate_ip când două dintre dispozitivele dvs. raportează același IP de ieșire (NAT-ul operatorului poate atribui unei perechi de SIM-uri o singură adresă — rotiți unul pentru a le separa). Alertele se rezolvă automat când condiția dispare; apar și în clopoțelul de alerte din 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 pentru un dispozitiv — octeți numărați la gateway, împărțiți pe proxy. Util pentru facturarea clienților cărora le revindeți:

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

Defalcare zilnică a traficului — octeți trimiși/primiți pe zi, din eșantioane cu rezoluție de minut păstrate pe nivelul web, așa că seria supraviețuiește schimburilor de dispozitive și retragerii proxy-urilor. data_since marchează cel mai vechi eșantion — zilele de dinaintea lui nu au date, ceea ce nu este același lucru cu trafic zero. Transmiteți tz (decalajul dvs. față de UTC în minute) pentru ca zilele să fie grupate în fusul dvs. orar; ferestre de până la 92 de zile:

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 zilnic — secunde up/down pe zi calculate din înregistrarea de heartbeat a dispozitivului (unificate peste schimburile de dispozitive). Măsoară liveness-ul heartbeat-ului dispozitivului (ritm ~25 s, prag de gol ~90 s), nu utilizabilitatea tunelului cap la cap. current este starea de acum; uptime_pct acoperă partea observată din fiecare zi:

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

Utilizare la nivel de cont — un cumul peste fiecare dispozitiv:

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-uri primite — mesajele de intrare pe SIM-ul acestui telefon, cele mai noi primele. Utile pentru citirea codurilor de verificare unice (OTP) pe telefoanele pe care le dețineți. Se bazează pe permisiunea opțională de recepție SMS a aplicației; dacă aceasta a fost refuzată pe dispozitiv, lista rămâne goală:

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

Servere

Locații gateway — locațiile din care sunt servite proxy-urile dvs.:

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

Tokenuri API

Listați, creați și revocați tokenuri API. Secretul unui token nou creat este afișat o singură dată — salvați-l imediat; nu mai poate fi recuperat niciodată. Revocarea are efect imediat:

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

Chei cu scop restrâns și doar-citire

Delegați accesul fără a vă partaja contul. Transmiteți subscription_id pentru a restrânge un token la un singur abonament și readonly: true pentru a-l limita la cereri GET. Un token cu scop restrâns poate accesa doar endpoint-urile propriului abonament (plus /me); un token doar-citire este refuzat la orice scriere. Ambele sunt restricții stratificate peste contul dvs. — o cheie cu scop restrâns nu poate accesa niciodată datele altui cont.

# 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)
Sfat
Această referință rămâne în pas cu API-ul. Pentru un browser prin care puteți naviga cu clicuri — cu propriul token și răspunsuri live — deschideți consola interactivă, sau citiți documentul OpenAPI brut.