02 — Access
API keys, scoped & rotatable.
Each key gets its own scope (which targets it can hit, which proxies it can use), its own usage meter, and its own log. Rotate without redeploying — old keys keep working until you revoke.
Active keys 0 live keys in workspace
API requests · 7d — real counts arrive in a future release
GB billed · 7d — across all keys
Region · primary — by bytes · 7d
Your keys
Click a key name to scope it, rename it, or rotate the secret
Name Key Last used Sessions · 7d Data · 7d
Tip · scope keys to single hosts to limit blast radius Rotation policy →
API requests · live
Across all keys · last 30 minutes
connecting
No activity yet. Spin up your first session to see events stream in here.
Your first request
If you've never hit /v1/sessions — start here
- 01 Create a keyClick + Create key. Scope it to one host while you experiment.
- 02 Store the secretSave it as CHASER_KEY in .env. It's shown once — we don't store it in plain text.
- 03 POST a sessionTwo HTTP calls and a CDP connect. Your existing Playwright (or Patchright) script does the rest.
- 04 Watch it runThe Sessions tab will show the new run live — including bytes, proxy, and any challenge the target threw.
Same request, every runtime
The two-line drop-in — pick your language
// first-session.ts
// npm i patchright
import { chromium } from 'patchright';
import { writeFileSync } from 'fs';
const { cdp_url, id } = await fetch(
'https://api.chaser.sh/v1/sessions',
{
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.CHASER_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ ttl_seconds: 600 }),
}
).then(r => r.json());
const browser = await chromium.connectOverCDP(cdp_url);
const context = browser.contexts()[0];
const page = context.pages()[0] ?? await context.newPage();
await page.goto('https://www.cloudflare.com');
const png = await fetch(
`https://api.chaser.sh/v1/sessions/${id}/screenshot`,
{ method: 'POST', headers: { Authorization: `Bearer ${process.env.CHASER_KEY}` } }
).then(r => r.arrayBuffer());
writeFileSync('screenshot.png', Buffer.from(png));
await fetch(`https://api.chaser.sh/v1/sessions/${id}`, { method: 'DELETE' });