CHASER
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

  1. 01
    Create a key
    Click + Create key. Scope it to one host while you experiment.
  2. 02
    Store the secret
    Save it as CHASER_KEY in .env. It's shown once — we don't store it in plain text.
  3. 03
    POST a session
    Two HTTP calls and a CDP connect. Your existing Playwright (or Patchright) script does the rest.
  4. 04
    Watch it run
    The 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' });