Humans helping agents.

Every other AI tool is agents helping humans. This one is the other way around. When your agent gets stuck, your run is failing anyway. One API call brings a real person into the browser to finish it. Pay only if they solve it - if they can't, you've lost nothing.

agent.js
const pilot = require('./pilot')('https://pilotapp.dev', {
  apiKey: process.env.PILOT_KEY
});

// agent hits a wall. one line gets a human to fix it.
const result = await pilot.rescue(page, 'Solve login');

if (result.solved) {
  // page state preserved, continue from where you left off
}
Before you start
  • You need a cloud browser (Browserbase, Browserless, or similar). Pilot can't reach localhost.
  • Your agent uses puppeteer.connect() or playwright.connectOverCDP(), not local puppeteer.launch().
  • Each rescue() call blocks 2-5 minutes while a human solves the problem.
how it works

Three steps. One unblock.

No SDK magic. No agents pretending to be humans. One function call pauses your code, a person solves the problem, your code continues.

01 / RESCUE

One line, any wall

Call pilot.rescue(page, context). We connect to your browser over CDP, open a live session, pause your agent.

02 / OPERATOR

A real human, on call

Operator gets a Telegram ping with a live link. They see your browser, click, type, scroll - whatever it takes.

03 / CONTINUE

Handoff, not handover

Operator clicks Done. Your rescue() returns. Page state is preserved - no restart, no replay.

docs

Read the whole API in five minutes.

Minimal surface: one SDK function, a handful of optional parameters, no magic.

quickstart

1. Install

bash
curl -o pilot.js https://pilotapp.dev/public/sdk.js

2. Use

jsagent.js
const pilot = require('./pilot')('https://pilotapp.dev', {
  apiKey: process.env.PILOT_KEY
});

const result = await pilot.rescue(page, 'Solve login');

if (!result.solved) {
  // result.error: "unsolvable" | "timeout" | "browser_died"
  // result.message: operator's reason, if any
}

Guides

pricing

Pay only for what works.

Start free. Buy more when you need them. Credits are only deducted on successful rescues. No subscription.

Free
$0 / forever

10 rescues on the house. Enough to wire up the SDK and run it against real traffic.

  • 10 free credits on signup
  • Email only, no credit card
  • All features included

Your API key

Save this - it won't be shown again.

10 free credits ready. Quickstart →

questions

Answers.

Typical solve time is 2-5 minutes. A grid CAPTCHA is under a minute; a 2FA code that arrives by email or phone depends on delivery. You control the timeout via the timeout option.

No. Pilot connects to your browser over the public internet via Chrome DevTools Protocol. Localhost isn't reachable from our server, so you need a cloud browser provider (Browserbase, Browserless, Steel, or any service exposing a public wss:// CDP endpoint).

The operator marks it unsolvable and optionally writes a reason (e.g. "credentials needed"). Your agent receives { solved: false, error: 'unsolvable', message: '...' } and can decide what to do - retry, ask the user, escalate. No credit is charged for unsolved rescues.

Anything with a Chromium session handle exposed over CDP: Playwright (via connectOverCDP), Puppeteer (via puppeteer.connect), Browserbase, Browserless, Steel. Node SDK; Python via the Browser Use plugin. Firefox and WebKit don't speak CDP.

10 free rescues on signup. After that, 50 credits for $49 - one-time, no subscription. You only pay for successful rescues.

Rescue links are HMAC-SHA256 signed with a 10-minute expiry. All operator actions require a valid rescue token. The operator sees your live browser via CDP screencast - nothing more. We don't store page content or credentials.