Unbrowse is the action layer for AI agents. It learns a site's first-party API routes from real browsing, then replays known routes directly instead of driving a browser for every task.
$ npx -y skills add unbrowse-ai/unbrowse --agent claude-code
Run the curl in your terminal, the rest in Claude Code.
Repo: unbrowse-ai/unbrowse
What's inside
Unbrowse is the action layer for AI agents. It learns a site's first-party API routes from real browsing, then replays known routes directly instead of driving a browser for every task.
npm install -g unbrowse@11.3.3
unbrowse setup
unbrowse "top stories with point counts" --url https://news.ycombinator.com
On a cache hit, Unbrowse resolves, executes, and reads the route in one call. On a miss, it can open a real browser, observe the working request, and make that route reusable. The browser remains available for login, consent, CAPTCHA, and UI-only flows.
The published 94-domain benchmark measured a 3.6ร mean and 5.4ร median speedup for warmed cached routes over Playwright. See Internal APIs Are All You Need and the benchmark notes.
The default interface is one command:
unbrowse "task" --url https://example.com
Useful lower-level commands:
unbrowse health
unbrowse fetch https://example.com
unbrowse resolve --intent "search products" --url https://example.com --no-execute
unbrowse capture --url https://example.com --intent "search products"
unbrowse auth https://example.com/login
Use go, snap, click, submit, and close when a task genuinely needs the
DOM. Run unbrowse <command> --help for the current options.
The current SDK ships inside the unbrowse package:
npm install unbrowse@11.3.3
import { createHole } from "unbrowse/sdk";
const result = await createHole().fill({
intent: "list tomorrow's events",
url: "https://calendar.google.com",
});
console.log(result.answer ?? result.items);
Use the lower-level client when your application should inspect route choices:
import { Unbrowse } from "unbrowse/sdk";
const unbrowse = new Unbrowse({ apiKey: process.env.UNBROWSE_API_KEY });
const resolved = await unbrowse.resolve({
intent: "find recent TypeScript releases",
contextUrl: "https://github.com/microsoft/TypeScript/releases",
});
const endpoint = resolved.available_operations?.[0];
if (endpoint) {
const result = await unbrowse.execute({ endpoint_id: endpoint.endpoint_id });
console.log(result.data);
}
See the SDK quickstart for retries, typed errors, proxy options, and account resources.
Unbrowse uses API keys for account access and credits for metered work.
unbrowse register --email you@example.com
unbrowse dashboard
No separate payment setup is required. Added, promotional, and earned credits live in one account ledger.
const credits = await unbrowse.account.credits();
console.log(`${credits.balance_credits} credits`);
unbrowse setup installs the Agent Skill by default. MCP is an optional
compatibility surface:
unbrowse setup --mcp
The Agent Skill teaches compatible hosts the current flat CLI commands and the preferred one-call flow.
git clone --recursive https://github.com/unbrowse-ai/unbrowse.git
cd unbrowse
bun install
./setup
bun test
The local runtime listens on 127.0.0.1:6969 by default. Site profiles and
credentials are stored below ~/.unbrowse/; logs and route caches are kept
separate so they can be inspected or removed independently.
Unbrowse is MIT licensed. See the open-source notice for the client/server boundary.
.github/
FUNDING.yml
workflows/
release.yml
CONTRIBUTING.md
docs/
adapters.md
api/
x402.md
architecture/
ACCEPTANCE-CRITERIA.md
AUTH.md
BACKEND.md
CLI.md
FRONTEND.md
OVERVIEW.md
PERFORMANCE.md
PRIVACY.md
README.md
SECURITY.md
TEST-SPECS.md
benchmarks-history.md
benchmarks.md
caching.md
CATALOGUE.md
CLAIM_YOUR_DOMAIN.md
concepts/
claiming-a-website.md
contract-biological-architecture.md
contract-platform.md
contract-substrate.md
energy-ranking.md
evaluation-framing.md
fare-splits.md
route-graph-as-asset.md
shadow-apis.md
trust-and-accountability.md
verification-and-proofs.md
EARN_AS_INDEXER.md
for-agents/
credits.md
how-an-agent-uses-unbrowse.md
mcp-integration.md
resolve-and-execute.md
search-on-top.md
wallets-and-payments.md
when-it-uses-a-browser.md
for-developers/
agent-sdk-adapters.md
drop-in-adapters.md
integration-surfaces.md
python-adapters.md
sdk-quickstart.md
the-route-lifecycle.md
guides/
quickstart.md
HOW_UNBROWSE_PAYS.md
mcp-workflow-guide.md
onboarding.md
OPEN-SOURCE-NOTICE.md
public/
lobster-cash-integration.md
pay-integration.md
POSITIONING.md
primitives/
01-pointer-not-payload.md
02-residential-proxy-fallback.md
03-interstitial-shortcut.md
04-x402-and-faremeter.md
05-user-response-never-contains.md
06-domain-opt-out.md
07-fair-split-and-claim.md
08-deploy-gate.md
09-dimensional-bench.md
10-kuri-first-principles-roadmap.md
11-release-on-boost.md
12-preload-link-extraction.md
13-x402-facilitator-choice.md
14-stripe-x402-bridge.md
15-skills-security-audit.md
README.md
README.md
sdk/
build-on-unbrowse.md
developer-recipes.md
onboarding-users.md
onboarding-validators.md
rewards-and-economics.md
SECURITY.md
start-here/
in-plain-english.md
the-browser-discovery-tax.md
the-shared-route-graph.md
what-is-unbrowse.md
SUMMARY.md
THE_FDRY_ECONOMY.md
the-unbrowse-papers.md
vision.md
wallets.md
whitepaper/
.gitbook.yaml
coming-soon.md
credential-sovereignty.md
evaluation.md
for-investors.md
for-technical-readers.md
how-it-works.md
key-concepts.md
mental-models.md
network-layer.md
paper-vs-product.md
plain-english.md
README.md
SUMMARY.md
system-today.md
the-problem.md
unbrowse-whitepaper.pdf
what-is-unbrowse.md
LICENSE
packages/
adopt/
bin/
adopt.mjs
package.json
README.md
src/
index.ts
test/
codemod.test.ts
ai-sdk/
package.json
README.md
src/
index.ts
test/
shape.test.ts
axios-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
cross-fetch-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
exa-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
extraction-core/
package.json
src/
dom.ts
index.ts
intent-match.ts
tsconfig.json
firecrawl-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
tsconfig.json
got-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
ky-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
langchain-js/
package.json
README.md
src/
index.ts
test/
shape.test.ts
llamaindex/
package.json
README.md
src/
index.ts
test/
shape.test.ts
mastra/
package.json
README.md
src/
index.ts
test/
shape.test.ts
node-fetch-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
openai-agents/
package.json
README.md
src/
index.ts
test/
shape.test.ts
playwright-shim/
package.json
README.md
src/
chromium.ts
index.ts
types.ts
unbrowse-client.ts
test/
shape.test.ts
tsconfig.json
puppeteer-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
py-aiohttp/
.gitignore
pyproject.toml
README.md
src/
unbrowse_aiohttp/
__init__.py
tests/
test_shape.py
py-browser-use/
.gitignore
pyproject.toml
README.md
src/
unbrowse_browser_use/
__init__.py
tests/
test_shape.py
py-crewai/
.gitignore
pyproject.toml
README.md
src/
unbrowse_crewai/
__init__.py
tests/
test_shape.py
py-exa/
.gitignore
pyproject.toml
README.md
src/
unbrowse_exa/
__init__.py
tests/
test_shape.py
py-httpx/
.gitignore
pyproject.toml
README.md
src/
unbrowse_httpx/
__init__.py
tests/
test_shape.py
py-pydantic-ai/
.gitignore
pyproject.toml
README.md
src/
unbrowse_pydantic_ai/
__init__.py
tests/
test_shape.py
py-requests/
.gitignore
pyproject.toml
README.md
src/
unbrowse_requests/
__init__.py
tests/
test_shape.py
py-urllib3/
.gitignore
pyproject.toml
README.md
src/
unbrowse_urllib3/
__init__.py
tests/
test_shape.py
selenium-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
skill/
README.md
SKILL.md
stagehand-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
tsconfig.json
superagent-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
tavily-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
undici-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
wretch-shim/
package.json
README.md
src/
index.ts
test/
shape.test.ts
README.md
SECURITY.md
SKILL.md
src/
interop/
agent-primitives.ts
discover.ts
mount.ts
sources.ts
version.jsonFAQ
unbrowse is a Claude Code plugin with 1 hand-picked skill for automation work, indexed on Flowy. Install it with the command on its page. It includes unbrowse. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.