Ir al contenido

DocumentaciónAutomatización

Automatiza con scripts

Un script en el mismo ordenador puede abrir un perfil y tomar el control de su navegador. El perfil que recibe es el mismo que abres a mano: la misma huella, la misma conexión, las mismas cookies.

La interfaz de la app está solo en inglés y en ruso. Los botones y ajustes se nombran aquí como los muestra la interfaz en inglés.

Qué es la API local

La API local es un pequeño servicio dentro de la app. Responde solo en este ordenador y solo a las solicitudes que llevan tu clave. Con ella, un script puede listar perfiles, iniciarlos y detenerlos, y recibir la dirección en la que una biblioteca de automatización se conecta al navegador iniciado.

  • Todos los planes, incluido el gratuito.
  • Solo este ordenador: escucha en 127.0.0.1 y no se puede abrir a la red.
  • Desactivada hasta que la actives.
  • Los perfiles se crean en la app. La API ejecuta los perfiles que tienes; no los crea ni los edita.

Actívala

  1. Abre Settings › API & Automation y activa Local API. La línea de al lado cambia a Running on this computer only.
  2. Mantén el Port —48361 si no lo has cambiado— o pulsa Random free port.
  3. Copia ahora la API key con Copy: la clave en sí nunca se muestra y, cuando salgas de la página, ya no se puede volver a copiar, solo reemplazar. Tiene 64 caracteres.
Settings › API & Automation: el interruptor de Local API, el puerto, la dirección y la clave
Address
Dónde responde el servicio, con un botón Copy; por defecto, http://127.0.0.1:48361.
Regenerate…
Crea una clave nueva. La anterior deja de funcionar al instante, igual que las direcciones de navegador entregadas con ella.
API documentation
Abre la referencia.

Nota. La clave se guarda en el almacén de credenciales del sistema, no en un archivo. Un script debería leer la dirección del archivo que escribe la app —Local API/status.json en la carpeta de datos de Liminal— en lugar de fijar un puerto en el código; la referencia explica dónde está.

La primera solicitud

Cada solicitud lleva la clave en una cabecera. Pregunta al servicio si está en marcha:

curl
curl -H 'Authorization: Bearer <key>' http://127.0.0.1:48361/v1/status
JSON
{"status":"running","version":"<version>","signedIn":true}

signedIn te dice si alguien ha iniciado sesión en la app. Las operaciones que tocan perfiles lo necesitan: sin ello responden not_signed_in.

Busca un perfil e inícialo

Lista los perfiles: la respuesta llega por páginas y se puede filtrar por nombre, espacio de trabajo, carpeta y estado:

curl
curl -H 'Authorization: Bearer <key>' http://127.0.0.1:48361/v1/profiles

Toma el id del perfil que quieres e inícialo:

curl
curl -X POST -H 'Authorization: Bearer <key>' http://127.0.0.1:48361/v1/profiles/<profile-id>/start
JSON
{
  "id": "<profile-id>",
  "status": "running",
  "cdpDiscoveryUrl": "http://127.0.0.1:48361/devtools/<token>/json/version",
  "cdpBrowserUrl": "ws://127.0.0.1:9222/devtools/browser/<token>",
  "seleniumDebuggerUrl": "127.0.0.1:9222",
  "chromedriverPath": "/Applications/Liminal.app/.../chromedriver",
  "debugPort": 9222,
  "debugAddress": "127.0.0.1:9222",
  "externalIp": "203.0.113.10",
  "countryCode": "DE"
}
cdpBrowserUrl
La dirección a la que se conectan Puppeteer y Playwright.
seleniumDebuggerUrl, chromedriverPath
Lo que necesita Selenium: la dirección del depurador y el controlador que corresponde al navegador, incluido con la app.
externalIp, countryCode
Cómo era la conexión del perfil cuando se inició.

La app inicia el perfil como si hubieras pulsado Open. Un perfil que ya está abierto no se inicia otra vez: la referencia describe cómo conectarse a uno en ejecución.

Conecta tu biblioteca

Cada ejemplo está completo: lee el archivo de dirección, busca un perfil por nombre, lo inicia y abre una página.

import { readFileSync } from 'node:fs'
import puppeteer from 'puppeteer-core'

// Local API/status.json, inside Liminal's user-data directory. The settings
// screen shows the absolute path; that path and the key are your script’s to
// keep — the app puts neither into the environment for you.
const { address } = JSON.parse(readFileSync(process.env.LIMINAL_ADDRESS_FILE, 'utf8'))

async function call(path, init) {
  const response = await fetch(address + path, {
    ...init,
    headers: { Authorization: `Bearer ${process.env.LIMINAL_API_KEY}` },
  })
  const body = await response.json()
  if (!response.ok) throw new Error(body.error.code)
  return body
}

const { items } = await call('/v1/profiles?name=' + encodeURIComponent('Shop EU'))
const started = await call(`/v1/profiles/${items[0].id}/start`, { method: 'POST' })

const browser = await puppeteer.connect({ browserWSEndpoint: started.cdpBrowserUrl })
const page = await browser.newPage()
await page.goto('https://example.com')
console.log(await page.title())
await browser.disconnect()

Consejo. Conéctate al navegador que el perfil ya tiene. No dejes que la biblioteca lance un navegador propio: ese no tendría ni la huella ni las cookies del perfil.

Detén el perfil

curl
curl -X POST -H 'Authorization: Bearer <key>' http://127.0.0.1:48361/v1/profiles/<profile-id>/stop

Detenerlo cierra el perfil igual que Close. También hay una detención forzada para un perfil que no se cierra.

Conviene saber

PreguntaRespuesta
¿Un script ve un navegador distinto del que veo yo?No. La huella y la conexión se aplican exactamente igual que cuando abres el perfil a mano, y rigen las mismas protecciones.
¿Los sitios ven que el navegador está automatizado?Las señales habituales de automatización se ocultan en un perfil iniciado a través de la API. Esto no se puede desactivar.
¿Hay un modo headless?No. La API inicia un perfil igual que lo hace la app.
¿Hay un límite de solicitudes?Ninguna cuota depende del plan.
¿Hay una herramienta de línea de comandos o escenarios grabados?No. La API local es la forma de automatizar.
¿Qué recibo cuando algo va mal?Un estado y un code breve con el que decidir qué hacer: invalid_key, not_signed_in, profile_already_running y otros. La referencia los enumera por operación.

Comprobado con la app publicada: octubre de 2026. Si la app hace algo distinto de lo que dice esta página, la página está mal: escribe a [email protected]. Lo que cambió en cada versión está en Novedades.