Skip to main content

Sessions

Sessions keep the same worker (browser) assigned to you across multiple requests, so your cookies, tabs, and login state carry over between calls.

Plan Requirement

Sessions require a Standard or Pro plan.

Start a Session

Add session.preserve: true to your request. The response includes a sessionId and the workerId — save both for subsequent requests.

{
"actions": [
{ "openNewTab": "https://example.com/login" },
{ "fill": ["input[name=email]", "user@example.com"] },
{ "fill": ["input[name=password]", "password123"] },
{ "click": "button[type=submit]" },
{ "waitForElement": ".dashboard" }
],
"session": { "preserve": true }
}

Response:

{
"success": true,
"data": { "success": true },
"workerId": "-Om8GAObZSvE8trPMPZF",
"sessionId": "sess_a1b2c3d4e5f6",
"duration": 5400
}

Continue a Session

Send the sessionId and workerId from the previous response:

{
"actions": [
{ "click": ".settings-link" },
{ "screenshot": "viewport" }
],
"workerId": "-Om8GAObZSvE8trPMPZF",
"session": { "id": "sess_a1b2c3d4e5f6" }
}

The session timeout is automatically refreshed on each request.

Close a Session

When you're done, close the session to release the worker:

{
"actions": [
{ "screenshot": "viewport" }
],
"workerId": "-Om8GAObZSvE8trPMPZF",
"session": {
"id": "sess_a1b2c3d4e5f6",
"close": true
}
}

Custom Session Timeout

Default session timeout is 5 minutes. Set a custom timeout (60 seconds to 30 minutes):

{
"actions": [...],
"session": {
"preserve": true,
"timeout": 600000
}
}

Override an Existing Session

If a worker is stuck in reserve state (e.g. your previous request crashed before closing the session), use session: { override: true } to force-claim it.

Without workerId — automatically picks any of your reserved workers:

{
"actions": [...],
"session": { "override": true }
}

With workerId — force-claims that specific worker:

{
"actions": [...],
"workerId": "-Om8GAObZSvE8trPMPZF",
"session": { "override": true }
}
warning

Override drops the existing session immediately. Any state from the previous session (tabs, cookies, login) is still in the browser, but the old sessionId is no longer valid.

Session Lifecycle Summary

ActionRequestResult
Startsession: { preserve: true }Worker reserved, sessionId returned
ContinueworkerId + session: { id: "..." }Reuses worker, refreshes timeout
CloseworkerId + session: { id: "...", close: true }Worker released to online
Overridesession: { override: true }Force-claims a reserved worker
Custom timeoutsession: { preserve: true, timeout: 600000 }10-minute session

Example: Multi-Step Workflow

// Step 1: Login and start session
POST /v1/
{
"actions": [
{ "openNewTab": "https://app.example.com/login" },
{ "fill": ["#email", "user@example.com"] },
{ "fill": ["#password", "pass123"] },
{ "click": "#login-btn" },
{ "waitForElement": ".dashboard" }
],
"session": { "preserve": true }
}
// → Returns sessionId + workerId
// workerId: -Om8GAObZSvE8trPMPZF
// sessionId: sess_a1b2c3d4e5f6

// Step 2: Navigate and extract data
POST /v1/
{
"actions": [
{ "click": ".reports-link" },
{ "waitForElement": ".report-table" },
{ "extractAll": "tr.report-row", "options": {
"fieldMap": { "name": "td:first-child", "value": "td:last-child" },
"save": "reports"
}},
{ "getSavedData": ["reports"] }
],
"workerId": "-Om8GAObZSvE8trPMPZF",
"session": { "id": "sess_a1b2c3d4e5f6" }
}

// Step 3: Close session
POST /v1/
{
"actions": [
{ "screenshot": "fullpage" }
],
"workerId": "-Om8GAObZSvE8trPMPZF",
"session": { "id": "sess_a1b2c3d4e5f6", "close": true }
}