API
API-reference
En komplet reference, endpoint for endpoint, til REST API'et i mobileproxy.app. Hver sti, hvert felt og hvert eksempel her afspejler det live OpenAPI-dokument, som API'et er bygget af. Base-URL https://mobileproxy.app/api/v1.
Godkendelse og base-URL
Alle endpoints ligger under https://mobileproxy.app/api/v1 og kræver et bearer-token. Opret et i dashboardet under For udviklere → API-tokens, eller med POST /tokens mens du er logget ind. Hemmeligheden vises kun én gang — gem den. Send den med hver forespørgsel:
Authorization: Bearer mpx_live_…Tokens, der starter med mpx_live_, er dine kontotokens. /device/*-endpoints kaldes af selve Android-appen og godkender med et enhedstoken pr. telefon (mpxdev_…), der udstedes ved parring — dem kalder du normalt aldrig selv.
Fejl er JSON med en læsbar besked og en maskinkode:
{ "error": "No such device.", "code": "not_found" }| Felt | Type | Beskrivelse |
|---|---|---|
| 401 | unauthorized | Token mangler, er ugyldigt eller tilbagekaldt. |
| 403 | forbidden | Token er gyldigt, men ikke tilladt. |
| 404 | not_found | Ressourcen findes ikke på denne konto. |
| 502 | control_plane_unavailable | Gateway/kontrolplan kortvarigt utilgængelig — prøv igen. |
Konto
GET /me — hvem er jeg? Returnerer kontoen samt live-optællinger af abonnementer og 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" }Abonnementer
Et abonnement (id sub_…) er den varige plads, du ejer: dens venlige name, indstillinger og proxyer består, selv når telefonen under den skiftes ud. Dens device er den telefon, der driver den lige nu (eller null, når den ikke er parret), og den er udskiftelig — et skift bevarer hvert proxy-endpoint.
Vis abonnementer — hvert med sin parrede enhed flettet med live-gatewaystatus (online = proxy-tunnelen er oppe):
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": "…" } } ] }Opret et abonnement (uparret), og derefter par eller skift telefonen. POST /subscriptions/{id}/pair returnerer en PIN, der er gyldig i ~3 minutter; indtastet i Android-appen binder den telefonen. På en plads, der allerede har en enhed, er dette et skift (mode: "swap") — den gamle telefon udfases, og hver proxy bevarer sin host:port og loginoplysninger:
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": "…" }, … }Hent, opdatér eller annullér ét abonnement. POST ændrer navnet, en fri description (maks. 200 tegn, null rydder den), wifi_split-præferencen (sat i kø til den parrede telefon, anvendt ved dens næste poll ~25 s) eller shared_speed_kbps — hvordan enhedens hastighed fordeles mellem dens proxyer. -1 (anbefalet) deler den automatisk: kontrolplanet måler enhedens reelle hastighed ud fra live-gennemløb (~3 s rebalancering), proxyer, der er travle samtidig, konvergerer mod lige store andele af den, og en proxy, der arbejder alene, får fuld hastighed. En værdi > 0 opdeler i stedet denne faste enhedstotal på samme måde. Per-proxy-værdier for speed_limit_kbps bevares, men håndhæves ikke, mens den ene af dem er slået til; 0 slår deling fra. DELETE nedbryder dens enhed og proxyer, frigiver gateway-portene og sletter pladsens historik — uigenkaldeligt:
# 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" }Proxyer
En proxy er ét enkelt-protokol-endpoint (SOCKS5 eller HTTP) på en enhed, med sin egen godkendelse, kilde-IP-hvidliste, hastighedsgrænse og domæneregler. Hvor mange en enhed kan betjene på én gang, er en plan-rettighed (10 på Standard, 20 på Pro) — udsted en pr. kunde eller værktøj, og tilbagekald en enkelt uden at røre resten. En oprettelse ud over din plans loft returnerer 409 proxy_limit_reached.
Opret en proxy — udsteder et nyt brugernavn/adgangskode; adgangskoden returneres i klartekst denne ene gang, her. Vælg protocol (socks5 eller http), og send eventuelt traffic_limit_bytes for at give den et hårdt trafikloft fra start:
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 er IPv4-URI'en, endpoint_ipv6 den samme port over IPv6 (v6-literalen står i kantede parenteser, jf. URL-syntaks). Kilde-IP-hvidlisten accepterer IPv4- og IPv6-adresser og CIDR'er, og destinationer må også være IPv6: en SOCKS5 CONNECT til en IPv6-literal eller et AAAA-kun-domæne går ud over telefonens mobil-IPv6, når SIM'et har en.Redigér en proxys politik — godkendelsestilstand, IP-hvidliste, hastighedsgrænse og domæneregler, anvendt live på gatewayen (protocol er fast — slet og genopret i stedet):
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"] }'Vis proxyer — på én enhed eller hver proxy på tværs af hele kontoen:
# 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… }, … ] }Tilbagekald en proxy — stopper den ene lytter med det samme; hver anden proxy på enheden fungerer videre:
curl -X DELETE \
https://mobileproxy.app/api/v1/subscriptions/SUBSCRIPTION_ID/proxies/PROXY_ID \
-H "Authorization: Bearer mpx_live_…"
# → { "deleted": true, "id": "acc_5f734b9270e8" }Forbrugsgrænser og udløb pr. proxy
Giv en hvilken som helst proxy en forbrugsgrænse — ideelt, når du videresælger adgang og måler hver kunde efter en datakvote. Sæt eller ændr den når som helst (0 rydder den), ved oprettelse, via PATCH eller med det dedikerede endpoint nedenfor. Når bytes_used når loftet, bliver proxyen blokeret: den beholder sin port og loginoplysninger, men afviser hver forespørgsel, og over_limit bliver true. Hæv grænsen over det forbrugte beløb — eller ryd den — så genoptager proxyen med det samme, samme endpoint, ingen ny konfiguration. En liste over proxyer rapporterer også hver enkelts traffic_limit_bytes, live-bytes_used og 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 }Tidsbaseret udløb — giv en proxy et expires_at-tidspunkt (ISO 8601, i fremtiden) ved oprettelse eller via PATCH; null rydder et afventende udløb. På det tidspunkt udfases proxyen — permanent, i modsætning til den reversible blokering fra forbrugsgrænsen. For at forny en kunde skal du oprette en ny proxy (ny port og nye loginoplysninger). Perfekt til at sælge dags-/ugepas:
# 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 removeVPN-konfigurationer (WireGuard og OpenVPN)
Gør enhver proxy til en VPN for hele enheden. Hver konfiguration er en WireGuard- (.conf) eller OpenVPN-fil (.ovpn), der tunnelerer en hel enhed — telefon, laptop, router — gennem den proxys mobil-IP. En proxy kan have 1 af hver slags — én WireGuard- og én OpenVPN-konfiguration. Konfigurationer kræver en SOCKS5-proxy med brugernavn/adgangskode, så gatewayen kan godkende sig over for den. Oprettelse af en konfiguration kræver VPN-tilføjelsen på enhedens ordre (403 vpn_addon_required uden den) — eksisterende konfigurationer forbliver på listen, kan downloades og tilbagekaldes.
config_text — den fulde fil med klientens private nøgle/certifikat. Den kan ikke genudledes; gem den, når du opretter den. Du kan gendownloade præcis den samme fil når som helst fra /file-endpointet, men en tabt fil kan kun erstattes ved at tilbagekalde og oprette en ny konfiguration.# 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_…"Brug filen som sædvanligt: wg-quick up ./mpx-9f2c1a0b.conf til WireGuard, eller importér .ovpn-filen i en hvilken som helst OpenVPN-klient. Al enhedens trafik går derefter ud gennem telefonens mobil-IP, og rotering af den proxys IP roterer også VPN'ens eksit.
IP-rotation
Rotation beder mobiloperatøren om en ny IP. Det er pr. enhed — hver proxy på enheden får den nye IP — sat i kø til telefonen og anvendt inden for én poll-cyklus (~25 s).
exit_ip på enheden eller fra /ip-history.Rotér nu — sæt en engangsrotation i kø:
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; …" }Unik-IP-rotation — send unique: true for at blive ved med at rotere, indtil eksit-IP'en er en, der ikke er set i de sidste window_min minutter af dette abonnements IP-historik (standard 60, maks. 1440), og prøv op til max_attempts gange (standard 3, maks. 5). Hvert forsøg koster en fuld rotationscyklus (~30–90 s); poll GET-varianten for fremgang. Mobiloperatører kan legitimt genudstede en IP, så exhausted er et muligt og ærligt udfald:
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", … }Rotationslinks — en URL med token, der roterer denne enheds IP, når den hentes, uden godkendelses-header (hemmeligheden er tokenet). Indsæt den i et hvilket som helst værktøj, der understøtter en "rotation-URL". Vis, opret og tilbagekald dem:
# 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" }Planlagt (tidsindstillet) rotation — sæt et interval for automatisk rotation i minutter (0 slår det fra; maks. 1440). Det gemmes som rotation_interval_min på enheden og sender en set_rotation_interval-kommando, som telefonen anvender ved sin næste poll, så den genopkobler i den kadence af sig selv:
# 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" }Flytilstands-timeout — hvor længe telefonen holder flytilstand slået TIL under hvert IP-skift (airplane_seconds, 3–60, standard 5). Nogle mobiloperatører frigiver først det gamle lease efter en længere pause; hæv denne, hvis rotationer bliver ved med at give den samme IP. Gælder for planlagte, dashboard- og API-rotationer på samme måde:
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" }Brugerdefineret DNS — de resolvere, telefonen bruger til proxied domæneopslag (op til 3 IP-literaler; telefonen anvender den første og genopkobler sin tunnel). En tom liste gendanner mobiloperatørens standard-DNS:
# 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" }Overvågning
Eksit-IP-historik — nylige eksit-IP'er rapporteret af telefonen, dedupliseret (en ny række kun, når IP'en faktisk ændrede sig). Den pålidelige måde at bekræfte, at en rotation lykkedes:
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": "…" }, … ] }Valgfrie query-parametre: from/to (ISO 8601) afgrænser vinduet, limit sætter loft over antal poster (standard 50, maks. 500), og group=day returnerer i stedet antal ændringer pr. dag — send tz som din UTC-offset i minutter, så dagene grupperes i din tidszone. Det er dette, der driver dashboardets IP-historik-kalender:
# 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-advarsler — serveren holder øje med din flåde (~hvert 60. s) og åbner en advarsel, når noget kræver opmærksomhed: stale_ip, når en enhed er online, men dens eksit-IP ikke har ændret sig i længere end abonnementets grænse (sæt stale_ip_alert_minutes på /rotation; 0 = fra, 2–10080), og duplicate_ip, når to af dine enheder rapporterer den samme eksit-IP (mobiloperatørens NAT kan give to SIM'er én adresse — rotér den ene for at adskille dem). Advarsler løser sig automatisk, når betingelsen forsvinder; de vises også i dashboardets advarselsklokke:
# 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 }Trafik for en enhed — bytes talt ved gatewayen, opdelt pr. proxy. Praktisk til at fakturere kunder, du videresælger til:
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 } ] }Daglig trafikopdeling — sendte/modtagne bytes pr. dag, ud fra minut-opløste stikprøver gemt i weblaget, så serien overlever enhedsskift og udfasning af proxyer. data_since markerer den ældste stikprøve — dage før den har ingen data, hvilket ikke er det samme som nul trafik. Send tz (din UTC-offset i minutter), så dagene grupperes i din tidszone; vinduer op til 92 dage:
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 } }Daglig oppetid — op/nede-sekunder pr. dag foldet ud fra enhedens heartbeat-log (samlet på tværs af enhedsskift). Den måler enhedens heartbeat-livlighed (~25 s kadence, ~90 s gab-grænse), ikke ende-til-ende-brugbarheden af tunnelen. current er tilstanden lige nu; uptime_pct dækker den observerede del af hver 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 } ] }Forbrug for hele kontoen — en samlet oversigt på tværs af hver enhed:
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
Modtagne SMS'er — indgående beskeder på denne telefons SIM, nyeste først. Nyttigt til at læse engangsverifikationskoder (OTP'er) på telefoner, du ejer. Det afhænger af appens valgfri tilladelse til at modtage SMS; hvis den blev afvist på enheden, forbliver listen tom:
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
Gateway-lokationer — de lokationer, dine proxyer betjenes fra:
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
Vis, opret og tilbagekald API-tokens. En nyligt oprettet tokens hemmelighed vises én gang — gem den med det samme; den kan aldrig hentes igen. Tilbagekaldelse træder i kraft med det samme:
# 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" }Afgrænsede og skrivebeskyttede nøgler
Delegér adgang uden at dele din konto. Send subscription_id for at afgrænse et token til ét enkelt abonnement, og readonly: true for at begrænse det til GET-forespørgsler. Et afgrænset token kan kun nå det abonnements egne endpoints (plus /me); et skrivebeskyttet token afvises på enhver skrivning. Begge er begrænsninger lagt oven på din konto — en afgrænset nøgle kan aldrig nå en anden kontos data.
# 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)