Docs
Dashboard
API reference / SessionsBeta

List sessions

List sessions.

GET/v1/sessions

Request

Method and pathGET/v1/sessions
Base URLhttps://api.boxline.dev
AuthenticationYour API key in the x-api-key header (or Authorization: Bearer). The examples read it from BOXLINE_API_KEY.

Query parameters

NameTypeDefaultAllowed valuesDescription
statusstring––Comma-separated statuses, e.g. RUNNING,STOPPED.
kindstring–browser, combined, shellbrowser (no shell), combined (browser and shell) or shell (no browser).
qstring––A session id prefix, or text found in userMetadata.
fromstring––Created at or after (ISO date). Format: date-time.
tostring––Created at or before (ISO date). Format: date-time.
sortstringcreated_desccreated_desc, created_asc, duration_desc
limitinteger50–From 1 to 500.
afterstring––The next value of the previous page (same filters and sort). Opaque; do not build it yourself.
curl "https://api.boxline.dev/v1/sessions?status=RUNNING&limit=20" \  -H "x-api-key: $BOXLINE_API_KEY"

Responses

200 OK

A page of sessions, and how many match the filters in all.

Fields

NameTypeDefaultAllowed valuesDescription
dataobject[]––
data[].idstring––
data[].statusstring–RUNNING, STOPPED, DELETED, ERRORRUNNING; STOPPED (saved, no machine, free); DELETED (ended for good, its data gone); ERROR (only a session that never started).
data[].projectIdstring––
data[].regionstring––
data[].browserboolean––
data[].shellboolean––
data[].keepAliveboolean––
data[].timeoutinteger––Seconds.
data[].idleTimeoutinteger | null––Seconds without activity after which it stops (stopReason idle); null: off.
data[].createdAtstring––Format: date-time.
data[].startedAtstring | null––Format: date-time.
data[].expiresAtstring––Format: date-time.
data[].stoppedAtstring | null––When it stopped (null while it runs; cleared by a resume). Format: date-time.
data[].stopReasonstring | null––requested, timeout, idle, no_clients, agent_run, task, machine_lost, api_restart, account_recovered, suspended, spend_limit or out_of_credit.
data[].deletesAtstring | null––When a stopped session is deleted automatically: stoppedAt plus the plan's retentionDays, fixed when it stops. Format: date-time.
data[].deletedAtstring | null––Format: date-time.
data[].deleteReasonstring | null–requested, retention, null
data[].connectUrlstring | null––CDP WebSocket for Playwright/Puppeteer (null without a browser or unless the session is running). Treat it like a password.
data[].liveUrlstring | null––The live view page (null without a browser
data[].terminalUrlstring | null––The terminal WebSocket (null without a shell). Treat it like a password.
data[].proxynull | object | object[]––The session's proxy as given, without passwords.
data[].proxy.typestring–residential, datacenter, custom
data[].proxy.countrystring––Two-letter country code (residential and datacenter).
data[].proxy.statestring––Residential, US states, e.g. us_california (implies US).
data[].proxy.citystring––Residential, e.g. los_angeles (needs country).
data[].proxy.ipstring–sticky, rotatingDefault sticky for sessions and crawls, rotating for fetch, screenshot, pdf and extract.
data[].proxy.scopestringbrowserbrowser, allall also routes the session's shell.
data[].proxy.serverstring––custom: your proxy, http://host:port or https://host:port, on a public address.
data[].proxy.usernamestring––
data[].proxy[].domainPatternstring––Up to 256 characters.
data[].browserSettingsobject––What is in force (locale and timezone null = the browser's own default).
data[].browserSettings.modestring–standard, realistic
data[].browserSettings.localestring | null––
data[].browserSettings.timezonestring | null––
data[].viewportobject | null––
data[].viewport.widthinteger––From 200 to 3840.
data[].viewport.heightinteger––From 200 to 2160.
data[].trajectoriesEligibleboolean––
data[].captchastring–ask, ignore, solveWhat happens when a CAPTCHA waits for a person. ask (default): agent runs and steps pause and hand over. ignore: they carry on. solve (opt-in, paid plans): the platform tries to solve it first.
data[].attentionobject | null––A CAPTCHA waiting (or being solved), else null.
data[].attention.typestring–captcha
data[].attention.kindstring–recaptcha, hcaptcha, turnstile, cloudflare, datadome, arkose, human
data[].attention.urlstring––
data[].attention.tabIdstring––
data[].attention.sincestring––Format: date-time.
data[].attention.statestring–solving, waiting
data[].attention.reasonstring––
data[].blockAdsboolean––
data[].blockedRequestsinteger––Requests to ad and tracker sites refused so far (collected about every 30 s).
data[].cookieBannersstring–reject, off"off" for sessions without a browser, and for sessions created before the option existed.
data[].extensionsstring[]––The extension ids the session started with.
data[].workspacePathstring––
data[].profileIdstring | null––
data[].profilePersistboolean––Whether the session saves its sign-ins back to profileId when it ends (persist:true, or attached with fromSession). false without a profile.
data[].userMetadataobject––
data[].checkpointAtstring | null––Format: date-time.
data[].recoveriesinteger––Times the session was brought back on a new machine after its machine stopped.
data[].errorstring | null––
data[].recordSessionboolean––
data[].setupstring[]––
data[].setupStatusstring–none, running, done, failed
data[].setupErrorstring | null––
data[].envstring[]––Names of the session's env variables (values are never returned).
data[].credentialsstring[]––Names of the credentials its shell exports (a profile's linked one included).
data[].hasRecordingboolean––
data[].usageobject––
data[].usage.secondsnumber––
data[].usage.costUsdnumber––
totalinteger––Sessions matching the filters.
limitinteger––
nextstring | null––Pass it back as after for the next page; null on the last page.
Response 200
{  "data": [    {      "id": "6c1f3c9e-1d2a-4f67-9b0e-1b2c3d4e5f60",      "status": "RUNNING",      "projectId": "prj_Hk2Lq8Zx0Vb5Nm1C",      "region": "us-east-1",      "browser": true,      "shell": false,      "keepAlive": false,      "timeout": 300,      "createdAt": "2026-09-29T10:00:00.000Z",      "startedAt": "2026-09-29T10:00:00.000Z",      "expiresAt": "2026-09-29T10:05:00.000Z",      "stoppedAt": null,      "stopReason": null,      "deletesAt": null,      "deletedAt": null,      "deleteReason": null,      "connectUrl": "wss://connect.boxline.dev/v1/connect?sessionId=6c1f3c9e-1d2a-4f67-9b0e-1b2c3d4e5f60&token=…",      "liveUrl": "https://api.boxline.dev/live/6c1f3c9e-1d2a-4f67-9b0e-1b2c3d4e5f60?token=…",      "terminalUrl": null,      "proxy": null,      "browserSettings": {        "mode": "standard",        "locale": null,        "timezone": null      },      "viewport": {        "width": 1280,        "height": 720      },      "trajectoriesEligible": false,      "captcha": "ask",      "attention": null,      "blockAds": false,      "blockedRequests": 0,      "cookieBanners": "reject",      "extensions": [],      "workspacePath": "/workspace",      "profileId": null,      "profilePersist": false,      "userMetadata": {},      "checkpointAt": null,      "recoveries": 0,      "error": null,      "recordSession": true,      "setup": [],      "setupStatus": "none",      "setupError": null,      "env": [],      "credentials": [],      "hasRecording": false,      "usage": {        "seconds": 12.3,        "costUsd": 0.00015      }    }  ],  "total": 0,  "limit": 0,  "next": "eyJvIjoiY3JlYXRlZF9kZXNjIiwidCI6IjIwMjYtMDktMjlUMTA6MDA6MDAuMTIzNDU2WiIsImkiOiI2YzFmIn0"}

Errors

Errors have a matching HTTP status and the same body. code is stable, so check it in your code; message is for people. See Errors and request ids.

StatusCodesWhen
400 Bad Requestinvalid_request, invalid_json, invalid_cursor, invalid_idempotency_key, invalid_extension, variables_with_extensions, terms_not_accepted, invalid_reset_token, invalid_confirmation_code, wrong_password, no_password, invalid_next, invalid_oauth_tokenThe request is not valid.
401 UnauthorizedunauthorizedMissing or invalid API key.
Error body
{  "error": {    "code": "not_found",    "message": "session not found",    "requestId": "req_4fJx0aQm2Lk9Pz7N"  }}

Learn more

These docs describe a beta API. Endpoints, fields and SDK methods may change before general availability; breaking changes will be listed in the changelog.