Skip to main content
GET
/
v1
/
sessions
/
{id}
/
events
/
stream
Stream Events (SSE)
curl --request GET \
  --url https://api.bctrl.ai/v1/sessions/{id}/events/stream \
  --header 'Authorization: Bearer <token>'
{
  "event: connected": {},
  "event: session.event": {}
}
id
string
required
Session ID.
after
string
Resume from cursor. Events after this point will be backfilled then streamed live.
eventTypes
string | string[]
Filter by event type(s). Comma-separated or repeated param.
The stream sends a :heartbeat comment every 15 seconds. Supported event types for Playwright: console, page.crash, page.dialog, page.domcontentloaded, page.download, page.filechooser, page.frame_attached, page.frame_detached, page.navigated, page.load, page.popup, page.request, page.error, page.request_failed, page.request_finished, page.response, page.websocket, page.worker, page.closed, context.page_created, context.closed.

Examples

// The SDK uses this endpoint internally to power page.on().
// You typically don't call it directly — just use event listeners:
import { Bctrl } from '@bctrl/sdk';

const bctrl = new Bctrl({ apiKey: process.env.BCTRL_API_KEY! });

const pw = await bctrl.session.playwright();

pw.page.on('console', (msg) => {
  console.log(`[${msg.type()}] ${msg.text()}`);
});

pw.page.on('request', (req) => {
  console.log('Request:', req.url());
});

await pw.page.goto('https://example.com');

Response

event: connected
SSE
required
Sent immediately on connection with &#123; sessionId, cursor, eventTypes &#125;.
event: session.event
SSE
required
Emitted for each matching event with &#123; sessionId, cursor, event &#125;.
Response Example
event: connected
data: {"sessionId":"sess_abc123","cursor":null,"eventTypes":null}

event: session.event
data: {"sessionId":"sess_abc123","cursor":"2025-01-15T10:00:01Z|evt_1","event":{"id":"evt_1","sessionId":"sess_abc123","sessionType":"browser","eventType":"page.navigated","eventData":{"url":"https://example.com"},"createdAt":"2025-01-15T10:00:01Z"}}