Integration

Use browser.city with OpenClaw (skills + stealth browsing)

OpenClaw already has web_fetch and browser tools. Add browser.city as a skill-backed browser backend when you need stealth rendering, remote interaction, or clean markdown extraction.

OpenClaw already gives you three useful primitives:

  • web_fetch for plain HTTP fetch + readable extraction
  • browser for local or remote CDP-driven browser control
  • skills for teaching the agent new tool flows

browser.city fits best as the stealth browser backend when you need:

  • JS rendering + clean markdown on blocked sites
  • residential / geo egress
  • remote interactive steps over HTTP (/v1/do/*)
  • extraction as an API instead of driving a local browser profile

Practical split:

  • Use OpenClaw’s built-in web_fetch for simple public pages.
  • Use OpenClaw’s browser tool for local/manual-login flows and human verification.
  • Use browser.city when the page is guarded, JS-heavy, geo-sensitive, or you want deterministic remote browser infrastructure behind a skill.

1) Add a browser.city skill to OpenClaw

OpenClaw skills can live in either:

  • <workspace>/skills/browsercity
  • ~/.openclaw/workspace/skills/browsercity

In SKILL.md, tell OpenClaw to:

  • prefer browser.city Request API for URL -> markdown
  • escalate to browser.city Humanized REST (/v1/do/*) when a page needs click/type/navigation
  • keep secrets in BROWSERCITY_API_KEY
  • fall back to the native OpenClaw browser tool when you explicitly want a local/manual-login browser

You do not need a heavy plugin for this. A simple skill that points the agent at one of the helpers below is enough.

2) Helper: URL -> markdown (Request API)

This is the best default for OpenClaw when you want a deterministic read tool with stealth rendering.

browsercity-request.ts
const apiKey = process.env.BROWSERCITY_API_KEY!;const opts = { method: "POST", headers: { Authorization: `Bearer ${apiKey}` } };export async function browsercityMarkdown(url: string): Promise<string> {  const res = await fetch("https://api.browser.city/v1/requests", {    ...opts,    body: JSON.stringify({ url, markdown: true }),  }).then((r) => r.json());  return String(res.content ?? "");}

3) Helper: open -> navigate -> markdown (Humanized REST)

When OpenClaw needs a remote browser session but you do not want to run Playwright inside the OpenClaw runtime, use /v1/do/*.

browsercity-browse.ts
const apiKey = process.env.BROWSERCITY_API_KEY!;const opts = { method: "POST", headers: { Authorization: `Bearer ${apiKey}` } };const post = (path: string, body: unknown) =>  fetch("https://api.browser.city" + path, {    ...opts,    body: JSON.stringify(body),  }).then((r) => r.json());export async function browsercityBrowseMarkdown(url: string): Promise<string> {  const open = await post("/v1/do/open", { browser: "chromium" });  const sessionId = open.result as string;  await post("/v1/do/navigate", { sessionId, url });  const md = await post("/v1/do/markdown", { sessionId });  return String(md.result ?? "");}

4) Good OpenClaw prompt patterns

Try prompts like:

Use the browsercity skill to fetch https://example.com/docs as markdown. If the page needs interaction, escalate to the interactive helper.

Use the native OpenClaw browser for manual login, then switch back to browser.city for large-scale extraction.

That split works well because OpenClaw remains the planner, while browser.city handles the stealth browsing primitives.

What to use when

  • Use OpenClaw web_fetch for fast public pages with no JS requirements.
  • Use OpenClaw browser for local/manual-login browsing and human verification.
  • Use browser.city Request API for stealth URL -> markdown at scale.
  • Use browser.city Humanized REST for remote interactive flows without Playwright inside OpenClaw.
  • Use browser.city Sessions only when you already want a real Playwright workflow outside OpenClaw.
[ 06 / 06 ] — Get Started

Start building in under a minute

Free tier. No credit card. Full stealth from day one.