Drive real cloud browsers in plain English: extract structured data, run autonomous agents, open live sessions you can watch, and schedule reusable jobs.
Base URL https://api.browseit.live. Every request sends your key as a Bearer token: find and rotate your key on your dashboard (rotating it immediately invalidates the old one).
Authorization: Bearer byd_xxxxxxxxxxxxxxxxxxxx
Usage (sessions, browser-minutes, tasks, LLM spend) is metered per key and capped by your plan quota. Errors return JSON { "error": "…", "code": "…" }: branch on code.
Machine-readable: openapi.json (import into Postman, generate a client) · llms.txt (for AI coding tools).
| tasks / agent | Synchronous. A single call runs on the live-command budget (~95s), then returns. For longer or unattended work, save it as a Job (runs up to 5 hours). |
| sessions | Keep-alive: ping /heartbeat ~every 60s or the session is reaped. There is a hard max-minutes cap per session. |
| request body | Max 1 MB. Cookie injection max 200 cookies. |
| jobs | Run-now returns immediately (202); the run schedules on a background runner and starts within a few minutes. Poll the run for status. |
| quota | Sessions, browser-minutes, and LLM spend count against your plan; exceeding it returns 429. |
The fastest path is a one-shot task: point at a URL, describe what you want, get JSON back.
curl https://api.browseit.live/v1/tasks \
-H "Authorization: Bearer $BROWSEIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://news.ycombinator.com",
"instructions": "the top 3 story titles and their points",
"schema": {
"type": "object",
"properties": { "stories": { "type": "array", "items": {
"type": "object",
"properties": { "title": {"type":"string"}, "points": {"type":"number"} }
} } }
}
}'The new browser engine, rolling out: send "engine": "v2". A task runs up to 25 steps in one fresh browser and returns every step's result; a session gives you a live browser over one connection, or raw access for Playwright. Credit and usage: GET /v1/me.
Run steps in a fresh browser. Synchronous, up to 15 minutes.
| enginerequired | "v2" | Use the v2 engine. |
| stepsrequired | array | Up to 25. type: navigate {url}, back, forward, reload, wait {ms}, act {instruction}, observe {instruction}, extract {instruction, schema?} (required fields must be filled or the step fails), agent {instruction, maxSteps?}, screenshot {format?, fullPage?}, content, pdf, save {kind?: png|pdf|dom} (into Files), ip, evaluate {expression} (page JavaScript, JSON result), viewport {width, height}, tabs, tab_new {url?}, tab_switch {tabId}, tab_close {tabId}, save_login {domain, name?}. |
| browser | "light" | "full" | light: fastest (default for plain tasks). full: closest to a real Chrome (default with a saved login). |
| credentialId | string | Start signed in with a saved login. |
| proxyId | string | Your own proxy instead of ours. |
| continueOnError | boolean | Run every step even after one fails. |
Returns { ok, sessionId, results: [{ type, ok, data | error, ms }], finalUrl, usage, timing }
curl https://api.browseit.live/v1/tasks \
-H "Authorization: Bearer $BROWSEIT_KEY" -H "Content-Type: application/json" \
-d '{ "engine": "v2", "continueOnError": true, "steps": [
{ "type": "navigate", "url": "https://news.ycombinator.com" },
{ "type": "extract", "instruction": "the top 3 story titles",
"schema": { "type": "object", "properties": { "titles": { "type": "array", "items": { "type": "string" } } }, "required": ["titles"] } },
{ "type": "screenshot", "format": "png" },
{ "type": "evaluate", "expression": "document.title" } ] }'
# -> { "ok": true, "results": [ { "type": "navigate", "ok": true, ... }, ... ], "usage": {...}, "timing": {...} }Open a live browser. Returns a single-use connectUrl (valid 60 s) for the live view. With cdp: true (raw-browser grant needed), connect Playwright to the /cdp form of that link.
| enginerequired | "v2" | Use the v2 engine. |
| url | string | Start page. |
| browser | "light" | "full" | As for tasks. |
| credentialId | string | Start signed in with a saved login. |
| cdp | boolean | Raw access for Playwright: one shared context, downloads go to your Files. |
Returns 201 { session: { id, status }, connectUrl, expiresInSec: 60 }
// Playwright, connected to a Browseit browser (needs the raw-browser grant on your account)
const r = await fetch('https://api.browseit.live/v1/sessions', { method: 'POST',
headers: { Authorization: 'Bearer ' + process.env.BROWSEIT_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ engine: 'v2', cdp: true }) }).then((x) => x.json());
const browser = await chromium.connectOverCDP(r.connectUrl.replace('/s?t=', '/cdp?t='));
const page = await browser.contexts()[0].newPage(); // one shared context: newContext() is refused
await page.goto('https://example.com');A fresh connectUrl for the same browser. One connection lasts up to about 55 minutes; reconnect and the browser resumes from its last save point (cookies and open tabs, saved every minute). An idle browser ends after 5 minutes.
Returns { session, connectUrl, expiresInSec: 60 }
Your plan, usage (all time and this month) and credit: { period: "monthly" | "lifetime", quotaUsd, spentUsd, remainingUsd, resetsAt }.
One-shot browser actions in plain English. Point at a URL, say what you want, get a result or structured JSON back: no session to manage.
Run a single task. Provide exactly one of act, instructions+schema, or observe.
| url | string | Page to start on. Optional when sessionId is given. |
| act | string | Do something ("click Sign in", "add to cart"). |
| instructions | string | What to extract; pair with schema for typed JSON. |
| schema | JSON Schema | Shape of the data to return (with instructions). |
| observe | string | Ask what actions are available on the page. |
| sessionId | string | Run inside an existing live session instead of a one-off. |
| model | string | Override the model (must be allowed: see /v1/models). Models marked free are free: rate-limited, prompts may be logged by the provider; avoid for private/signed-in data. If a free model is busy or fails, the step runs on the paid fallback model; each AI step result says which model answered. |
Returns { ok, data, usage, taskId }: synchronous; runs on the live-command budget (~95s). For longer work, use a Job.
curl https://api.browseit.live/v1/tasks \
-H "Authorization: Bearer $BROWSEIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://news.ycombinator.com",
"instructions": "the top 3 story titles and their points",
"schema": {
"type": "object",
"properties": { "stories": { "type": "array", "items": {
"type": "object",
"properties": { "title": {"type":"string"}, "points": {"type":"number"} }
} } }
}
}'Act example: perform an action and return what happened.
curl https://api.browseit.live/v1/tasks \
-H "Authorization: Bearer $BROWSEIT_KEY" -H "Content-Type: application/json" \
-d '{ "url": "https://example.com/pricing", "act": "add the cheapest plan to the cart" }'Fetch a past task/agent run by id (the taskId a run returns).
Autonomous multi-step automation: give a goal, the agent plans and executes the steps itself (navigate, click, type, extract) until it is done.
Run an autonomous agent against a live session.
| sessionIdrequired | string | The live session to drive. |
| instructionrequired | string | The goal, in plain English. |
| url | string | Navigate here first. |
| credentialId | string | A saved password login the agent may use to sign in. |
| maxSteps | number | Cap the planning loop (default 12, max 20). |
Returns { ok, result: { success, summary, data, steps, stoppedReason, finalUrl, file? }, usage }: synchronous, ~95s budget.
curl https://api.browseit.live/v1/agent \
-H "Authorization: Bearer $BROWSEIT_KEY" -H "Content-Type: application/json" \
-d '{
"sessionId": "sess_…",
"instruction": "find the cheapest direct flight NYC->LON next Friday and return the price + airline"
}'Open a real cloud browser you can watch and drive. The liveUrl is a token-gated live view you can embed in an iframe.
Open a live browser. Returns a session id + token-gated liveUrl.
| url | string | Land on this page immediately (optional). |
| contextId | string | Reuse a saved login profile (see Contexts). |
| credentialId | string | Attach a saved login (cookies apply at start; password lets the agent sign in). |
| proxyId | string | Egress through one of your proxies instead of the default. |
| cookies | array | One-off cookie set to inject (max 200): alternative to a saved login. |
Returns { session: { id, liveUrl, startedAt, … }, cookieReport? }
curl https://api.browseit.live/v1/sessions \
-H "Authorization: Bearer $BROWSEIT_KEY" -H "Content-Type: application/json" \
-d '{ "contextId": "ctx_…", "proxyId": "px_…" }'
# -> { "session": { "id": "sess_…", "liveUrl": "https://…?token=…" } }List your sessions (live + ended) with duration and cost.
Fetch one session.
Navigate the browser to a URL.
| urlrequired | string | Destination (http/https). |
Keep the session alive: ping about every 60s (idle sessions are reaped).
Live bandwidth + performance + proxy status.
The egress IP the session is using (verify your proxy).
Current page HTML + visible text + title + URL.
PNG of the current page (?full=1 for full height).
PDF render of the current page.
Release the session.
Save a sequence of steps as a reusable automation and run it on demand. Runs execute on a background runner (up to 5 hours): poll the run history for results.
Create a job.
| namerequired | string | A label for the job. |
| stepsrequired | array | [{ instruction, url? }] run in order. |
| contextId | string | Run signed in against a saved login profile. |
| credentialId | string | Attach a saved login. |
| proxyId | string | Egress through one of your proxies. |
# 1) create a saved job
curl https://api.browseit.live/v1/jobs \
-H "Authorization: Bearer $BROWSEIT_KEY" -H "Content-Type: application/json" \
-d '{ "name": "Daily HN digest",
"steps": [ { "instruction": "list the top 5 story titles", "url": "https://news.ycombinator.com" } ] }'
# 2) run it (returns a runId; poll /v1/jobs/:id/runs)
curl -X POST https://api.browseit.live/v1/jobs/JOB_ID/run -H "Authorization: Bearer $BROWSEIT_KEY"List your jobs.
Fetch one job.
Update name / steps / attachments / enabled.
Delete a job.
Set a schedule (cron) to run automatically.
| schedule | { cron, tz } | 5-field cron + IANA timezone, e.g. { "cron": "0 8,20 * * *", "tz": "America/Toronto" }. |
| enabled | boolean | A disabled job never fires on its schedule. |
Run now: returns a runId (202). Poll the run for status + results.
Returns { runId, status }
Run history: status, per-step results, timing.
Fetch one run directly (poll this after Run-now).
Returns { run: { status, stepResults[], browserMs, … } }
Login-once browser profiles. Sign in during a session, save it as a context, and reuse it so future sessions/jobs start already authenticated.
List your saved contexts.
Create a context.
| namerequired | string | A label (often the site name). |
Fetch one context.
Rename a context.
Delete a context + its saved profile.
A write-only credential vault. Store a site login as a password or a cookie set; attach it to a session or job. Secrets are encrypted at rest and never returned.
List saved logins (never returns secrets).
Save a login.
| typerequired | "password" | "cookie" | Credential kind. |
| domainrequired | string | The site it applies to. |
| username / password | string | For a password login. |
| cookies | array | For a cookie login (Playwright/Chrome cookie JSON). |
Replace fields (secrets are replace-only, never shown).
Delete a saved login.
Bring your own residential/ISP proxies. Attach one to a session or job and it egresses through your IP; the password is encrypted and never returned.
List your proxies (never returns the password).
Add a proxy.
| hostrequired | string | Proxy hostname (must resolve to a public address). |
| portrequired | number | 1–65535. |
| username / password | string | Proxy auth (optional for IP-authed). |
| label | string | A name to recognize it by. |
Update a proxy (password replace-only).
Delete a proxy.
Artifacts your tasks and jobs export: screenshots, PDFs, page DOM, extracted JSON.
List exported files.
File metadata.
A signed download URL.
Delete a file.
Get notified on job + session events. We POST a signed JSON payload to your URL; verify it with the HMAC secret shown once at creation.
List your webhook subscriptions.
Subscribe a URL to events. Returns the signing secret ONCE.
| urlrequired | string | HTTPS endpoint to POST to. |
| events | string[] | Any of run.finished, run.failed, session.ended. Empty = all. |
Returns { webhook, secret } : signature header: X-Browseit-Signature: t=<ts>,v1=HMAC_SHA256(secret, "<ts>.<body>")
Remove a webhook.
Your plan, usage, keys, and available models.
Plan, quotas, and usage-to-date (sessions, browser-minutes, tasks, LLM spend).
Recent tasks + sessions.
The models you may choose from + the default.
List your API keys.
Rotate your API key (the old one stops working).
Common end-to-end patterns. Each composes the primitives above.
Save a login once, then attach it to a session or job so it starts signed in.
# 1) open a session with a saved login attached
curl https://api.browseit.live/v1/sessions -H "Authorization: Bearer $BROWSEIT_KEY" \
-H "Content-Type: application/json" -d '{ "credentialId": "cred_…", "url": "https://app.example.com/reports" }'
# 2) extract with the agent (already authenticated)
curl https://api.browseit.live/v1/agent -H "Authorization: Bearer $BROWSEIT_KEY" \
-H "Content-Type: application/json" -d '{ "sessionId": "sess_…", "instruction": "export this month's revenue as JSON" }'Save the steps as a Job, schedule it, and get a webhook when it finishes.
# create a scheduled job (8am daily): the run output is saved to Files each day
curl https://api.browseit.live/v1/jobs -H "Authorization: Bearer $BROWSEIT_KEY" \
-H "Content-Type: application/json" -d '{
"name": "Daily price check",
"steps": [ { "instruction": "extract the price as JSON", "url": "https://shop.example.com/item/42" } ],
"schedule": { "cron": "0 8 * * *", "tz": "America/Toronto" }, "enabled": true }'
# subscribe to completion events
curl https://api.browseit.live/v1/webhooks -H "Authorization: Bearer $BROWSEIT_KEY" \
-H "Content-Type: application/json" -d '{ "url": "https://your-app.com/hooks", "events": ["run.finished"] }'Open a session and drop its liveUrl (already token-gated) into an iframe. It stays live until you DELETE the session or it hits its time cap.
const { session } = await createSession(); // POST /v1/sessions
<iframe src={session.liveUrl} allow="clipboard-read; clipboard-write" />curl https://api.browseit.live/v1/sessions -H "Authorization: Bearer $BROWSEIT_KEY" \
-H "Content-Type: application/json" -d '{ "proxyId": "px_…" }'
curl https://api.browseit.live/v1/sessions/SESS_ID/ip -H "Authorization: Bearer $BROWSEIT_KEY" # -> your proxy's IP| code | meaning |
|---|---|
| 200 / 201 / 202 | Success (202 = accepted, still running: e.g. a job run). |
| 400 | Bad request: missing/invalid field, or an unsupported combination. |
| 401 | Missing or invalid API key. |
| 403 | Not allowed (e.g. a feature disabled for your account). |
| 404 | Not found (or not yours). |
| 409 | Conflict (e.g. a context already in use). |
| 429 | Quota reached: you hit a plan limit. |
| 502 / 503 | Upstream/browser issue or no free capacity: retry shortly. |
Errors return JSON { "error": "…" }. Prefer the playground to feel out prompts before wiring the API.