API
Introduction
With the API v1.5 in Undetectable, you will be able to get a list of profiles, create, start, update, and close them. Additionally, with the obtained information, you can connect various automation tools, such as Puppeteer, Playwright, and others, to profiles on the Chromium core.
You can download Chromedriver for working with Selenium here:
Windows
MacOS M series
MacOS Intel
The program must be running to use the API.
By default, the local server runs on port 25325. If this port is occupied, it will start on another port. You can check the port in the program settings and change it if necessary.
To access the local server, use the IP 127.0.0.1, localhost, or the local IP within your network, and the port from the settings, plus the path you want to execute. For example, http://localhost:25325/status
.
All API responses look like:
{"code": `<status code>`,"status": `<status>`,"data": `<return object>`,}
where <status code>
and <status>
reflect the status:
<status code> | <status> | Description |
---|---|---|
0 | ”success” | success |
1 | ”error” | error, <return object> = {“error”:“error description”} |
<return object>
- various data sent by the API, for example, a list of profiles.
Errors have the following format:
{ "code":1, "status":"error", "data": {"error": "error description"},}
Requests
Status
- Path:
/status
- Method: GET
Description: Returns the status of the local server, whether it is running or not.
{ "code":0, "status":"success", "data":{},}
List of Profiles
- Path:
/list
- Method: GET
Description: Returns a list of profiles available in the program on the Chromium browser.
{ "code": 0, "status": "success", "data" { "profile_id1": { "name": "Profile1", // Profile name in the program "status": "Available", // Profile status, can be: "Started", "Locked", "Available" "debug_port": "xxxx", // Browser debug port used for automation (empty if the profile is not running). Only for Chromium browser "websocket_link": "ws://127.0.0.1:xxxx/devtools/browser/xxxxxx", // Browser link used for automation (empty if the profile is not running). Only for Chromium browser "folder": "Name", // Profile folder name "tags": ["tag1", "tag2", "tag3"], // Profile tags "cloud_id": "", // Cloud profile ID "creation_date": 123456789, // Creation date Unix Timestamp "modify_date": 123456789, // Modification date Unix Timestamp }, "profile_id2": { …}, … },}
Create Profile
- Path:
/profile/create
- Method: POST
Description: Creates a profile with the selected parameters. All parameters are optional and may not be present. The list of browsers for the command: Chrome, Edge, FireFox, IE, Opera, Safari, Yandex. The list of OS for the command: Windows, Windows 7, Windows 8, Windows 8.1, Windows 10, Android, iPhone, iPad, Linux, Mac. If there are no configurations with the selected OS or Browser, a random OS or Browser type will be used.
Format: JSON
{ "name": "perfil con configuración aleatoria", // Nombre del perfil en el programa "os": "Windows", // Configuración del sistema operativo a utilizar "browser": "Chrome", // Configuración del navegador a utilizar "cpu": 8, // Número de núcleos, valores posibles: 32, 24, 20, 16, 12, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0 "memory": 8, // Cantidad de memoria, valores posibles: 8, 4, 2, 1, 0 "tags": ["tag1", "tag2"], // Establecer etiquetas en el perfil "geolocation": "12.44, 13.524", // Establecer geolocalización, si se ingresa un valor vacío o incorrecto, se utilizarán los ajustes predeterminados "resolution": "1024x768", // Resolución de la pantalla, valores posibles: "800x600", "960x540", "1024x768", "1152x864", "1280x720", "1280x768", "1280x800", "1280x1024", "1366x768", "1408x792", "1440x900", "1400x1050", "1440x1080", "1536x864", "1600x900", "1600x1024", "1600x1200", "1680x1050", "1920x1080", "1920x1200", "2048x1152", "2560x1080", "2560x1440", "3440x1440", "3840x2160", "5120x1440" "proxy": "socks5://127.0.0.1:5555:login:pass", // Cambiar el proxy en el perfil (los proxies pueden ser http, https, socks5, pueden tener o no un nombre de usuario y contraseña) "notes": "Texto", // Cambiar las notas en el perfil "folder": "testFolder", // Carpeta en la que se guardará el perfil "language": "ru-RU, en-US", // Se pueden establecer 2 idiomas "cookies": [{}], // Importar cookies al perfil "type": "cloud", // Tipo de perfil: cloud, local "group": "group_example", // Si no se especifica un grupo, se tomará de la configuración predeterminada, si se especifica y es incorrecto, se mostrará un error "configid": "id", // ID de configuración, si se especifica, se ignorarán los parámetros OS y Browser, y se utilizarán los demás parámetros si es posible, por ejemplo, si la configuración es para Android, la resolución de la pantalla no cambiará "accounts": [ // Importar cuentas de diferentes sitios web al perfil {"website": "facebook.com", "username": "test@gmail.com", "password": "123456"}, {"website": "mail.com","username": "test@gmail.com","password": "123456"} ], "timezone": "Pacific/Niue" ("Auto", "System") // set timezone or timezone mode}
{ "code": 0, "status": "success", "data": { "profile_id": "xxxxxxxx...", // ID único del perfil "name": "perfil con configuración aleatoria" // Nombre del perfil en el programa }}
Iniciar perfil
- Ruta:
/profile/start/<profileID>
- Método: GET
Descripción: Inicia el perfil con el <profileID>
seleccionado. Puede agregar parámetros a la URL:
- chrome_flags y pasar cualquier bandera de inicio que desee, solo asegúrese de codificarlas en URL encoding, por ejemplo: ?chrome_flags=—blink-settings%3DimagesEnabled%3Dfalse%20—disable-webgl2
- start-pages y especificar las páginas de inicio, solo asegúrese de codificarlas en URL encoding, por ejemplo: ?start-pages=https%3A%2F%2Fgoogle.com%2Chttps%3A%2F%2Fya.ru
{ "code":0, "status":"success", "data":{ "name": "Perfil1" // Nombre del perfil en el programa "websocket_link":"ws://127.0.0.1:xxxx/devtools/browser/xxxxxx", // enlace al navegador, se utiliza para la automatización (valor vacío si el perfil no está en ejecución). Solo para navegadores basados en Chromium "debug_port": "xxxx", // puerto de depuración del navegador basado en Chromium, se utiliza para la automatización (valor vacío si el perfil no está en ejecución). Solo para navegadores basados en Chromium "folder": "Nombre", // Nombre de la carpeta del perfil "tags": ["tag1", "tag2", "tag3"] // Etiquetas del perfil },}
Cerrar perfil
- Ruta:
/profile/stop/<profileID>
- Método: GET
Descripción: Detiene el perfil con el <profileID>
seleccionado
{ "code": 0, "status": "éxito", "data": {}}
Actualizar perfil
- Ruta:
/perfil/actualizar/<IDperfil>
- Método: POST
Descripción: Actualiza la información en el perfil con el <IDperfil>
especificado. Todos los parámetros son opcionales y pueden no estar presentes.
Formato: JSON
{ "proxy": "socks5://127.0.0.1:5555:login:pass", // Cambia el proxy en el perfil (los proxies pueden ser http, https, socks5, pueden tener o no un nombre de usuario y contraseña) "notes": "Texto", // Cambia las notas en el perfil "name": "Nombre de perfil", // Cambia el nombre del perfil "folder":"Carpeta de prueba", // Cambia la carpeta en el perfil "tags": ["tag1", "tag2"], // Establece etiquetas en el perfil, las etiquetas anteriores se sobrescribirán, si la matriz está vacía, se eliminarán todas las etiquetas del perfil "geolocation": "12.44, 13.524", // Establece la geolocalización, si se ingresa un valor vacío o incorrecto, se utilizarán los ajustes predeterminados "cookies":[{}], // Importa cookies en el perfil "type": "nube", // Tipo de perfil: nube, local "group": "grupo_ejemplo", // Si no se especifica un grupo, se tomará de la configuración predeterminada, si se especifica y no es correcto, se mostrará un error "accounts": [ // Importa cuentas de diferentes sitios web en el perfil {"website": "facebook.com", "username": "test@gmail.com", "password": "123456"}, {"website": "mail.com","username": "test@gmail.com","password": "123456"} ], "timezone": "Pacific/Niue" ("Auto", "System") // set timezone or timezone mode}
{ "code": 0, "status": "éxito", "data": {}}
Eliminar perfil
- Ruta:
/perfil/eliminar/<IDperfil>
- Método: GET
Descripción: Elimina el perfil con el <IDperfil>
seleccionado.
{ "code": 0, "status": "éxito", "data": {}}
Limpiar datos en el perfil
- Ruta:
/perfil/limpiardatos/<IDperfil>
- Método: GET
Descripción: Limpia todos los datos (cookies, historial, notas, caché, etc.) del perfil con el <IDperfil>
seleccionado.
{ "code": 0, "status": "éxito", "data": {}}
Clear profile cookies
- Path:
/profile/clearcookies/<profileID>
- Method: GET
Description: Clear only cookies from profile with selected <profileID>
{ "code": 0, "status": "success", "data": {}}
Cookies del perfil
- Ruta:
/perfil/cookies/<IDperfil>
- Método: GET
Descripción: Solicita las cookies del perfil con el <IDperfil>
seleccionado.
{ "code": 0, "status": "éxito", "data": {}}
Enviar a la nube
- Ruta:
/perfil/alanube
- Método: POST
Descripción: Envía los perfiles seleccionados a la nube.
Formato: JSON
{ "profiles": ["9b24cd2604d1b8260123242ab1f30c", "f4cbe3c89618bfc9647ba8a47c13f6"], "group": "test"}
{ "code": 0, "status": "éxito", "data": {}}
Hacer local
- Ruta:
/perfil/alocal
- Método: POST
Descripción: Convierte los perfiles seleccionados en locales.
Formato: JSON
{ "profiles": ["9b24cd2604d1b8260123242ab1f30c", "f4cbe3c89618bfc9647ba8a47c13f6"]}
{ "code": 0, "status": "éxito", "data": {}}
Actualizar versión del navegador
- Ruta:
/perfil/actualizarnavegador/<IDperfil>
- Método: GET
Descripción: Actualiza la versión del navegador en el perfil con el <IDperfil>
seleccionado.
Formato: JSON
{ "code": 0, "status": "éxito", "data": {}}
Lista de configuraciones
- Ruta:
/listadeconfiguraciones
- Método: GET
Descripción: Devuelve una lista de configuraciones activas.
Formato: JSON
{ "code":0, "status":"éxito", "data": { "config_id1": { "os": "Windows 10" // Sistema operativo "browser":"Chrome 115", // Tipo de navegador y versión "useragent": "xxxx", // UserAgent en la configuración "webgl": "Apple GPU", // WebGL en la configuración "screen": "1024x768", // Resolución de pantalla }, "config_id2": { … }, … },
}
Lista de grupos
- Ruta:
/groupslist
- Método: GET
Descripción: Devuelve una lista de grupos
Formato: JSON
{ "code":0, "status": "éxito", "data": {["grupo1", "grupo2"]},}
Información del perfil
- Ruta:
/profile/getinfo/<profileID>
- Método: GET
Descripción: Solicita información sobre el perfil con el <profileID>
seleccionado
Formato: JSON
{ "code":0, "status": "éxito", "data": { "name": "Perfil1" // Nombre del perfil en el programa "status": "Disponible", // Estado del perfil, puede ser: "Iniciado","Bloqueado", "Disponible" "debug_port": "xxxx", // Puerto de depuración del navegador, se utiliza para la automatización (valor vacío si el perfil no está en ejecución) "websocket_link": "ws://127.0.0.1:xxxx/devtools/browser/xxxxxx", // enlace al navegador, se utiliza para la automatización (valor vacío si el perfil no está en ejecución) "configid": "id" // ID de configuración "cloud_id": "" "type": "cloud" // Tipo de perfil: cloud, local "proxy": "socks5://127.0.0.1:5555:login:pass", // Proxy del perfil "folder": "Nombre", // Nombre de la carpeta del perfil "tags": ["tag1", "tag2", "tag3"], // Etiquetas del perfil "notes": "Texto", // Notas del perfil "useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43", // useragent del perfil "browser": "Edge 114.0.1823.43", // Navegador del perfil "os": "Windows 10", // Sistema operativo del perfil "screen": "1366x768", // Resolución de pantalla del perfil "language": "en-US,en;q=0.9,ak-GH;q=0.8,ak;q=0.7", // Idioma del perfil "cpu": 8, // Número de núcleos "memory": 4, // Cantidad de memoria "creation_date": 123456789, // Fecha de creación en formato Unix Timestamp "modify_date": 123456789, // Fecha de modificación en formato Unix Timestamp },}
Check IP
- Ruta:
/profile/checkconnection/<profileID>
- Methode: GET
Descripción: Checks the connection in the profile with the selected
Formato: JSON
{ "code":0, "status": "success", "data": { "ip": "127.0.0.1" // Returns the IP address in this profile }}
Get timezones list
- Path:
/timezoneslist
- Method: GET
Description: Returning timezones list
Format: JSON
{ "code":0, "status": "success", "data": { "Pacific/Niue": "GMT-11:00", "America/Cambridge_Bay": "GMT-7:00", ... },}
Get proxies list
- Path:
/proxies/list
- Method: GET
Description: Returning proxies list
Format: JSON
{ "code":0, "status": "success", "data": { "proxy_id1": { "name": "Proxy1" "type": "http", "host": "127.0.0.1", "port": "2222", "login": "12345", "password": "12345", "ipchangelink": "", } "proxy_id2": { … }, … }}
Add proxy
- Path:
/proxies/add
- Method: POST
Description: Add a proxy to the proxy manager, the parameters login, password, ipchangelink are optional, the rest are required
Format: JSON
{ "name": "Proxy1", "type": "http", "host": "127.0.0.1", "port": "2222", "login": "12345", "password": "12345", "ipchangelink": ""}
{ "code": 0, "status": "success", "data": { "proxy_id": "12345" }}
Delete proxy
- Path:
/proxies/delete/<ProxyID>
- Method: GET
Description: Removes a proxy with the selected ID. Proxy will be deleted for all profiles with that proxy, the same as during normal deletion from the manager
Format: JSON
{ "code":0, "status":"success", "data": { },}
Update proxy
- Path:
/proxies/update/<ProxyID>
- Method: POST
Description: Updates the proxy with the selected ID, all parameters are optional
Format: JSON
{ "name": "Proxy1", "type": "http", "host": "127.0.0.1", "port": "2222", "login": "12345", "password": "12345", "ipchangelink": ""}
{ "code": 0, "status": "success", "data": { }}
Ejemplos
Puppeteer (Node.js)
Node.js Puppeteer Iniciar un perfil con un nombre específico y abrir la página undetectable.io en ese perfil:
const puppeteer = require('puppeteer');const axios = require('axios');
const port = 25325; // Puertoconst ip = '127.0.0.1'; // IP localconst profileName = ‘TestProfile’; // Nombre del perfil
const sleep = (ms) => { return new Promise((resolve) => setTimeout(resolve, ms));};
axios.get('http://' + ip + ':' + port + '/status').then(response => { if (response.data.code == 0) { axios.get('http://' + ip + ':' + port + '/list').then(async response => {
for (var profile in response.data.data) { ///// Iniciar un perfil específico y navegar a la página if (response.data.data[profile].name == profileName ) { axios.get('http://' + ip + ':' + port + '/profile/start/' + profile).then(async response => { try { const browser = await puppeteer.connect({ browserWSEndpoint: response.data.data.websocket_link, defaultViewport: null }); const page = await browser.newPage(); await sleep(1000); await page.goto('https://undetectable.io'); } catch (e) { console.log(e); } }) .catch(error => { console.log(error); }); } } }) .catch(error => { console.log(error); }); }}).catch(error => { console.log(error);});
Selenium (Python)
Python + Selenium Iniciar perfiles en una carpeta específica y abrir varios sitios web:
from time import sleepimport requestsfrom selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.chrome.service import Service
address = "127.0.0.1" # Dirección IP local de la API (si estás trabajando desde otro equipo en la misma red o tienes el puerto abierto en la configuración del enrutador, puedes acceder a la API local de forma remota y deberás cambiar esta dirección)port_from_settings_browser = '25325' # Puerto de la API local (se puede encontrar en la configuración del programa)chrome_driver_path = "chromedriver.exe" # Ruta al chromedriver para v110ser = Service(chrome_driver_path)chrome_options = Options()list_response = requests.get(f'http://{address}:{port_from_settings_browser}/list').json()['data'] # Enviamos una solicitud a la API local para obtener la lista de perfilesprofile_id = ''
for key, value in list_response.items(): # Recorremos la lista de perfiles y los ejecutamos uno por uno if value['folder'] == 'test': # Aquí puedes agregar una verificación para ejecutar solo los perfiles necesarios (en este ejemplo, ejecutamos los perfiles que se encuentran en la carpeta 'test') profile_id = key if value['status'] == 'Available': # Si el perfil no está en ejecución, lo iniciamos y obtenemos el puerto de depuración start_profile_response = requests.get(f'http://{address}:{port_from_settings_browser}/profile/start/{profile_id}', timeout=5).json()['data'] debug_port = start_profile_response['debug_port'] if value['status'] == 'Started': # Si el perfil está en ejecución, simplemente tomamos el puerto de depuración de los datos disponibles debug_port = value['debug_port'] if value['status'] == 'Locked': # Si el perfil está bloqueado, lo omitimos continue if debug_port: # Verificamos si el navegador tiene un puerto de conexión (los perfiles de WebEngine no tienen puertos, por lo que los cerramos de inmediato) chrome_options.debugger_address = f'{address}:{debug_port}' driver = webdriver.Chrome(service=ser, options=chrome_options) driver.get("https://whoer.net/") # Abrimos whoer.net en la pestaña activa driver.switch_to.new_window('tab') # Creamos una nueva pestaña y nos cambiamos a ella driver.get(url='https://browserleaks.com/js') # Abrimos browserleaks.com/js en la pestaña activa # Aquí puedes agregar cualquier otra acción sleep(5) # Esperamos 5 segundos requests.get(f'http://{address}:{port_from_settings_browser}/profile/stop/{profile_id}') # Detenemos el perfil