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
- 1Launch the browser, or create a context, with the proxy option set to the line's HTTP endpoint and credentials.
- 2Set the context's timezone, locale and geolocation to the line's country.
- 3Open an IP-checking page first and assert the exit before the script does anything else.
- 4Keep one context per account and one line per account group.
- 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
- timezoneId and locale on the context must match the line's country; Chromium otherwise reports your machine's.
- Use the context-level proxy when one script drives several lines; the launch-level proxy applies to every context.
- WebRTC 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.
| Platform | growth | maintenance |
|---|---|---|
| Instagram / Threads | 3 per line | 8 per line |
| X / Twitter | 5 per line | 10 per line |
| 5 per line | 10 per line | |
| 4 per line | 8 per line | |
| Other | 4 per line | 8 per line |
Verification checklist
Before the first account
- The IP-checking page inside the context returns a mobile-carrier address in the line's country.
- The timezone the page reports matches that country.
- The 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
Yes. Pool sends every new connection through a different SIM, which suits stateless collection, and needs no rotation calls from the script.