mobileproxy.app

API

API справка

Пълна справка, endpoint по endpoint, за REST API на mobileproxy.app. Всеки път, поле и пример тук отразяват живия OpenAPI документ, от който е изграден API. Базов URL https://mobileproxy.app/api/v1.

Удостоверяване и базов URL

Всеки endpoint се намира под https://mobileproxy.app/api/v1 и изисква bearer токен. Създайте такъв в таблото под За разработчици → API токени или с POST /tokens, докато сте влезли. Тайната се показва само веднъж — запазете я. Изпращайте я при всяка заявка:

Authorization: Bearer mpx_live_…

Токените, започващи с mpx_live_, са токените на вашия акаунт. Endpoint-ите /device/* се извикват от самото Android приложение и се удостоверяват с токен на устройство за всеки телефон (mpxdev_…), издаден при сдвояването — обикновено никога не ги извиквате сами.

Пробвайте на живо
Интерактивната конзола ви позволява да поставите токен и да извикате всеки endpoint от браузъра, с тела на заявки и реални отговори. Суровата спецификация е на /api/v1/openapi.json.

Грешките са JSON с четимо съобщение и машинен код:

{ "error": "No such device.", "code": "not_found" }
ПолеТипОписание
401unauthorizedЛипсващ, неправилен или отменен токен.
403forbiddenТокенът е валиден, но няма разрешение.
404not_foundРесурсът не съществува в този акаунт.
502control_plane_unavailableШлюзът/контролната равнина е временно недостъпна — опитайте отново.

Акаунт

GET /me — кой съм аз? Връща акаунта плюс активни броячи на абонаменти и API токени.

curl https://mobileproxy.app/api/v1/me \
     -H "Authorization: Bearer mpx_live_…"

# → { "id": "u_8c31f0", "email": "you@example.com",
#     "created_at": "2026-06-28T14:02:11.000Z",
#     "subscriptions": 3, "api_tokens": 2,
#     "plan": "beta", "balance": "0.00" }

Абонаменти

Един абонамент (id sub_…) е трайният слот, който притежавате: неговото приятелско name, настройки и proxy остават дори когато телефонът под него се смени. Неговото device е телефонът, който в момента го захранва (или null, когато не е сдвоен), и е сменяем — смяната запазва всеки proxy endpoint.

Изведете абонаментите — всеки със сдвоеното си устройство, обединено с живия статус на шлюза (online = proxy тунелът е активен):

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

Създайте абонамент (несдвоен), след което сдвоете или сменете телефона. POST /subscriptions/{id}/pair връща PIN, валиден ~3 минути; въведен в Android приложението, той обвързва телефона. При слот, който вече има устройство, това е смяна (mode: "swap") — старият телефон се извежда от употреба и всеки proxy запазва своя host:port и идентификационни данни:

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

Вземете, обновете или отменете един абонамент. POST променя името, свободния текст description (макс. 200 знака, null го изчиства), предпочитанието wifi_split (поставя се в опашка към сдвоения телефон, прилага се при следващото му запитване ~25 с) или shared_speed_kbps — как скоростта на устройството се разпределя между неговите proxy. -1 (препоръчително) я споделя автоматично: контролната равнина измерва реалната скорост на устройството от живата пропускливост (~3 с преразпределяне), едновременно натоварените proxy се насочват към равни дялове от нея, а proxy, работещ самостоятелно, получава пълната скорост. Стойност > 0 разделя този фиксиран общ обем на устройството по същия начин. Стойностите speed_limit_kbps за отделен proxy се запазват, но не се налагат, докато някое от двете е включено; 0 изключва споделянето. DELETE разгражда неговото устройство и proxy, освобождава портовете на шлюза и изтрива историята на слота — необратимо:

# 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

Един proxy е един endpoint с един протокол (SOCKS5 или HTTP) на устройство, със собствено удостоверяване, whitelist на изходни IP, ограничение на скоростта и правила за домейни. Колко от тях може да обслужва едно устройство едновременно е право по плана (10 при Standard, 20 при Pro) — създайте по един за всеки клиент или инструмент и отменяйте всеки от тях, без да засягате останалите. Създаване над лимита на вашия план връща 409 proxy_limit_reached.

Proxy на едно устройство споделят неговия IP
Всеки proxy на едно устройство излиза през същия IP на оператора и се завърта заедно — създаването на втори proxy ви дава втора идентификационна двойка и политика, а не втори IP. За друг IP сдвоете друг телефон.

Създайте proxy — създава ново потребителско име/парола; паролата се връща в явен вид само веднъж, тук. Изберете protocol (socks5 или http) и по желание подайте traffic_limit_bytes, за да му зададете твърд лимит на трафика от самото начало:

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": "socks5://u04c770:k7Qp2mXe9wZ4@173.249.36.102:30000",
#     "endpoint_ipv6": "socks5://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": "…" }
Всеки proxy порт е dual-stack (IPv4 + IPv6)
Свързвайте се по всяко от двете семейства — endpoint е IPv4 URI, а endpoint_ipv6 е същият порт през IPv6 (v6 литералът е в квадратни скоби, съгласно синтаксиса на URL). Whitelist-ът на изходни IP приема IPv4 и IPv6 адреси и CIDR, а дестинациите също могат да бъдат IPv6: SOCKS5 CONNECT към IPv6 литерал или домейн само с AAAA излиза през IPv6 на оператора на телефона, когато SIM има такъв.

Редактирайте политиката на proxy — режим на удостоверяване, IP whitelist, ограничение на скоростта и правила за домейни, приложени на живо към шлюза (protocol е фиксиран — вместо това изтрийте и създайте отново):

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

Изведете proxy — на едно устройство или всеки proxy в целия акаунт:

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

Работещи proxy с изходните им IP — извеждането за целия акаунт носи текущия exit_ip на всеки proxy, живия статус на устройството и присъда working (устройството е online, без блок по фактуриране или ръчен блок, не е над лимита си на трафик; not_working_reason казва защо не). Филтрирайте с ?working=true, а добавете ?unique_ip=true, за да запазите по един proxy за всеки различен изходен IP — две SIM карти зад един и същ NAT на оператора също се маркират чрез duplicate_ip:

# Working proxies only, one per distinct exit IP — a paste-ready pool
curl "https://mobileproxy.app/api/v1/proxies?working=true&unique_ip=true" \
     -H "Authorization: Bearer mpx_live_…"
# → { "proxies": [ {
#       "endpoint": "socks5://user:pass@173.249.36.102:30012",
#       "exit_ip": "77.136.66.44", "device_status": "online",
#       "working": true, "not_working_reason": null,
#       "duplicate_ip": false, … }, … ] }

Отменете proxy — спира незабавно този конкретен слушател; всеки друг proxy на устройството продължава да работи:

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

Лимити на потребление и изтичане за отделен proxy

Дайте на всеки proxy лимит на потреблението — идеално, когато препродавате достъп и измервате всеки клиент спрямо определен обем данни. Задайте или го променете по всяко време (0 го изчиства), при създаване, чрез PATCH или с посочения endpoint по-долу. Когато bytes_used достигне лимита, proxy се блокира: запазва своя порт и идентификационни данни, но отказва всяка заявка, а over_limit става true. Вдигнете лимита над използваното количество — или го изчистете — и proxy възобновява работа незабавно, същият endpoint, без преконфигуриране. Извеждането на proxy също отчита за всеки от тях traffic_limit_bytes, живия bytes_used и 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 }

Изтичане по време — дайте на proxy момент expires_at (ISO 8601, в бъдещето) при създаване или чрез PATCH; null изчиства предстоящо изтичане. В този момент proxy се извежда от употреба — постоянно, за разлика от обратимия блок по лимит на потреблението. За да подновите клиент, създайте нов proxy (нов порт и идентификационни данни). Идеално за продажба на дневни/седмични пропуски:

# 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 configs (WireGuard)

Turn a SOCKS5 username/password proxy into a full-device WireGuard tunnel. Each proxy can carry one WireGuard config; creation requires the VPN add-on. Legacy OpenVPN rows remain downloadable and revocable, but new OpenVPN configs cannot be provisioned.

Файлът се показва само веднъж
The create response includes the full WireGuard file and its client private key. Store it securely; the same file can be downloaded later from the file endpoint.
# 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…", … }

# List a proxy's configs (metadata + usage vs the one-config 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 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_…"

Use the file with wg-quick up ./mpx-9f2c1a0b.conf or import it into a WireGuard client. Rotating the proxy also rotates the VPN exit.

IP ротация

Ротацията иска от оператора нов IP. Тя е за цялото устройство — всеки proxy на устройството получава новия IP — поставя се в опашка към телефона и се прилага в рамките на един цикъл на запитване (~25 с).

По възможност в мобилни мрежи
Дали повторното набиране ще даде нов адрес зависи от оператора — някои преназначават същия IP при бързи повторни набирания. Потвърдете от exit_ip на устройството или от /ip-history.

Завъртете сега — поставете в опашка еднократна ротация:

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

Ротация с уникален IP — подайте unique: true, за да продължи ротацията, докато изходящият IP е такъв, който не е виждан през последните window_min минути от IP историята на този абонамент (по подразбиране 60, макс. 1440), с повторни опити до max_attempts пъти (по подразбиране 3, макс. 5). Всеки опит струва пълен цикъл на ротация (~30–90 с); проверявайте GET варианта за напредъка. Операторите могат законно да преиздадат IP, така че exhausted е възможен честен резултат:

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

Групова ротация — завъртете всяко сдвоено устройство с едно извикване чрез all: true, или избран набор чрез subscription_ids (едното или другото е задължително, така че неправилна заявка никога не може случайно да завърти целия ви флот). Приема същите unique опции като endpoint-а за отделен абонамент, а всеки абонамент отчита собствения си резултат — един блокиран или несдвоен слот никога не проваля цялата партида. Изисква ролята оператор за всеки абонамент:

# Rotate every paired device at once (explicit opt-in)…
curl -X POST https://mobileproxy.app/api/v1/proxies/rotate \
     -H "Authorization: Bearer mpx_live_…" \
     -H "Content-Type: application/json" \
     -d '{ "all": true }'

# …or a chosen set, with the unique-IP options
curl -X POST https://mobileproxy.app/api/v1/proxies/rotate \
     -H "Authorization: Bearer mpx_live_…" \
     -H "Content-Type: application/json" \
     -d '{ "subscription_ids": ["sub_760c1fc8ddab"], "unique": true }'
# → { "results": [ { "subscription_id": "sub_760c1fc8ddab",
#       "status": "rotating", "command_id": "…", "request_id": "rr_18d2c4" } ],
#     "rotating": 1, "skipped": 0, … }

Ротационни връзки — URL с токен, който завърта IP на това устройство при извикване, без заглавка за удостоверяване (тайната е токенът). Поставете го в който и да е инструмент, поддържащ „rotation URL“. Извеждайте, създавайте и отменяйте:

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

Планирана (по време) ротация — задайте интервал за автоматична ротация в минути (0 я изключва; макс. 1440). Тя се запазва като rotation_interval_min на устройството и подава команда set_rotation_interval, която телефонът прилага при следващото си запитване, така че той сам набира повторно с тази честота:

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

Таймаут на самолетен режим — колко дълго телефонът задържа самолетен режим ВКЛ. по време на всяка смяна на IP (airplane_seconds, 3–60, по подразбиране 5). Някои оператори освобождават стария лизинг само след по-дълго задържане; вдигнете това, ако ротациите продължават да връщат същия IP. Отнася се за планирани, от таблото и 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 — резолверите, които телефонът използва за търсене на домейни през proxy (до 3 IP литерала; телефонът прилага първия и набира повторно тунела си). Празен списък възстановява 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" }

Наблюдение

История на изходящите IP — скорошни изходящи IP, докладвани от телефона, дедупликирани (нов ред само когато IP действително се е сменил). Надеждният начин да проверите, че ротацията е успяла:

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

Незадължителни параметри на заявката: from/to (ISO 8601) ограничават прозореца, limit ограничава записите (по подразбиране 50, макс. 500), а group=day вместо това връща брой смени за всеки ден — подайте tz като вашето UTC отместване в минути, така че дните да се групират във вашата часова зона. Точно това захранва календара с IP история в таблото:

# 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 предупреждения — сървърът наблюдава вашия флот (~на всеки 60 с) и отваря предупреждение, когато нещо изисква внимание: stale_ip, когато устройство е онлайн, но изходящият му IP не се е сменил за по-дълго от прага на абонамента (задайте stale_ip_alert_minutes на /rotation; 0 = изключено, 2–10080), и duplicate_ip, когато две от вашите устройства докладват същия изходящ IP (NAT на оператора може да даде на два SIM един адрес — завъртете единия, за да ги разделите). Предупрежденията се разрешават автоматично, когато условието изчезне; те се показват и в звънеца за предупреждения в таблото:

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

Трафик за устройство — байтове, преброени на шлюза, разделени по proxy. Удобно за фактуриране на клиенти, на които препродавате:

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

Дневна разбивка на трафика — изпратени/получени байтове за всеки ден, от проби с минутна разделителна способност, съхранявани на уеб слоя, така че серията оцелява при смени на устройства и извеждане на proxy. data_since отбелязва най-старата проба — дните преди нея нямат данни, което не е същото като нулев трафик. Подайте tz (вашето UTC отместване в минути), така че дните да се групират във вашата часова зона; прозорци до 92 дни:

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

Дневна наличност — секунди на работа/престой за всеки ден, сгънати от записа на heartbeat на устройството (обединен през смени на устройства). Той измерва активността на heartbeat на устройството (честота ~25 с, праг на прекъсване ~90 с), а не използваемостта на тунела от край до край. current е състоянието в момента; uptime_pct покрива наблюдаваната част от всеки ден:

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

Потребление за целия акаунт — обобщение по всички устройства:

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 — входящи съобщения на SIM на този телефон, най-новите първо. Полезно за четене на еднократни кодове за проверка (OTP) на телефони, които притежавате. Разчита на незадължителното разрешение на приложението за получаване на SMS; ако то е било отказано на устройството, списъкът остава празен:

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

Сървъри

Локации на шлюзове — локациите, от които се обслужват вашите 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" } ] }

API токени

Извеждайте, създавайте и отменяйте API токени. Тайната на новосъздаден токен се показва веднъж — запазете я веднага; тя никога не може да бъде извлечена отново. Отмяната влиза в сила незабавно:

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

Обхватни ключове и ключове само за четене

Делегирайте достъп, без да споделяте акаунта си. Подайте subscription_id, за да ограничите обхвата на токен до един абонамент, и readonly: true, за да го ограничите до GET заявки. Обхватен токен може да достигне само собствените endpoint-и на този абонамент (плюс /me); токен само за четене се отказва при всяко записване. И двете са ограничения, наслоени върху вашия акаунт — обхватен ключ никога не може да достигне данните на друг акаунт.

# 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)
Съвет
Тази справка остава в синхрон с API. За браузър, през който можете да кликате — с ваш собствен токен и живи отговори — отворете интерактивната конзола или прочетете суровия OpenAPI документ.