OwlXBrowser

Local API reference

The desktop app runs a REST API on your own computer so scripts can manage and launch profiles. Available on Pro and higher.

Enabling

  1. Create an API key in Dashboard → API keys (shown once — store it safely).
  2. In the desktop app, open Settings → Local API, enable it and paste the key. The default address is http://127.0.0.1:50325.

The server only listens on 127.0.0.1. Every request needs the key:

Authorization: Bearer lak_xxxxxxxxxxxxxxxxxxxxxxxx

Requests are rate-limited per plan (Pro 60/min, Business 300/min). Over the limit you get 429 with a Retry-After header.

Endpoints

MethodPathDescription
GET/v1/profilesList profiles (?group=, ?search=)
POST/v1/profilesCreate a profile
GET/v1/profiles/{id}Get one profile
PATCH/v1/profiles/{id}Update a profile
DELETE/v1/profiles/{id}Delete a profile
POST/v1/profiles/{id}/startStart and return connection info
POST/v1/profiles/{id}/stopStop a running profile
GET/v1/profiles/{id}/statusrunning, stopped or locked
GET/v1/groupsList profile groups

Starting a profile

POST /v1/profiles/01J.../start
{
  "id": "01J...",
  "status": "running",
  "engine": "chromium",
  "protocol": "cdp",
  "endpoint": "ws://127.0.0.1:53111/devtools/browser/…",
  "http_endpoint": "http://127.0.0.1:53111"
}

protocol tells you how to attach:

protocolUse
cdpPuppeteer connect({ browserWSEndpoint }), Playwright chromium.connectOverCDP(...), Selenium debuggerAddress
bidiCamoufox (Firefox) profiles: Puppeteer connect({ browserWSEndpoint, protocol: "webDriverBiDi" }) or any WebDriver BiDi client

Example

The repository's examples/ folder has complete Playwright, Puppeteer and Selenium (Python) scripts.

import { chromium } from "playwright";

const res = await fetch("http://127.0.0.1:50325/v1/profiles/PROFILE_ID/start", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.LOCAL_API_KEY}` },
});
const { endpoint } = await res.json();
const browser = await chromium.connectOverCDP(endpoint);
const context = browser.contexts()[0];
const page = context.pages()[0] ?? (await context.newPage());
await page.goto("https://example.com");