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
export async function browsercityMarkdown(url: string): Promise<string> {  const res = await fetch("https://api.browser.city/v1/requests", {    method: "POST",    headers: { Authorization: `Bearer ${process.env.BROWSERCITY_API_KEY}`, "Content-Type": "application/json" },    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 doUrl = (action: string) => `https://api.browser.city/v1/do/${action}`;const doAction = (action: string, body: unknown) =>  fetch(doUrl(action), {    method: 'POST',    headers: { Authorization: `Bearer ${process.env.BROWSERCITY_API_KEY}`, 'Content-Type': 'application/json' },    body: JSON.stringify(body),  }).then((r) => r.json());export async function browsercityBrowse(url: string) {  const opened = await doAction('open', { browser: 'chromium' });  try {    await doAction('navigate', { sessionId: opened.sessionId, url });    const page = await doAction('markdown', { sessionId: opened.sessionId });    return page.result;  } finally {    await doAction('close', { sessionId: opened.sessionId });  }}

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

Give your AI agents the web.

Start for free. No credit card required. Private sessions by default.