Saltar al contenido

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.

Returning Data
{
"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.

Returning Data
{
"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

Parámetros de solicitud:
{
"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
}
Datos de retorno:
{
"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:
  1. ?chrome_flags=—blink-settings%3DimagesEnabled%3Dfalse%20—disable-webgl2
  2. ?chrome_flags=—headless%3Dnew
  • 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
Datos de retorno
{
"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

Devolver datos:
{
"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

Parámetros de solicitud:
{
"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
}
Devolver datos:
{
"code": 0,
"status": "éxito",
"data": {}
}

Eliminar perfil

  • Ruta: /perfil/eliminar/<IDperfil>
  • Método: GET

Descripción: Elimina el perfil con el <IDperfil> seleccionado.

Devolver datos:
{
"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.

Devolver datos:
{
"code": 0,
"status": "éxito",
"data": {}
}

Clear profile cookies

  • Path: /profile/clearcookies/<profileID>
  • Method: GET

Description: Clear only cookies from profile with selected <profileID>

Returning Data:
{
"code": 0,
"status": "success",
"data": {}
}

Clear profile cache

  • Path: /profile/clearcache/<profileID>
  • Method: GET

Description: Clear only cache from profile with selected <profileID>

Returning Data:
{
"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.

Devolver datos:
{
"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

Parámetros de solicitud:
{
"profiles": ["9b24cd2604d1b8260123242ab1f30c", "f4cbe3c89618bfc9647ba8a47c13f6"],
"group": "test"
}
Devolver datos:
{
"code": 0,
"status": "éxito",
"data": {}
}

Hacer local

  • Ruta: /perfil/alocal
  • Método: POST

Descripción: Convierte los perfiles seleccionados en locales.
Formato: JSON

Parámetros de solicitud:
{
"profiles": ["9b24cd2604d1b8260123242ab1f30c", "f4cbe3c89618bfc9647ba8a47c13f6"]
}
Devolver datos:
{
"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

Devolver datos:
{
"code": 0,
"status": "éxito",
"data": {}
}

Lista de configuraciones

  • Ruta: /listadeconfiguraciones
  • Método: GET

Descripción: Devuelve una lista de configuraciones activas.
Formato: JSON

Datos devueltos:
{
"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

Datos devueltos:
{
"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

Datos devueltos:
{
"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 , if the check fails, an error is returned
Formato: JSON

Datos devueltos:
{
"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

Returning Data:
{
"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

Returning Data:
{
"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

Request parameters:
{
"name": "Proxy1",
"type": "http",
"host": "127.0.0.1",
"port": "2222",
"login": "12345",
"password": "12345",
"ipchangelink": ""
}
Returning Data:
{
"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

Returning Data:
{
"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

Request parameters:
{
"name": "Proxy1",
"type": "http",
"host": "127.0.0.1",
"port": "2222",
"login": "12345",
"password": "12345",
"ipchangelink": ""
}
Returning Data:
{
"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; // Puerto
const ip = '127.0.0.1'; // IP local
const 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 sleep
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from 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 v110
ser = 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 perfiles
profile_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