HideMyAndroid Headless API

Управляйте HideMyAndroid полностью из ADB или любого инструмента автоматизации — создавайте, настраивайте и активируйте профили, не открывая приложение. Premium, приложение 1.2.8+.

Последнее обновление: June 2026

Требования

Headless API позволяет управлять HideMyAndroid полностью через ADB или любой инструмент автоматизации — без использования интерфейса приложения. Это функция уровня Premium.

  • Аккаунт Premium — Headless API доступен только для Premium-пользователей.
  • Версия приложения 1.2.8 или новее. Всё, что добавлено позже, — это дополнительные поля, поэтому 1.2.8 по-прежнему работает, но новые поля требуют более свежей сборки: hook_spoof_uptime1.3.4+, geo и profile.duplicate1.4.5+. Старая сборка игнорирует незнакомое ей поле и всё равно отвечает ok=true, поэтому если настройка будто бы ничего не делает, проверьте текущую version через status.
  • Root + LSPosed — стандартная конфигурация, необходимая для работы HideMyAndroid. Смотрите руководство по установке.
  • ADB, подключённый к устройству (adb devices должно показывать его в списке).
  • Интернет на устройстве — требуется только при включении прокси (соединение проверяется в реальном времени).

⚠️ Разрешение VPN нужно только для профилей с прокси. Headless не может вызвать системный диалог согласия на VPN, поэтому выдайте его один раз на экране Headless API в приложении. Без него активация профиля с прокси всё равно активирует профиль, но прокси не подключится, и вызов вернёт INTERNAL именно с таким сообщением.

Аутентификация

Откройте Настройки → Разработчику → Headless API в приложении и включите параметр Включить. Ключ будет сгенерирован автоматически — нажмите Скопировать. Каждый запрос передаёт этот ключ в параметре token.

Держите ключ в тайне — любой, у кого есть ключ и доступ через ADB, сможет управлять вашими профилями. Повторная генерация создаёт новый ключ (старый перестаёт работать); выход из аккаунта удаляет его.

В данном справочнике замените <your_access_token> своим ключом, а <profile_id> — идентификатором, возвращённым командой profile.create.

Отправка запросов

Два транспорта — выбор зависит от того, содержит ли значение двоеточие :

Транспорт Использовать для Команда
content call Чтение и значения без : (name, gmails, имена пакетов)adb shell content call
am broadcast JSON-объекты (hookFlags, proxy, deviceMock, sim) — они содержат :adb shell am broadcast

content call разбивает каждый параметр --extra по двоеточию, поэтому не может передавать JSON — именно поэтому JSON-значения отправляются через broadcast.

Broadcast-форма есть всего у трёх методов: HEADLESS_UPDATE (profile.update), HEADLESS_SET_ACTIVE и HEADLESS_DEACTIVATE. Остальные девять — status, все операции чтения, profile.create, profile.duplicate, profile.delete и вызовы для целевых приложений — работают только через content call. Никакого HEADLESS_CREATE искать не нужно.

Broadcast принимает не только JSON. HEADLESS_UPDATE передаёт ровно семь extra-параметров — name, hookFlags, proxy, geo, deviceMock, sim, gmails — поэтому name и gmails проходят по любому из двух транспортов. Таблица выше говорит о том, что удобнее, а не о том, что возможно. Любой extra, которого нет в этом списке из семи, отбрасывается без ошибки.

Ответы. Успех обозначается ok=true (content call) или result=0 (broadcast); при ошибке добавляются поля error_code и error_message. Смотрите раздел Коды ошибок. Каждый метод также принимает параметр token. Нажмите на любую операцию ниже, чтобы раскрыть её параметры, запрос и ответ.

Статус

READ status Проверить готовность API content call

Parameters

No parameters.

Request

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method status --extra token:s:<your_access_token>

Response ok=true

Bundle[{data={"premium":true,"featureEnabled":true,"freshnessOk":true,"activeProfileId":"a1b2c3d4-...","version":"1.4.5"}, ok=true}]

Поля: premium, featureEnabled, freshnessOk, activeProfileId (или null), version. freshnessOk равно true, если приложение прошло онлайн-проверку лицензии за последние 24 часа. Сама проверка выполняется офлайн — headless-запрос никогда не обращается к сети, он только читает сохранённый результат, и premium тоже читается офлайн. Открывайте приложение хотя бы раз в сутки, чтобы freshnessOk оставалось true.

💡 statusединственный метод, который продолжает отвечать при истёкшей или несвежей лицензии: все остальные вызовы вернут LICENSE_EXPIRED или LICENSE_STALE и больше ничего. Именно так и различают эти два случая, когда запрос отклонён: посмотрите premium, чтобы понять, действительно ли закончился Premium, и freshnessOk, чтобы понять, достаточно ли просто один раз открыть приложение. При этом status по-прежнему закрыт проверками FEATURE_DISABLED и UNAUTHORIZED, так что выключенный API или неверный токен здесь выглядят так же, как везде.

Профили

READ profile.list Получить список всех профилей content call

Parameters

No parameters.

Request

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.list --extra token:s:<your_access_token>

Response ok=true

Bundle[{data=[{"id":"a1b2...","name":"Demo","isActive":true,"createdAt":1717000000000,"updatedAt":1717000500000}], ok=true}]
READ profile.get Получить полные данные одного профиля content call

Parameters

Name Type Required Description
id string required Идентификатор профиля.

Request

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.get --extra token:s:<your_access_token> --extra id:s:<profile_id>

Response ok=true

Bundle[{data={"id":"a1b2...","name":"Demo","isActive":false,"hookFlags":{"hook_wifi":true,...},"proxy":{"enabled":false,...},"geo":{"source":"PROXY",...},"deviceMock":{"enabled":false,...},"sim":{"enabled":false,"simCards":[]},"gmails":[],"targetApps":["com.whatsapp"]}, ok=true}]
CREATE profile.create Создать профиль (возвращает его идентификатор) content call

Parameters

Name Type Required Description
name string required Название профиля.

Request

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.create --extra token:s:<your_access_token> --extra name:s:Demo

Response ok=true

Bundle[{data={"id":"a1b2c3d4-..."}, ok=true}]

Скопируйте этот идентификатор как <profile_id> для последующих вызовов.

CREATE profile.duplicate Клонировать профиль с новой личностью content call

Parameters

Name Type Required Description
id string required Идентификатор профиля, который копируем.

Request

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.duplicate --extra token:s:<your_access_token> --extra id:s:<profile_id>

Response ok=true

Bundle[{data={"id":"e5f6a7b8-...","name":"Brave Falcon 42"}, ok=true}]

Возвращаются и новый идентификатор, и сгенерированное имя — profile.create отдаёт только id, так что не ждите, что эти два ответа совпадут.

⚠️ Имя генерируется автоматически и не может быть задано в самом вызове. Если нужно своё, сразу после переименуйте копию через profile.update.

Что переносится в копию

Клонирует профиль так же, как пункт Дублировать в приложении — требуется приложение 1.4.5+. Настройки переносятся, но каждое идентифицирующее значение генерируется заново, поэтому у копии собственный отпечаток, а не близнец оригинала. Broadcast-формы нет: широковещательный вызов «отправил и забыл» не смог бы вернуть вам новый идентификатор, ради которого всё и затевается.

Что В копии
Целевые приложения, hookFlags, proxy (вместе с проверенной геолокацией), geo, скрытые пакеты Переносятся без изменений
Каждый идентификатор устройства — как на уровне профиля, так и отдельно для каждого приложения в профиле Выпускаются заново, поэтому у копии собственный отпечаток, а не близнец оригинала
deviceMock (если включён) Переключается на другой шаблон устройства
sim Та же страна, новые номера
Пакеты резервных копий Не копируются — резервные копии привязаны к ключу {package}-{profileId}, поэтому копия не владеет ни одной и начинает с нуля
Виртуальные аккаунты Gmail Один новый адрес, если у исходного профиля был включён hook_virtual_accounts; иначе пустой список
Имя Генерируется и гарантированно уникально, в виде Brave Falcon 42 — выбрать его нельзя, поэтому оно и возвращается вам
Состояние активности Всегда isActive: false — дублирование никогда не активирует профиль

Чтобы получить собственное имя, сначала продублируйте, а затем переименуйте вторым вызовом:

bash
# 1. duplicate — the new id and its generated name come back together
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.duplicate --extra token:s:<your_access_token> --extra id:s:<source_profile_id>

# 2. rename the copy — profile.duplicate never takes a name of your own
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.update --extra token:s:<your_access_token> --extra id:s:<new_profile_id> --extra name:s:"My Profile"
UPDATE profile.update Изменить настройки профиля content call / broadcast

Parameters

Name Type Required Description
id string required Идентификатор профиля.
name string optional Новое название профиля (content call).
gmails string[] optional Виртуальные аккаунты @gmail.com (content call).
hookFlags object optional Переключатели спуфинга вкл/выкл (broadcast).
proxy object optional Конфигурация прокси (broadcast).
geo object optional Источник геолокации — прокси или собственный (broadcast). Требуется приложение 1.4.5+.
deviceMock object optional Подмена модели устройства (broadcast).
sim object optional Подмена SIM / оператора (broadcast).

Request

content call — обычные значения

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.update --extra token:s:<your_access_token> --extra id:s:<profile_id> --extra name:s:"My Profile"

broadcast — JSON-конфигурации

bash
adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_UPDATE -p com.wowsoftware.hidemyandroid -e token <your_access_token> -e id <profile_id> -e hookFlags '{"hook_wifi":false,"hook_nearby_bluetooth":false}'

Response ok=true

Оба варианта возвращают полный обновлённый профиль. Все JSON-поля описаны в разделе «Конфигурация».

⚠️ hookFlags заменяет весь набор — любой флаг, который вы не укажете, вернётся к своему значению по умолчанию: ВКЛ для всех флагов, кроме hook_spoof_uptime, у которого это ВЫКЛ. То есть обновление без hook_spoof_uptime молча выключает его обратно. Чтобы изменить несколько флагов и сохранить остальные, сначала выполните profile.get, отредактируйте полную карту, затем отправьте её обратно целиком.

DELETE profile.delete Удалить профиль без возможности восстановления content call

Parameters

Name Type Required Description
id string required Идентификатор профиля.

Request

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.delete --extra token:s:<your_access_token> --extra id:s:<profile_id>

Response ok=true

Bundle[{data={}, ok=true}]

Активация

Профиль начинает подменять данные только после активации, и активным всегда бывает лишь один профиль. profile.setActive переключает активный профиль — тот, что был активен до этого, деактивируется за вас, поэтому вызывать profile.deactivate заранее не нужно.

⚠️ Активация стирает данные целевых приложений. profile.setActive не просто перезапускает их: он принудительно останавливает каждое целевое приложение и стирает его данные, чтобы оно поднялось чистым и действительно приняло новую личность. Это сделано намеренно — но это значит, что всё, что было внутри этих приложений, пропадёт, включая выполненные входы в аккаунты, В приложении это же действие сначала просит подтверждения и напоминает про функцию резервного копирования; headless-вызов не показывает никакого диалога и выполняется сразу, так что это предупреждение — единственное, которое вы получите.

ACTION profile.setActive Активировать профиль — начать спуфинг content call / broadcast

Parameters

Name Type Required Description
id string required Идентификатор профиля. В broadcast принимается как id, так и profile_id.

Request

content call — рекомендуется

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.setActive --extra token:s:<your_access_token> --extra id:s:<profile_id>

broadcast — для автоматизации

bash
adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_SET_ACTIVE -p com.wowsoftware.hidemyandroid -e token <your_access_token> -e id <profile_id>

Response ok=true

Bundle[{data={"id":"a1b2...","isActive":true}, ok=true}]
ACTION profile.deactivate Деактивировать активный профиль — остановить спуфинг content call / broadcast

Parameters

No parameters.

Request

content call — рекомендуется

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.deactivate --extra token:s:<your_access_token>

broadcast — для автоматизации

bash
adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_DEACTIVATE -p com.wowsoftware.hidemyandroid -e token <your_access_token>

Response ok=true

Bundle[{data={}, ok=true}]

Идентификатор не нужен — деактивируется любой активный в данный момент профиль.

content call — предпочтительная форма: он синхронный и печатает возвращённый Bundle. Широковещательные HEADLESS_SET_ACTIVE и HEADLESS_DEACTIVATE делают ту же работу для инструментов автоматизации вроде Tasker. Они отвечают как ordered broadcast, который всегда несёт данные обратно: при успехе am broadcast печатает result=0 и JSON результата в data="…", при ошибке — result=1 и data="{"error_code":…,"error_message":…}". То есть это не совсем «отправил и забыл»: разберите data= — и получите тот же ответ, что дал бы content call. HEADLESS_SET_ACTIVE принимает идентификатор профиля и как -e id, и как -e profile_id; HEADLESS_DEACTIVATE вообще не требует идентификатора. Как всегда, добавляйте -p com.wowsoftware.hidemyandroid.

Целевые приложения

Целевые приложения — это приложения, для которых профиль выполняет спуфинг.

READ profile.getApps Получить список целевых приложений профиля content call

Parameters

Name Type Required Description
id string required Идентификатор профиля.

Request

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.getApps --extra token:s:<your_access_token> --extra id:s:<profile_id>

Response ok=true

Bundle[{data=[{"packageName":"com.whatsapp"}], ok=true}]
CREATE profile.addApp Добавить целевое приложение в профиль content call

Parameters

Name Type Required Description
id string required Идентификатор профиля.
packageName string required Имя пакета приложения.

Request

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.addApp --extra token:s:<your_access_token> --extra id:s:<profile_id> --extra packageName:s:com.whatsapp

Response ok=true · updated app list

Bundle[{data=[{"packageName":"com.whatsapp"}], ok=true}]

⚠️ Повторное добавление того же пакета возвращает BAD_REQUEST.

DELETE profile.removeApp Удалить целевое приложение из профиля content call

Parameters

Name Type Required Description
id string required Идентификатор профиля.
packageName string required Приложение для удаления.

Request

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.removeApp --extra token:s:<your_access_token> --extra id:s:<profile_id> --extra packageName:s:com.whatsapp

Response ok=true · updated app list

Bundle[{data=[], ok=true}]

⚠️ Удаление пакета, которого нет в профиле, всё равно завершается успехом и ничего не меняет — это не ошибка. Это намеренно отличается от addApp, где добавление дубликата возвращает BAD_REQUEST.

Конфигурация

Это значения, которые передаются через profile.update. Значения по умолчанию при создании профиля:

Настройка По умолчанию Чтобы использовать…
hookFlags (all 21) ✅ ON — кроме hook_spoof_uptime ❌ OFF Уже включено. Отправьте false только для тех флагов, которые нужно отключить, — и true для hook_spoof_uptime, единственного флага, выключенного изначально.
proxy ❌ OFF Включите "enabled":true
geo PROXY Отправьте "source":"CUSTOM" с координатами, countryCode и timezone, чтобы задать местоположение без прокси
deviceMock ❌ OFF Включите "enabled":true
sim ❌ OFF Включите "enabled":true
gmails empty Отправьте адреса (виртуальные аккаунты включены по умолчанию)

⚠️ Конфигурация с enabled:false сохраняется, но не применяется — значения сохранены, чтобы вы могли включить их позже, но спуфинг не выполняется, пока не установлено enabled:true. Исключение — geo: у него нет переключателя enabled. Флаги hook_geo_* срабатывают всякий раз, когда geo даёт пригодное местоположение — либо из source: CUSTOM, либо от прокси с enabled:true, прошедшего проверку в реальном времени.

hookFlags

По умолчанию: ВКЛ для всех флагов, кроме hook_spoof_uptime, который ВЫКЛ. Карта вида "flag": true|false. При обновлении весь набор заменяется, но только тот набор, который вы действительно отправили: обновление без extra-параметра hookFlags не трогает флаги вообще. Внутри отправленного набора каждый пропущенный флаг возвращается к своему значению по умолчанию, поэтому остальные 20 снова становятся ВКЛ, а hook_spoof_uptime снова ВЫКЛ, даже если вы его включали. Чтобы изменить несколько флагов и сохранить остальные, сначала выполните profile.get, отредактируйте полную карту, затем отправьте её обратно целиком.

Флаг Что делает
hook_hide_dev_opts Скрывает параметры разработчика
hook_hide_vpn Скрывает VPN
hook_hide_airplane_mode Скрывает режим полёта
hook_hide_proxy Скрывает системную настройку прокси
hook_hide_root Скрывает root
hook_hide_lsposed Скрывает LSPosed
hook_spoof_installer Подменяет источник установки
hook_package_info Подменяет информацию о пакете / подписи
hook_lan_scan_block Блокирует сканирование локальной сети
hook_identifiers_partly Подменяет базовые идентификаторы устройства
hook_identifiers_fully Подменяет полный набор идентификаторов устройства — включает всё, что покрывает hook_identifiers_partly
hook_wifi Подменяет данные подключённой сети Wi-Fi
hook_nearby_wifi Подменяет результаты сканирования ближайших сетей Wi-Fi
hook_nearby_bluetooth Подменяет список ближайших устройств Bluetooth
hook_realistic_sensor Использует реалистичные данные сенсоров
hook_sensor_accelerometer Подменяет акселерометр (требует hook_realistic_sensor)
hook_spoof_uptime Подменяет время работы устройства — устройство выглядит так, будто работает дольше. Premium, экспериментальный. По умолчанию ВЫКЛ — единственный такой флаг. Требуется приложение 1.3.4+.
hook_virtual_accounts Включает виртуальные аккаунты Google (gmails требует, чтобы это было ВКЛ)
hook_geo_gps Подменяет GPS-координаты (требуется geo — от прокси или собственный)
hook_geo_locale Подменяет язык/регион (требуется geo — от прокси или собственный)
hook_geo_timezone Подменяет часовой пояс (требуется geo — от прокси или собственный)

proxy

По умолчанию: ВЫКЛ. При enabled:true приложение устанавливает реальное соединение через прокси, получает его геолокацию и заполняет countryCode/lat/lon/timezone. Проверка в реальном времени занимает до ~8 с; прокси, не прошедший проверку, возвращает PROXY_INVALID и не сохраняется. Эти четыре поля — выходные: приложение записывает их само, поэтому всё, что вы в них отправите, будет перезаписано. Чтобы задать местоположение вручную, используйте geo с source: CUSTOM — для этого прокси не нужен вовсе. profile.get возвращает прокси вместе с этими четырьмя полями, но никогда не отдаёт username и password.

Поле Тип По умолчанию Значение / ограничения
host string "" IP-адрес или имя хоста прокси
port int 0 Порт — 165535, проверяется только при включении прокси
protocol string HTTP HTTP, SOCKS4 или SOCKS5
username string "" Аутентификация (необязательно) — никогда не возвращается в profile.get
password string "" Аутентификация (необязательно) — никогда не возвращается в profile.get
countryCode string "" Выходное — 2 буквы страны, заполняется по результатам проверки
lat double 0 Выходное — заполняется по результатам проверки
lon double 0 Выходное — заполняется по результатам проверки
timezone string "" Выходное — имя IANA, заполняется по результатам проверки
bash
adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_UPDATE -p com.wowsoftware.hidemyandroid -e token <your_access_token> -e id <profile_id> -e proxy '{"enabled":true,"host":"10.0.0.1","port":1080,"protocol":"SOCKS5"}'

geo

По умолчанию: {"source":"PROXY"}. Требуется приложение 1.4.5+. Отсюда профиль берёт своё местоположение, и источника два — выберите один через source. PROXY использует местоположение, считанное во время проверки прокси в реальном времени. CUSTOM позволяет задать координаты, часовой пояс и регион самостоятельно, вообще без прокси — можно поместить профиль в Токио, а трафик пустить куда угодно или никуда. Три флага hook_geo_* затем включают каждую часть по отдельности: GPS, регион + язык и часовой пояс.

⚠️ Обратите внимание на имена полей: в geo это latitude/longitude, а в proxy выше — короткие lat/lon. Это два разных объекта, а не синонимы: короткие имена внутри geo просто игнорируются.

Поле Тип По умолчанию Значение / ограничения
source string PROXY Обязательное. Ровно PROXY или CUSTOM — пропуск или опечатка возвращают BAD_REQUEST, значение никогда не трактуется молча как PROXY
latitude double 0 Обязательное для CUSTOM — от -90 до 90; 0/0 считается незаданным
longitude double 0 Обязательное для CUSTOM — от -180 до 180; 0/0 считается незаданным
countryCode string "" Обязательное для CUSTOM — 2 буквы, например JP. На входе регистр не важен, на выходе всегда в верхнем регистре
timezone string "" Обязательное для CUSTOM — имя IANA, например Asia/Tokyo. Проверяется только на непустоту — см. предупреждение ниже
language string "" Необязательное — 2 буквы по ISO 639-1, например ja, а не полный тег вида ja-JP. Если оставить пустым, выводится из countryCode; хранится всегда в нижнем регистре. Задать явно может только CUSTOM, на пути PROXY значение всегда выводится автоматически

⚠️ source: CUSTOM должен приходить полным: пара координат, отличная от 0/0 и попадающая в диапазон, двухбуквенный countryCode и timezone. Пропустите хоть одно — и запрос вернёт BAD_REQUEST: отката к прокси не будет. Приложение никогда не выполняет геокодирование и не выходит в сеть, чтобы заполнить эти поля за вас. Если ни один источник не окажется пригодным, ни один геохук не загрузится и наружу проступит реальное местоположение.

🛑 timezone — единственное поле, которое на самом деле не проверяется. Оно тестируется только на непустоту и никогда не сверяется с базой IANA. Опечатка вроде Asia/Tokyoo будет принята, вернёт ok=true, в неизменном виде вернётся из profile.get — а на устройстве молча превратится в GMT. Нигде об ошибке не сообщат, поэтому копируйте имя точно. С координатами всё наоборот: они действительно проверяются по диапазону, и неверное значение громко падает с BAD_REQUEST.

CUSTOM — задать местоположение вручную, прокси не нужен

bash
adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_UPDATE -p com.wowsoftware.hidemyandroid -e token <your_access_token> -e id <profile_id> -e geo '{"source":"CUSTOM","latitude":35.6812,"longitude":139.7671,"countryCode":"JP","timezone":"Asia/Tokyo","language":"ja"}'

PROXY — брать местоположение у прокси (по умолчанию)

bash
adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_UPDATE -p com.wowsoftware.hidemyandroid -e token <your_access_token> -e id <profile_id> -e geo '{"source":"PROXY"}'

deviceMock

По умолчанию: ВЫКЛ. Имитирует другую модель устройства. Установите "enabled":true и укажите любые из перечисленных полей — все строки необязательны (по умолчанию пустые), каждое соответствует свойству Android Build:

Поле Соответствует Пример
manufacturer Build.MANUFACTURER Samsung
brand Build.BRAND samsung
model Build.MODEL SM-S918B
device Build.DEVICE (кодовое имя) dm3q
product Build.PRODUCT dm3qxxx
board Build.BOARD kalama
hardware Build.HARDWARE qcom
buildId Build.ID UP1A.231005.007
buildIncremental Build.VERSION.INCREMENTAL S918BXXU3CWK9
buildType Build.TYPE user
buildTags Build.TAGS release-keys
buildFingerprint Build.FINGERPRINT samsung/dm3qxxx/dm3q:14/UP1A.231005.007/S918BXXU3CWK9:user/release-keys
deviceName Отображаемое имя устройства Galaxy S23 Ultra
bash
adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_UPDATE -p com.wowsoftware.hidemyandroid -e token <your_access_token> -e id <profile_id> -e deviceMock '{"enabled":true,"manufacturer":"Samsung","brand":"samsung","model":"SM-S918B","device":"dm3q","product":"dm3qxxx","board":"kalama","hardware":"qcom","buildId":"UP1A.231005.007","buildIncremental":"S918BXXU3CWK9","buildType":"user","buildTags":"release-keys","buildFingerprint":"samsung/dm3qxxx/dm3q:14/UP1A.231005.007/S918BXXU3CWK9:user/release-keys","deviceName":"Galaxy S23 Ultra"}'

sim

По умолчанию: ВЫКЛ. Подменяет SIM-карту/оператора. Установите "enabled":true и укажите до двух карт в поле simCards. Список всегда нормализуется ровно до двух карт: третья молча отбрасывается — запрос всё равно вернёт ok=true, — а одна карта дополняется пустой второй, поэтому profile.get всегда возвращает две. Каждая карта:

Поле Тип По умолчанию Значение / ограничения
slotIndex int 0 Слот SIM — назначается по позиции карты в массиве (0, затем 1); отправленное вами значение игнорируется
carrierName string "" Название оператора (например AT&T)
countryIso string "" Код страны ISO (например us) — хранится в нижнем регистре. Обратите внимание: это противоположно geo.countryCode, который хранится в верхнем регистре
mcc string "" Код мобильной страны — MCC (например 310)
mnc string "" Код мобильной сети — MNC (например 410)
operatorCode string "" Код оператора = mcc + mnc (например 310410)
phoneNumber string "" Номер телефона
iccid string "" Серийный номер SIM (ICCID)
imsi string "" IMSI
networkType string "" Тип сети — смотрите допустимые значения ниже; нераспознанное значение игнорируется молча

networkType обрезается по краям и сравнивается без учёта регистра, а у каждого поколения сети есть несколько допустимых написаний:

Значение Также принимается Поколение сети
NR 5G NR, 5G 5G
LTE 4G 4G
WCDMA UMTS, 3G 3G
GSM 2G 2G

⚠️ Всё, чего нет в этой таблице, молча отключает подмену типа сети для этой карты — ни ошибки, ни BAD_REQUEST: значение просто сохраняется и никогда не используется. Обратите внимание, что в NR 5G есть пробел: NR5G не распознаётся и попадает ровно в эту тихую яму.

bash
adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_UPDATE -p com.wowsoftware.hidemyandroid -e token <your_access_token> -e id <profile_id> -e sim '{"enabled":true,"simCards":[{"slotIndex":0,"carrierName":"AT&T","countryIso":"us","mcc":"310","mnc":"410","operatorCode":"310410","networkType":"LTE"},{"slotIndex":1,"carrierName":"T-Mobile","countryIso":"us","mcc":"310","mnc":"260","operatorCode":"310260","networkType":"NR 5G"}]}'

gmails

По умолчанию: пусто. Список виртуальных аккаунтов Google — принимаются только адреса @gmail.com. Список полностью заменяет предыдущий; [] очищает его. Внутри нет символа :, поэтому подходит content call:

bash
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.update --extra token:s:<your_access_token> --extra id:s:<profile_id> --extra 'gmails:s:["[email protected]","[email protected]"]'

Полный пример

Полная настройка с нуля:

bash
# 1. create a profile — copy the returned id into <profile_id> below
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.create --extra token:s:<your_access_token> --extra name:s:Demo

# 2. add a target app
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.addApp --extra token:s:<your_access_token> --extra id:s:<profile_id> --extra packageName:s:com.whatsapp
# 3. add the virtual Gmail accounts
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.update --extra token:s:<your_access_token> --extra id:s:<profile_id> --extra 'gmails:s:["[email protected]","[email protected]"]'

# 4. enable + set the device mock
adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_UPDATE -p com.wowsoftware.hidemyandroid -e token <your_access_token> -e id <profile_id> -e deviceMock '{"enabled":true,"manufacturer":"Samsung","brand":"samsung","model":"SM-S918B","device":"dm3q","product":"dm3qxxx","board":"kalama","hardware":"qcom","buildId":"UP1A.231005.007","buildIncremental":"S918BXXU3CWK9","buildType":"user","buildTags":"release-keys","buildFingerprint":"samsung/dm3qxxx/dm3q:14/UP1A.231005.007/S918BXXU3CWK9:user/release-keys","deviceName":"Galaxy S23 Ultra"}'

# 5. enable + set the SIM mock (two cards, full fields)
adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_UPDATE -p com.wowsoftware.hidemyandroid -e token <your_access_token> -e id <profile_id> -e sim '{"enabled":true,"simCards":[{"slotIndex":0,"carrierName":"AT&T","countryIso":"us","mcc":"310","mnc":"410","operatorCode":"310410","networkType":"LTE","phoneNumber":"+12025550123","iccid":"8901410123456789012","imsi":"310410123456789"},{"slotIndex":1,"carrierName":"T-Mobile","countryIso":"us","mcc":"310","mnc":"260","operatorCode":"310260","networkType":"NR 5G","phoneNumber":"+12025550456","iccid":"8901260987654321098","imsi":"310260987654321"}]}'

# 6. enable + set the proxy (tested live, ~8s)
adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_UPDATE -p com.wowsoftware.hidemyandroid -e token <your_access_token> -e id <profile_id> -e proxy '{"enabled":true,"host":"10.0.0.1","port":1080,"protocol":"SOCKS5"}'

# 7. pick where the location comes from — geo has two sources, choose ONE
#    A) from the proxy you just set. This is the default, so the line is optional:
adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_UPDATE -p com.wowsoftware.hidemyandroid -e token <your_access_token> -e id <profile_id> -e geo '{"source":"PROXY"}'
#    B) or set it yourself — this needs no proxy at all. Use B *instead of* A, not after it:
# adb shell am broadcast -a com.wowsoftware.hidemyandroid.HEADLESS_UPDATE -p com.wowsoftware.hidemyandroid -e token <your_access_token> -e id <profile_id> -e geo '{"source":"CUSTOM","latitude":35.6812,"longitude":139.7671,"countryCode":"JP","timezone":"Asia/Tokyo","language":"ja"}'
#    geo and proxy are independent: setting one never rewrites the other, and only
#    geo.source decides which one feeds the hooks. So CUSTOM together with a proxy in
#    a different country means your IP says one place while your GPS says another.

# 8. activate (restarts the target app and clears its data)
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.setActive --extra token:s:<your_access_token> --extra id:s:<profile_id>

# 9. verify
adb shell content call --uri content://com.wowsoftware.hidemyandroid.headless --method profile.get --extra token:s:<your_access_token> --extra id:s:<profile_id>

Коды ошибок

При ошибке возвращается ok=false с одним из следующих значений error_code (broadcast возвращает result=1):

Код Значение Решение
UNAUTHORIZED Токен отсутствует или неверен Используйте текущий ключ; при необходимости перегенерируйте его
FEATURE_DISABLED Headless API отключён Включите в Настройки → Разработчику → Headless API
BAD_REQUEST Неверный параметр или JSON Проверьте обязательные поля, корректность JSON, только gmail-адреса, отсутствие дублирующихся приложений
NOT_FOUND Профиль с таким идентификатором не существует Проверьте идентификатор с помощью profile.list
PROXY_INVALID Прокси не прошёл проверку в реальном времени Проверьте хост/порт/протокол/аутентификацию и наличие интернета на устройстве; данные не сохранены
LICENSE_EXPIRED Срок действия Premium истёк Обновите подписку Premium
LICENSE_STALE Лицензия давно не проверялась онлайн Откройте приложение один раз для повторной проверки (не реже одного раза в 24 ч при непрерывном использовании)
INTERNAL Внутренняя ошибка (I/O или root) Повторите попытку; убедитесь, что root/LSPosed работают корректно

Советы & устранение неполадок

  • Broadcast не даёт результата? Убедитесь, что вы включили параметр -p com.wowsoftware.hidemyandroid — Android блокирует broadcast без него.
  • Значение обрезается после символа :? В этом значении есть двоеточие, поэтому content call обрезает его. Отправьте его через broadcast HEADLESS_UPDATE.
  • JSON broadcast не применяется (часто на Windows)? При передаче через оболочку рабочего стола в оболочку устройства кавычки в JSON команды am broadcast (hookFlags, proxy, deviceMock, sim) легко теряются, и am неправильно интерпретирует значение (оно может отображаться как URI вида dat=…), и ничего не меняется. Надёжное решение — не передавать JSON через командную строку: поместите весь рабочий процесс в файл .sh (одинарные кавычки сохраняют JSON нетронутым), затем загрузите его на устройство и запустите там. Скрипт выполняется на устройстве, поэтому он может захватить идентификатор нового профиля и использовать его далее:
    bash
    # setup.sh — the full example as one runnable script (runs on the device)
    URI=content://com.wowsoftware.hidemyandroid.headless
    PKG=com.wowsoftware.hidemyandroid
    K=<your_access_token>
    
    # 1. create a profile and capture its id
    ID=$(content call --uri $URI --method profile.create --extra token:s:$K --extra name:s:Demo | grep -o '"id":"[^"]*"' | head -n1 | sed 's/.*"id":"//;s/"//')
    echo "profile id: $ID"
    
    # 2. add a target app
    content call --uri $URI --method profile.addApp --extra token:s:$K --extra id:s:$ID --extra packageName:s:com.facebook.katana
    
    # 3. add the virtual Gmail accounts
    content call --uri $URI --method profile.update --extra token:s:$K --extra id:s:$ID --extra 'gmails:s:["[email protected]","[email protected]"]'
    
    # 4. enable + set the device mock
    am broadcast -a $PKG.HEADLESS_UPDATE -p $PKG -e token $K -e id $ID -e deviceMock '{"enabled":true,"manufacturer":"Samsung","brand":"samsung","model":"SM-S918B","device":"dm3q","product":"dm3qxxx","board":"kalama","hardware":"qcom","buildId":"UP1A.231005.007","buildIncremental":"S918BXXU3CWK9","buildType":"user","buildTags":"release-keys","buildFingerprint":"samsung/dm3qxxx/dm3q:14/UP1A.231005.007/S918BXXU3CWK9:user/release-keys","deviceName":"Galaxy S23 Ultra"}'
    
    # 5. enable + set the SIM mock (two cards)
    am broadcast -a $PKG.HEADLESS_UPDATE -p $PKG -e token $K -e id $ID -e sim '{"enabled":true,"simCards":[{"slotIndex":0,"carrierName":"AT&T","countryIso":"us","mcc":"310","mnc":"410","operatorCode":"310410","networkType":"LTE","phoneNumber":"+12025550123","iccid":"8901410123456789012","imsi":"310410123456789"},{"slotIndex":1,"carrierName":"T-Mobile","countryIso":"us","mcc":"310","mnc":"260","operatorCode":"310260","networkType":"NR 5G","phoneNumber":"+12025550456","iccid":"8901260987654321098","imsi":"310260987654321"}]}'
    
    # 6. enable + set the proxy (tested live, ~8s)
    am broadcast -a $PKG.HEADLESS_UPDATE -p $PKG -e token $K -e id $ID -e proxy '{"enabled":true,"host":"10.0.0.1","port":1080,"protocol":"SOCKS5"}'
    
    # 7. pick where the location comes from — geo has two sources, choose ONE
    #    A) from the proxy you just set. This is the default, so the line is optional:
    am broadcast -a $PKG.HEADLESS_UPDATE -p $PKG -e token $K -e id $ID -e geo '{"source":"PROXY"}'
    #    B) or set it yourself — this needs no proxy at all. Use B *instead of* A, not after it:
    # am broadcast -a $PKG.HEADLESS_UPDATE -p $PKG -e token $K -e id $ID -e geo '{"source":"CUSTOM","latitude":35.6812,"longitude":139.7671,"countryCode":"JP","timezone":"Asia/Tokyo","language":"ja"}'
    #    geo and proxy are independent: setting one never rewrites the other, and only
    #    geo.source decides which one feeds the hooks. So CUSTOM together with a proxy in
    #    a different country means your IP says one place while your GPS says another.
    
    # 8. activate (restarts the target app and clears its data)
    content call --uri $URI --method profile.setActive --extra token:s:$K --extra id:s:$ID
    
    # 9. verify
    content call --uri $URI --method profile.get --extra token:s:$K --extra id:s:$ID
    затем загрузите его на устройство и запустите:
    bash
    adb push setup.sh /data/local/tmp/setup.sh
    adb shell sh /data/local/tmp/setup.sh
    Обычные команды content call (без JSON) можно вводить напрямую без скрипта. В Git Bash добавляйте префикс MSYS_NO_PATHCONV=1 к строкам с adb, чтобы путь на устройстве не преобразовывался.
  • Изменения не применились? Целевое приложение должно перезапуститься — активация профиля делает это автоматически и заодно стирает данные приложения, поэтому оно запускается с новой личностью и без всего, что было раньше.
  • PROXY_INVALID для надёжного прокси? Устройству нужен интернет для проверки, ограниченной ~8 с, поэтому медленный прокси может не успеть ответить.
Скачать