Skip to content

Browser automation · Setup pages

Playwright

Launch Playwright through a mobile line, one context per account, and rotate between contexts.

Playwright is the choice for scripted browsing and checks. Per-context proxies let one script run several lines side by side. Chromium takes an authenticated HTTP proxy directly; SOCKS5 with a password is not supported there, so buy the HTTP port for Playwright.

Proxy string

Launch option (Node)

proxy: { server: "http://HOST:PORT", username: "USER", password: "PASS" }

Launch option (Python)

proxy={"server": "http://HOST:PORT", "username": "USER", "password": "PASS"}

Protocol. HTTP. Chromium in Playwright cannot authenticate to a SOCKS5 proxy, so the HTTP port is the one to buy for scripts.

Setup steps

Playwright, step by step

  1. 1Launch the browser, or create a context, with the proxy option set to the line's HTTP endpoint and credentials.
  2. 2Set the context's timezone, locale and geolocation to the line's country.
  3. 3Open an IP-checking page first and assert the exit before the script does anything else.
  4. 4Keep one context per account and one line per account group.
  5. 5Close the context before rotating; open the next one after the status link shows the change settled.

Rotation link

Changing the IP on purpose

Call the rotation link from the script between contexts, poll the status link until the phase is no longer pending, then create the next context. Keep calls at least 5 minutes apart.

import { chromium } from "playwright";

const proxy = { server: "http://HOST:PORT", username: "USER", password: "PASS" };

async function rotate() {
  await fetch("ROTATION_LINK");
  for (let i = 0; i < 24; i += 1) {
    await new Promise((r) => setTimeout(r, 5000));
    const state = await (await fetch("STATUS_LINK")).json();
    if (state.rotation?.phase !== "pending") return;
  }
}

const browser = await chromium.launch();
const context = await browser.newContext({
  proxy,
  timezoneId: "Europe/Berlin",
  locale: "de-DE",
});
const page = await context.newPage();
await page.goto("https://api.ipify.org?format=json");
console.log(await page.textContent("body"));

The rotation and status links are on the line's page in the portal and in the API documentation. The daily allowance of customer-driven changes is in the fair-use policy.

DNS, timezone and leaks

Keep the fingerprint on the line

  • IncludedtimezoneId and locale on the context must match the line's country; Chromium otherwise reports your machine's.
  • IncludedUse the context-level proxy when one script drives several lines; the launch-level proxy applies to every context.
  • IncludedWebRTC in headless Chromium can still expose the machine's address; block it with a launch flag or an extension when the target checks it.

Accounts per line

How many accounts on one line

Scripted checks can share a line freely; account work follows the calculator's numbers.

Platformgrowthmaintenance
Instagram / Threads3 per line8 per line
X / Twitter5 per line10 per line
Reddit5 per line10 per line
LinkedIn4 per line8 per line
Other4 per line8 per line
Open the calculator

Verification checklist

Before the first account

  • IncludedThe IP-checking page inside the context returns a mobile-carrier address in the line's country.
  • IncludedThe timezone the page reports matches that country.
  • IncludedThe script's first authenticated action succeeds without a challenge.

What each check proves is on the verification page.

Pitfalls

What goes wrong

  • A SOCKS5 proxy with a password fails silently in Chromium; use the HTTP port.
  • Rotating too frequently does more harm than good; change the exit only when a run needs it.
  • The rotation link is not a proxy address.

Questions

Playwright and mobile lines

All setup pages

Yes. Pool sends every new connection through a different SIM, which suits stateless collection, and needs no rotation calls from the script.