mobileproxy.app

API

API-referentie

Een volledige referentie, endpoint voor endpoint, van de REST API van mobileproxy.app. Elk pad, elk veld en elk voorbeeld hier weerspiegelt het live OpenAPI-document waarop de API is gebouwd. Basis-URL https://mobileproxy.app/api/v1.

Authenticatie & basis-URL

Elk endpoint valt onder https://mobileproxy.app/api/v1 en vereist een bearer-token. Maak er een aan in het dashboard onder Voor ontwikkelaars → API-tokens, of met POST /tokens terwijl je bent ingelogd. Het geheim wordt één keer getoond — bewaar het. Stuur het bij elk verzoek mee:

Authorization: Bearer mpx_live_…

Tokens die met mpx_live_ beginnen zijn je accounttokens. De /device/*-endpoints worden door de Android-app zelf aangeroepen en authenticeren met een device-token per telefoon (mpxdev_…) dat bij het koppelen wordt uitgegeven — normaal roep je ze nooit aan.

Probeer het live
In de interactieve console plak je een token en roep je vanuit de browser elk endpoint aan, met request-bodies en echte responses. De ruwe spec staat op /api/v1/openapi.json.

Fouten zijn JSON met een leesbare melding en een machinecode:

{ "error": "No such device.", "code": "not_found" }
VeldTypeBeschrijving
401unauthorizedToken ontbreekt, is ongeldig of ingetrokken.
403forbiddenToken geldig maar niet toegestaan.
404not_foundResource bestaat niet op dit account.
502control_plane_unavailableGateway/control plane even onbereikbaar — probeer opnieuw.

Account

GET /me — wie ben ik? Geeft het account terug plus live tellingen van abonnementen en API-tokens.

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

Abonnementen

Een abonnement (id sub_…) is de duurzame slot die je bezit: de vriendelijke name, instellingen en proxy's blijven bestaan, ook als de telefoon eronder verandert. Het device is de telefoon die het abonnement op dit moment aandrijft (of null wanneer niet gekoppeld), en is verwisselbaar — bij een wissel blijft elk proxy-endpoint behouden.

Toon abonnementen — elk met het gekoppelde apparaat, samengevoegd met live gateway-status (online = de proxytunnel is actief):

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

Maak een abonnement (niet gekoppeld), en koppel of wissel de telefoon. POST /subscriptions/{id}/pair geeft een PIN die ~3 minuten geldig is; ingevoerd in de Android-app bindt hij de telefoon. Op een slot die al een apparaat heeft is dit een wissel (mode: "swap") — de oude telefoon wordt afgedankt en elke proxy behoudt zijn host:port en credentials:

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

Haal één abonnement op, wijzig of annuleer het. POST wijzigt de naam, een vrije description (max 200 tekens, null wist hem), de wifi_split-voorkeur (in de wachtrij gezet voor de gekoppelde telefoon, toegepast bij de volgende poll ~25 s), of shared_speed_kbps — hoe de snelheid van het apparaat over zijn proxy's wordt verdeeld. -1 (aanbevolen) deelt hem automatisch: de control plane meet de echte snelheid van het apparaat aan de hand van live doorvoer (~3 s herbalancering), proxy's die tegelijk actief zijn convergeren naar gelijke delen ervan, en een proxy die alleen werkt krijgt de volle snelheid. Een waarde > 0 verdeelt in plaats daarvan dat vaste apparaattotaal op dezelfde manier. Per-proxy speed_limit_kbps-waarden blijven bewaard maar worden niet afgedwongen zolang een van beide aan staat; 0 schakelt delen uit. DELETE breekt het apparaat en de proxy's af, geeft de gateway-poorten vrij en verwijdert de geschiedenis van het slot — onomkeerbaar:

# 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's

Een proxy is één endpoint met één protocol (SOCKS5 of HTTP) op een apparaat, met eigen auth, bron-IP-whitelist, snelheidslimiet en domeinregels. Hoeveel een apparaat er tegelijk kan bedienen is een plan-entitlement (10 op Standard, 20 op Pro) — maak er één per klant of tool, en trek er willekeurig één in zonder de rest te raken. Een create voorbij de limiet van je plan geeft 409 proxy_limit_reached.

Proxy's op één apparaat delen zijn IP
Elke proxy op een apparaat gaat naar buiten via hetzelfde carrier-IP en roteert samen — een tweede proxy aanmaken geeft je een tweede credential en beleid, geen tweede IP. Voor een ander IP koppel je een tweede telefoon.

Maak een proxy — genereert een verse username/password; het wachtwoord wordt hier één keer in leesbare vorm teruggegeven. Kies het protocol (socks5 of http) en geef optioneel traffic_limit_bytes mee om er vanaf het begin een harde dataplafond aan te geven:

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": "…" }
Elke proxypoort is dual-stack (IPv4 + IPv6)
Verbind via beide families — endpoint is de IPv4-URI, endpoint_ipv6 dezelfde poort over IPv6 (de v6-literal staat tussen haakjes, conform URL-syntaxis). De bron-IP-whitelist accepteert IPv4- en IPv6-adressen en CIDR's, en bestemmingen mogen ook IPv6 zijn: een SOCKS5 CONNECT naar een IPv6-literal of een AAAA-only domein gaat naar buiten via het carrier-IPv6 van de telefoon wanneer de SIM er een heeft.

Wijzig het beleid van een proxy — authmodus, IP-whitelist, snelheidslimiet en domeinregels, live toegepast op de gateway (protocol ligt vast — verwijder en maak opnieuw aan):

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

Toon proxy's — op één apparaat, of elke proxy op het hele 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… }, … ] }

Trek een proxy in — stopt die ene listener onmiddellijk; elke andere proxy op het apparaat blijft werken:

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

Verbruikslimieten & vervaldatum per proxy

Geef elke proxy een verbruikslimiet — ideaal wanneer je toegang doorverkoopt en elke klant naar een datategoed meet. Stel hem in of wijzig hem op elk moment (0 wist hem), bij het aanmaken, via PATCH, of met het specifieke endpoint hieronder. Wanneer bytes_used het plafond bereikt, wordt de proxy geblokkeerd: hij behoudt zijn poort en credentials maar weigert elk verzoek, en over_limit wordt true. Verhoog de limiet boven de gebruikte hoeveelheid — of wis hem — en de proxy hervat direct, hetzelfde endpoint, geen herconfiguratie. Bij het tonen van proxy's rapporteert elk ook zijn traffic_limit_bytes, live bytes_used en 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 }

Tijdgebonden vervaldatum — geef een proxy een expires_at-tijdstip (ISO 8601, in de toekomst) bij het aanmaken of via PATCH; null wist een geplande vervaldatum. Op dat moment wordt de proxy definitief afgedankt — anders dan de omkeerbare blokkade bij een verbruikslimiet. Om een klant te verlengen maak je een verse proxy aan (nieuwe poort en credentials). Perfect voor het verkopen van dag- of weekpassen:

# 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

VPN-configuraties (WireGuard & OpenVPN)

Maak van elke proxy een volledige apparaat-VPN. Elke configuratie is een WireGuard- (.conf) of OpenVPN- (.ovpn) bestand dat een heel apparaat — telefoon, laptop, router — door het mobiele carrier-IP van die proxy tunnelt. Een proxy kan 1 van elke soort hebben — één WireGuard- en één OpenVPN-configuratie. Configuraties vereisen een SOCKS5 + username/password-proxy zodat de gateway zich erbij kan authenticeren. Een configuratie aanmaken vereist de VPN-add-on op de order van het apparaat (403 vpn_addon_required zonder deze) — bestaande configuraties blijven getoond, downloadbaar en intrekbaar.

Het bestand wordt één keer getoond
De respons op een create bevat config_text — het volledige bestand, met de privésleutel / certificaat van de client. Het is niet opnieuw af te leiden; bewaar het wanneer je het aanmaakt. Je kunt exact hetzelfde bestand op elk moment opnieuw downloaden via het /file-endpoint, maar een verloren bestand kan alleen worden vervangen door de configuratie in te trekken en een nieuwe aan te maken.
# 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_…"

Gebruik het bestand zoals gewoonlijk: wg-quick up ./mpx-9f2c1a0b.conf voor WireGuard, of importeer de .ovpn in een OpenVPN-client. Al het verkeer van het apparaat gaat dan naar buiten via het carrier-IP van de telefoon, en het IP van die proxy roteren roteert ook de exit van de VPN.

IP-rotatie

Rotatie vraagt de carrier om een vers IP. Het gaat per apparaat — elke proxy op het apparaat krijgt het nieuwe IP — in de wachtrij gezet voor de telefoon en toegepast binnen één poll-cyclus (~25 s).

Best-effort op mobiele netwerken
Of een nieuwe verbinding een nieuw adres oplevert, bepaalt de carrier — sommige wijzen bij snelle heraanmeldingen hetzelfde IP toe. Bevestig via exit_ip op het apparaat of via /ip-history.

Roteer nu — zet een eenmalige rotatie in de wachtrij:

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

Rotatie naar uniek IP — geef unique: true mee om te blijven roteren tot het exit-IP er een is dat de laatste window_min minuten van de IP-geschiedenis van dit abonnement niet is gezien (standaard 60, max 1440), met maximaal max_attempts pogingen (standaard 3, max 5). Elke poging kost een volledige rotatiecyclus (~30–90 s); poll de GET-variant voor de voortgang. Carriers kunnen legitiem een IP opnieuw uitgeven, dus exhausted is een mogelijke eerlijke uitkomst:

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

Rotatielinks — een URL met token die het IP van dit apparaat roteert bij het ophalen, zonder auth-header (het geheim is het token). Plak hem in elke tool die een "rotatie-URL" ondersteunt. Toon, maak en trek ze in:

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

Geplande (getimede) rotatie — stel een interval voor automatische rotatie in minuten in (0 schakelt het uit; max 1440). Het blijft bewaard als rotation_interval_min op het apparaat en stuurt een set_rotation_interval-commando dat de telefoon bij de volgende poll toepast, zodat hij vanzelf op dat ritme opnieuw verbindt:

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

Vliegtuigmodus-timeout — hoe lang de telefoon de vliegtuigmodus AAN houdt tijdens elke IP-wijziging (airplane_seconds, 3–60, standaard 5). Sommige carriers geven de oude lease pas na een langere hold vrij; verhoog dit als rotaties steeds hetzelfde IP blijven teruggeven. Geldt voor geplande, dashboard- en API-rotaties gelijk:

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

Aangepaste DNS — de resolvers die de telefoon gebruikt voor geproxyde domeinopzoekingen (max 3 IP-literals; de telefoon past de eerste toe en verbindt zijn tunnel opnieuw). Een lege lijst herstelt de standaard-DNS van de carrier:

# 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

Exit-IP-geschiedenis — recente exit-IP's die de telefoon rapporteert, ontdubbeld (een nieuwe rij pas wanneer het IP echt is veranderd). De betrouwbare manier om te verifiëren dat een rotatie is geland:

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

Optionele query-parameters: from/to (ISO 8601) begrenzen het venster, limit beperkt het aantal items (standaard 50, max 500), en group=day geeft in plaats daarvan het aantal wijzigingen per dag terug — geef tz mee als je UTC-offset in minuten zodat dagen in jouw tijdzone worden gegroepeerd. Dit voedt de IP-geschiedeniskalender van het 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 } ] }

IP-waarschuwingen — de server bewaakt je fleet (~elke 60 s) en opent een waarschuwing wanneer iets aandacht nodig heeft: stale_ip wanneer een apparaat online is maar het exit-IP langer dan de drempel van het abonnement niet is veranderd (stel stale_ip_alert_minutes in op /rotation; 0 = uit, 2–10080), en duplicate_ip wanneer twee van je apparaten hetzelfde exit-IP rapporteren (carrier-NAT kan twee SIM's één adres geven — roteer er één om ze te scheiden). Waarschuwingen worden automatisch opgelost wanneer de conditie verdwijnt; ze verschijnen ook in de waarschuwingsbel van het 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 }

Verkeer voor een apparaat — bytes geteld bij de gateway, opgesplitst per proxy. Handig voor het factureren van klanten aan wie je doorverkoopt:

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

Dagelijkse verkeersuitsplitsing — verzonden/ontvangen bytes per dag, uit samples op minuutresolutie die op de webtier worden bewaard, zodat de reeks apparaatwissels en het afdanken van proxy's overleeft. data_since markeert het oudste sample — dagen ervoor hebben geen data, wat niet hetzelfde is als nul verkeer. Geef tz mee (je UTC-offset in minuten) zodat dagen in jouw tijdzone worden gegroepeerd; vensters tot 92 dagen:

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

Dagelijkse uptime — up-/down-seconden per dag, samengevouwen uit het heartbeat-record van het apparaat (verenigd over apparaatwissels heen). Het meet de heartbeat-levendigheid van het apparaat (~25 s ritme, ~90 s gap-drempel), niet de end-to-end-bruikbaarheid van de tunnel. current is de toestand op dit moment; uptime_pct dekt het waargenomen deel van elke dag:

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

Accountbreed verbruik — een samenvatting over elk apparaat:

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

Ontvangen SMS — inkomende berichten op de SIM van deze telefoon, nieuwste eerst. Handig om eenmalige verificatiecodes (OTP's) te lezen op telefoons die je bezit. Het steunt op de optionele SMS-ontvangstpermissie van de app; als die op het apparaat is geweigerd, blijft de lijst leeg:

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

Servers

Gateway-locaties — de locaties van waaruit je proxy's worden bediend:

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

API-tokens

Toon, maak en trek API-tokens in. Het geheim van een net aangemaakt token wordt één keer getoond — bewaar het meteen; het is nooit meer opvraagbaar. Intrekken werkt direct:

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

Beperkte & alleen-lezen sleutels

Delegeer toegang zonder je account te delen. Geef subscription_id mee om een token tot één abonnement te beperken, en readonly: true om het tot GET-verzoeken te beperken. Een beperkt token bereikt alleen de eigen endpoints van dat abonnement (plus /me); een alleen-lezen token wordt bij elke schrijfactie geweigerd. Beide zijn beperkingen bovenop je account — een beperkte sleutel kan nooit bij de data van een ander 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)
Tip
Deze referentie blijft synchroon met de API. Voor een browser waar je doorheen kunt klikken — met je eigen token en live responses — open je de interactieve console, of lees je het ruwe OpenAPI-document.