Echidna
Automate

Coming from another tool

Most scripts move to Echidna with a few changed lines: Echidna starts the browser with its fingerprint and proxy in place, and your code attaches to it over the DevTools protocol (CDP) instead of launching its own.

Before you start

  1. Open Settings → Automation & API, switch on Allow scripts and AI agents and copy your automation token. Store it in an environment variable, for example ECHIDNA_API_TOKEN.
  2. Create or import the profiles you want to use (see below), each with its proxy.
  3. Keep the Echidna app open while your scripts run.

Every script then follows the same pattern from the Engine API guide: start a profile, attach to its cdp_url, work in the profile's own context, stop the profile.

Remove your stealth layer. Stealth plugins, user-agent overrides, viewport, locale, timezone, geolocation and proxy options would fight the profile Echidna has already set up. Delete them; keep your page logic.

Paced or raw. Connect to cdp_url and Echidna paces your library's clicks and keys like a hand: a mouse path and a pause before each press, human key timing. raw_cdp_url, in the same answer, skips that: fastest, but raw automation input. Most scripts should stay on cdp_url; use raw_cdp_url only where every millisecond counts.

From Playwright

Replace launch() or launch_persistent_context() with a start call and connect_over_cdp, and use the profile's existing context instead of new_context().

BeforeWith Echidna
browser = p.chromium.launch(proxy=…)info = requests.post(f"{API}/profiles/{NAME}/start", params={"headless": "true"}, headers=H).json()
browser = p.chromium.connect_over_cdp(info["cdp_url"])
context = browser.new_context(user_agent=…, viewport=…, locale=…)context = browser.contexts[0] with no options
context.storage_state(path=…) to keep loginsNothing: the profile keeps its cookies and storage between runs
browser.close()requests.post(f"{API}/profiles/{NAME}/stop", headers=H), which saves cookies

Pages, locators, waits and assertions work unchanged. To move a saved Playwright storageState file into a profile, import it on the profile's Cookies tab: cookie import accepts Playwright JSON.

From Puppeteer

Switch to puppeteer-core (Echidna provides the browser, so no bundled Chromium is needed) and replace launch() with connect():

import puppeteer from "puppeteer-core";

const info = await (await fetch(`${API}/profiles/${NAME}/start?headless=true`,
  { method: "POST", headers: H })).json();
const browser = await puppeteer.connect({ browserWSEndpoint: info.cdp_url, defaultViewport: null });
const page = await browser.newPage();
// ... your existing page code ...
browser.disconnect();
await fetch(`${API}/profiles/${NAME}/stop`, { method: "POST", headers: H });

From Selenium

Selenium attaches to the running profile through Chrome's debuggerAddress option, using the webdriver field of the start answer:

info = requests.post(f"{API}/profiles/{NAME}/start", headers=H).json()
opts = webdriver.ChromeOptions()
opts.add_experimental_option("debuggerAddress", info["webdriver"])  # 127.0.0.1:PORT
driver = webdriver.Chrome(options=opts)

If you are rewriting anyway, Playwright and Puppeteer connect to cdp_url directly and need no driver.

From another anti-detect browser

Moving from AdsPower, GoLogin, Multilogin or a similar tool means recreating your profiles in Echidna. Echidna doesn't copy another tool's fingerprints: each profile gets a new, coherent device from Echidna.

Profiles

Choose Import profiles above the profile table. Import reads AdsPower, GoLogin and Multilogin export files, Echidna CSV or JSON, a TabSentry tasks CSV, and plain text with one profile per line (name, name:proxy or just a proxy). From another tool's export it brings over each profile's name, proxy, group, tags and notes. Every imported profile gets its own new fingerprint. When a name already exists you can skip it, import it with a new name or update the existing profile.

Scripts can do the same with POST /profiles/import using the automation token, or create profiles one by one with POST /profiles.

Logins and cookies

Proxies

Paste your proxy list into Proxies → Add proxies (one per line), press Check all, then assign proxies to profiles. See Proxies and location for the supported formats.

Let Echidna choose the devices

Your automation

If you drove the other tool through its local API (start a profile, receive a DevTools or WebSocket address, connect Playwright, Puppeteer or Selenium), the same shape works here:

StepEchidna
AuthenticateAuthorization: Bearer <automation token> on every request
Find the API~/.echidna/api-port, or a fixed port from Settings → Automation & API
List profilesGET /profiles
Start and get the addressPOST /profiles/{name}/start → cdp_url (and webdriver for Selenium)
StopPOST /profiles/{name}/stop

Profiles are addressed by their name rather than an id. Flows, schedules and the MCP server for AI agents are there when you want Echidna to run the work for you.