{
  "info": {
    "_postman_id": "browserbeam-v1-api",
    "name": "Browserbeam V1",
    "description": "Public API for LLM-optimized browser automation.\n\nBrowserbeam gives LLMs and agents a real browser they can see and control. Create a session, execute steps (navigate, click, fill, extract, screenshot), and destroy when done.\n\n## Authentication\n\nAll endpoints require an API key:\n```\nAuthorization: Bearer sk_live_...\n```\n\nGet your API key from the Browserbeam dashboard.\n\n## Concepts\n\n- **Session**: An isolated browser tab with its own cookies, storage, and viewport. Created via `POST /v1/sessions`, destroyed via `DELETE /v1/sessions/:id` or auto-expires.\n- **Steps**: Sequential browser actions executed in a single API call via `POST /v1/sessions/:id/act`. Steps can also be included in the create call.\n- **Refs**: Stable element identifiers (e1, e2, ...) assigned during observation. Use these to target elements.\n- **Page Map**: A lightweight structural outline (`page.map`) auto-included on first observe, showing page sections with hints and CSS selectors.\n- **Full Mode**: Use `mode: \"full\"` on observe to get content from all page sections (nav, sidebar, footer) organized by region.\n- **Auto-observe**: Every successful call returns fresh page state automatically.\n\n## Quick Start\n\n1. Set `base_url` and `api_key` variables\n2. Run \"Create Session + Navigate\" to get a session with page state\n3. Use the `session_id` and element refs for follow-up `/act` calls\n4. Destroy the session when done\n\n## Routes\n\n| Method | Path | Description |\n|--------|------|-------------|\n| `POST` | `/v1/sessions` | Create session (+ optional URL + steps) |\n| `GET` | `/v1/sessions/:id` | Get session info |\n| `POST` | `/v1/sessions/:id/act` | Execute steps on existing session |\n| `DELETE` | `/v1/sessions/:id` | Destroy session |\n| `GET` | `/v1/sessions` | List your active sessions |",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.browserbeam.com",
      "type": "string"
    },
    {
      "key": "api_key",
      "value": "",
      "type": "string"
    },
    {
      "key": "session_id",
      "value": "",
      "type": "string"
    }
  ],
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_key}}",
        "type": "string"
      }
    ]
  },
  "item": [
    {
      "name": "Sessions",
      "description": "Create, inspect, and destroy browser sessions.\n\nA session is an isolated browser context with its own cookies, storage, and viewport. Sessions auto-expire based on their `timeout` setting (default: 300 seconds).",
      "item": [
        {
          "name": "Create Session (bare)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var json = pm.response.json();",
                  "    pm.collectionVariables.set('session_id', json.session_id);",
                  "    pm.test('Session created', function() {",
                  "        pm.expect(json.session_id).to.match(/^ses_/);",
                  "        pm.expect(json.expires_at).to.be.a('string');",
                  "    });",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "Create a bare session with no navigation. Returns a `session_id` and `expires_at`.\n\nThe session ID is automatically saved to the `session_id` collection variable for use in follow-up requests.\n\nSend an empty body `{}` or customize with session options:\n- `timeout` (10–1800): Session lifetime in seconds. Default: 300.\n- `viewport`: `{width, height}`. Default: 1280×720.\n- `user_agent`: Custom User-Agent string. When omitted, a realistic user agent is assigned automatically.\n- `locale`: Browser locale (e.g. `en-US`).\n- `timezone`: Timezone ID (e.g. `America/New_York`).\n- `proxy`: All sessions are routed through a proxy (datacenter by default). Pass an object `{\"kind\": \"datacenter\"|\"residential\", \"country\": \"us\"|\"auto\"}` to customize, or a string URL for bring-your-own proxy (e.g. `http://user:pass@proxy:8080`).\n- `block_resources`: Resource types to block: `image`, `font`, `stylesheet`, `script`. Default: `[\"image\", \"font\"]`. Media is always blocked. Pass `[]` to unblock.\n- `auto_dismiss_blockers` (default: true): Auto-dismiss cookie banners, popups, chat widgets.\n- `cookies`: Array of cookie objects to inject. Each needs `name`, `value`, and `domain` or `url`."
          },
          "response": [
            {
              "name": "Bare Session Created",
              "status": "Created",
              "code": 201,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"session_id\": \"ses_abc123def456\",\n  \"expires_at\": \"2026-03-18T14:00:00.000Z\",\n  \"request_id\": \"req_1a2b3c4d5e6f\",\n  \"completed\": 0,\n  \"page\": null,\n  \"media\": [],\n  \"extraction\": null,\n  \"blockers_dismissed\": [],\n  \"error\": null\n}"
            }
          ]
        },
        {
          "name": "Create Session + Navigate",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var json = pm.response.json();",
                  "    pm.collectionVariables.set('session_id', json.session_id);",
                  "    pm.test('Session created with page state', function() {",
                  "        pm.expect(json.session_id).to.match(/^ses_/);",
                  "        pm.expect(json.page).to.not.be.null;",
                  "        pm.expect(json.page.url).to.be.a('string');",
                  "        pm.expect(json.page.interactive_elements).to.be.an('array');",
                  "    });",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com\"\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "Create a session and immediately navigate to a URL. Returns full page state including:\n- Markdown content of the page\n- Interactive elements with refs (e1, e2, ...)\n- Form structures\n- Scroll position\n- Auto-dismissed blockers (cookie banners, popups)\n\nThe `session_id` is saved automatically for follow-up requests."
          },
          "response": [
            {
              "name": "Session with Page State",
              "status": "Created",
              "code": 201,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"session_id\": \"ses_abc123def456\",\n  \"expires_at\": \"2026-03-18T14:00:00.000Z\",\n  \"request_id\": \"req_2b3c4d5e6f7a\",\n  \"completed\": 1,\n  \"page\": {\n    \"url\": \"https://example.com\",\n    \"title\": \"Example Domain\",\n    \"stable\": true,\n    \"markdown\": {\n      \"content\": \"# Example Domain\\n\\nThis domain is for use in illustrative examples...\"\n    },\n    \"interactive_elements\": [\n      {\"ref\": \"e1\", \"tag\": \"a\", \"label\": \"More information...\", \"role\": \"link\", \"in\": \"main\"}\n    ],\n    \"forms\": [],\n    \"map\": [\n      {\"section\": \"header\", \"selector\": \"header\", \"hint\": \"Example Domain (1 link)\"},\n      {\"section\": \"main\", \"selector\": \"main\", \"hint\": \"Example Domain (1 link)\"},\n      {\"section\": \"footer\", \"selector\": \"footer\", \"hint\": \"More information... (1 link)\"}\n    ],\n    \"changes\": null,\n    \"scroll\": {\"y\": 0, \"height\": 600, \"viewport\": 720, \"percent\": 100}\n  },\n  \"media\": [],\n  \"extraction\": null,\n  \"blockers_dismissed\": [],\n  \"error\": null\n}"
            }
          ]
        },
        {
          "name": "Create Session + Navigate + Steps",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var json = pm.response.json();",
                  "    pm.collectionVariables.set('session_id', json.session_id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com\",\n  \"steps\": [\n    {\"screenshot\": {}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "Create a session, navigate to a URL, and execute steps — all in one call.\n\n**Behavior matrix:**\n\n| `url` | `steps` | What happens |\n|-------|---------|-------|\n| — | — | Bare session, no navigation |\n| set | — | Navigate + auto-observe |\n| set | set | Navigate + execute steps + auto-observe |\n| — | set | Execute steps (first should be `goto`) + auto-observe |"
          },
          "response": []
        },
        {
          "name": "Create Session with Options",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var json = pm.response.json();",
                  "    pm.collectionVariables.set('session_id', json.session_id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com\",\n  \"timeout\": 120,\n  \"viewport\": {\"width\": 1920, \"height\": 1080},\n  \"user_agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...\",\n  \"locale\": \"en-US\",\n  \"timezone\": \"America/New_York\",\n  \"proxy\": {\"kind\": \"residential\", \"country\": \"us\"},\n  \"block_resources\": [\"image\", \"font\"],\n  \"auto_dismiss_blockers\": true,\n  \"cookies\": [\n    {\"name\": \"session_token\", \"value\": \"abc123\", \"domain\": \"example.com\", \"path\": \"/\", \"secure\": true, \"httpOnly\": true},\n    {\"name\": \"locale\", \"value\": \"en-US\", \"url\": \"https://example.com\"}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "Create a session with full configuration options including custom viewport, locale, timezone, and resource blocking."
          },
          "response": []
        },
        {
          "name": "Get Session Info",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}"]
            },
            "description": "Get the current status of a session.\n\nReturns session metadata from the database including status, timestamps, and which worker is handling it."
          },
          "response": [
            {
              "name": "Active Session",
              "status": "OK",
              "code": 200,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"session_id\": \"ses_abc123def456\",\n  \"status\": \"active\",\n  \"started_at\": \"2026-03-18T13:55:00.000Z\",\n  \"ended_at\": null,\n  \"duration_seconds\": null,\n  \"expires_at\": \"2026-03-18T14:00:00.000Z\"\n}"
            },
            {
              "name": "Closed Session",
              "status": "OK",
              "code": 200,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"session_id\": \"ses_abc123def456\",\n  \"status\": \"closed\",\n  \"started_at\": \"2026-03-18T13:55:00.000Z\",\n  \"ended_at\": \"2026-03-18T13:57:30.000Z\",\n  \"duration_seconds\": 150,\n  \"expires_at\": \"2026-03-18T14:00:00.000Z\"\n}"
            }
          ]
        },
        {
          "name": "List Sessions",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/v1/sessions?status=active&limit=25",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"],
              "query": [
                {"key": "status", "value": "active", "description": "Filter by status: active or closed"},
                {"key": "limit", "value": "25", "description": "Results per page (1-100, default 25)"},
                {"key": "after", "value": "", "description": "Cursor for next page (session_id)", "disabled": true}
              ]
            },
            "description": "List sessions for the authenticated API key.\n\nSupports cursor-based pagination and status filtering.\n\n**Query params:**\n- `status`: `active` or `closed` (default: all)\n- `limit`: Results per page, 1–100 (default: 25)\n- `after`: Cursor from `next_cursor` in previous response"
          },
          "response": [
            {
              "name": "Sessions List",
              "status": "OK",
              "code": 200,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"sessions\": [\n    {\n      \"session_id\": \"ses_abc123def456\",\n      \"status\": \"active\",\n      \"started_at\": \"2026-03-18T13:55:00.000Z\"\n    }\n  ],\n  \"has_more\": false,\n  \"next_cursor\": null\n}"
            }
          ]
        },
        {
          "name": "Destroy Session",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}"]
            },
            "description": "Destroy a session and release its browser resources.\n\nReturns `204 No Content` on success. Runtime is recorded for billing.\n\nAlways destroy sessions when done to free resources and stop the billing clock. Sessions also auto-expire based on their `timeout` setting."
          },
          "response": [
            {
              "name": "Session Destroyed",
              "status": "No Content",
              "code": 204,
              "header": [],
              "body": ""
            }
          ]
        }
      ]
    },
    {
      "name": "Act — Step Execution",
      "description": "Execute steps on an existing session. Each step is a JSON object with exactly one key (the step type) and its params as the value.\n\nSteps execute sequentially. On failure, execution stops and the error is returned alongside the current page state.\n\nAn auto-observe runs at the end of every successful call, so the response always includes fresh page state.\n\n**Available step types:** `goto`, `observe`, `click`, `fill`, `type`, `select`, `check`, `scroll`, `scroll_collect`, `screenshot`, `wait`, `extract`, `upload`, `pdf`, `fill_form`, `execute_js`, `close`",
      "item": [
        {
          "name": "Navigate (goto)",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"goto\": {\"url\": \"https://example.com\"}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Navigate to a URL.\n\nWaits for page load + stability checks. Optionally waits for a specific CSS selector or a JavaScript expression.\n\n**Params:**\n- `url` (required): URL to navigate to\n- `wait_for`: CSS selector to wait for\n- `wait_until`: JavaScript expression to wait for (must become truthy)\n- `wait_timeout` (default: 10000): Max ms to wait"
          },
          "response": []
        },
        {
          "name": "Observe Page",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"observe\": {}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Force a page observation. Returns content, interactive elements (with context: landmark, heading, form association), enriched forms with field refs, scroll position, and changes since last observe.\n\nAuto-observe runs at the end of every call, so explicit `observe` is only needed to change format/scope.\n\n**Params:**\n- `format`: `\"markdown\"` (default) or `\"html\"`\n- `mode`: `\"main\"` (default) returns main content. `\"full\"` returns all page sections (nav, aside, footer, etc.) organized by `## [section]` headers.\n- `include_page_map` (default: false): Include a lightweight section map (`page.map`) showing available page regions. Auto-included on first observe.\n- `scope`: CSS selector to limit observation\n- `include_links` (default: false): Include links as interactive elements\n- `max_text_length` (default: 12000, 20000 for full mode): Content length limit"
          },
          "response": []
        },
        {
          "name": "Observe Full Page (all sections)",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"observe\": {\"mode\": \"full\", \"max_text_length\": 20000}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Observe all page sections — header, nav, main, aside, footer — organized under `## [section]` headers. Use when you need content outside the main area (sidebars, navigation links, footer info).\n\nDefault `max_text_length` for full mode is 20000 (main gets 60% budget, other sections share the remaining 40%)."
          },
          "response": []
        },
        {
          "name": "Observe with Page Map",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"observe\": {\"include_page_map\": true}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Request the page map alongside the observation. The map is a lightweight structural outline of page sections with hints (headings, link counts, control counts) and CSS selectors.\n\nThe map is auto-included on the first observe in a session. Use `include_page_map: true` to request it again after navigation or page changes."
          },
          "response": []
        },
        {
          "name": "Click by Ref",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"click\": {\"ref\": \"e1\"}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Click an element by its ref from a previous observation.\n\nTargeting options (exactly one required):\n- `ref`: Element ref (e.g. `\"e3\"`) — most precise\n- `text`: Match by visible text content\n- `label`: Match by label/placeholder/aria-label"
          },
          "response": [
            {
              "name": "Click Success",
              "status": "OK",
              "code": 200,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"session_id\": \"ses_abc123def456\",\n  \"expires_at\": \"2026-03-18T14:00:00.000Z\",\n  \"request_id\": \"req_8f3a2bc1d4e5\",\n  \"completed\": 1,\n  \"page\": {\n    \"url\": \"https://example.com/dashboard\",\n    \"title\": \"Dashboard\",\n    \"stable\": true,\n    \"markdown\": {\"content\": \"# Dashboard\\n\\nWelcome back...\"},\n    \"interactive_elements\": [\n      {\"ref\": \"e1\", \"tag\": \"a\", \"label\": \"Settings\", \"role\": \"link\", \"in\": \"nav\"},\n      {\"ref\": \"e2\", \"tag\": \"button\", \"label\": \"Logout\", \"in\": \"nav\"}\n    ],\n    \"forms\": [],\n    \"changes\": {\n      \"content_changed\": true,\n      \"content_delta\": \"Navigation changed to dashboard\",\n      \"elements_added\": [{\"ref\": \"e1\"}, {\"ref\": \"e2\"}],\n      \"elements_removed\": []\n    },\n    \"scroll\": {\"y\": 0, \"height\": 900, \"viewport\": 720, \"percent\": 80}\n  },\n  \"media\": [],\n  \"extraction\": null,\n  \"blockers_dismissed\": [],\n  \"error\": null\n}"
            }
          ]
        },
        {
          "name": "Click by Text",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"click\": {\"text\": \"Submit\"}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Click an element by its visible text content. Best for buttons and links."
          },
          "response": []
        },
        {
          "name": "Fill Input",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"fill\": {\"label\": \"Email\", \"value\": \"user@example.com\"}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Clear and replace the value of an input field.\n\n`fill` clears the field first, then sets the new value. Use `type` instead for character-by-character input (autocomplete, search-as-you-type)."
          },
          "response": [
            {
              "name": "Fill Success",
              "status": "OK",
              "code": 200,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"session_id\": \"ses_abc123def456\",\n  \"expires_at\": \"2026-03-18T14:00:00.000Z\",\n  \"request_id\": \"req_9c4b3dc2e5f6\",\n  \"completed\": 1,\n  \"page\": {\n    \"url\": \"https://example.com/login\",\n    \"title\": \"Login\",\n    \"stable\": true,\n    \"markdown\": {\"content\": \"# Login\\n\\nSign in to your account...\"},\n    \"interactive_elements\": [\n      {\"ref\": \"e1\", \"tag\": \"input\", \"label\": \"Email\", \"role\": \"email\", \"value\": \"user@example.com\"},\n      {\"ref\": \"e2\", \"tag\": \"input\", \"label\": \"Password\", \"role\": \"password\"},\n      {\"ref\": \"e3\", \"tag\": \"button\", \"label\": \"Sign In\", \"role\": \"submit\"}\n    ],\n    \"forms\": [{\"id\": \"login-form\", \"action\": \"/auth/login\", \"method\": \"POST\", \"fields\": 2}],\n    \"changes\": {\n      \"content_changed\": false,\n      \"content_delta\": null,\n      \"elements_added\": [],\n      \"elements_removed\": []\n    },\n    \"scroll\": {\"y\": 0, \"height\": 600, \"viewport\": 720, \"percent\": 100}\n  },\n  \"media\": [],\n  \"extraction\": null,\n  \"blockers_dismissed\": [],\n  \"error\": null\n}"
            }
          ]
        },
        {
          "name": "Type (character-by-character)",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"type\": {\"label\": \"Search\", \"value\": \"search query\", \"delay\": 100}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Type text character-by-character with a delay. Use for autocomplete/search inputs.\n\n**Params:**\n- `ref`/`text`/`label`: Element targeting (one required)\n- `value` (required): Text to type\n- `delay` (default: 50): Milliseconds between keystrokes"
          },
          "response": []
        },
        {
          "name": "Select Dropdown Option",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"select\": {\"label\": \"Country\", \"value\": \"US\"}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Select an option from a `<select>` dropdown by its value."
          },
          "response": []
        },
        {
          "name": "Check / Uncheck",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"check\": {\"label\": \"Remember me\"}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Check or uncheck a checkbox or radio button.\n\n- `ref`/`text`/`label`: Element targeting (one required)\n- `checked` (default: true): Set to `false` to uncheck"
          },
          "response": []
        },
        {
          "name": "Scroll Down",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"scroll\": {\"direction\": \"down\", \"amount\": 500}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Scroll the page.\n\n- `to`: `\"bottom\"` or `\"top\"` — jump to extreme\n- `direction`: `\"up\"` or `\"down\"` — scroll by `amount` pixels\n- `amount` (default: 500): Pixels per scroll\n- `times` (default: 1): Repeat N times\n- `ref`/`text`/`label`: Scroll element into view"
          },
          "response": []
        },
        {
          "name": "Scroll Collect (full-page scrape)",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"scroll_collect\": {\"max_text_length\": 50000}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Scroll through the entire page, wait for lazy-loaded content at each position, and return a unified observation.\n\nIdeal for infinite scroll, lazy loading, or long content.\n\n- `max_scrolls` (default: 50): Safety limit\n- `wait_ms` (default: 500): Pause between scrolls (ms)\n- `timeout_ms` (default: 60000): Total time budget (ms)\n- `max_text_length` (default: 100000): Content length limit"
          },
          "response": []
        },
        {
          "name": "Screenshot",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"screenshot\": {}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Capture a screenshot. Returns base64 data in the `media` array.\n\n- `full_page` (default: false): Capture full scrollable page\n- `selector`: CSS selector to screenshot a specific element\n- `format` (default: `\"png\"`): `\"png\"` or `\"jpeg\"`\n- `quality` (default: 80): JPEG quality (1–100)"
          },
          "response": [
            {
              "name": "Screenshot Captured",
              "status": "OK",
              "code": 200,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"session_id\": \"ses_abc123def456\",\n  \"expires_at\": \"2026-03-18T14:00:00.000Z\",\n  \"request_id\": \"req_7b2a1dc3e4f5\",\n  \"completed\": 1,\n  \"page\": {\n    \"url\": \"https://example.com\",\n    \"title\": \"Example Domain\",\n    \"stable\": true,\n    \"markdown\": {\"content\": \"# Example Domain\\n\\nThis domain is for use in illustrative examples...\"},\n    \"interactive_elements\": [{\"ref\": \"e1\", \"tag\": \"a\", \"label\": \"More information...\", \"role\": \"link\"}],\n    \"forms\": [],\n    \"changes\": null,\n    \"scroll\": {\"y\": 0, \"height\": 600, \"viewport\": 720, \"percent\": 100}\n  },\n  \"media\": [\n    {\"type\": \"screenshot\", \"format\": \"png\", \"data\": \"iVBORw0KGgoAAAANSUhEUgAA...\"}\n  ],\n  \"extraction\": null,\n  \"blockers_dismissed\": [],\n  \"error\": null\n}"
            }
          ]
        },
        {
          "name": "Wait",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"wait\": {\"selector\": \"#results\", \"timeout\": 10000}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Wait for a condition before continuing. Exactly one required:\n\n- `ms`: Fixed wait in milliseconds\n- `selector`: Wait for CSS selector to appear\n- `text`: Wait for text to appear on page\n- `until`: Wait for a JavaScript expression to become truthy\n- `timeout` (default: 10000): Max wait for selector/text/until"
          },
          "response": []
        },
        {
          "name": "Extract Structured Data",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"extract\": {\n      \"title\": \"h1 >> text\",\n      \"links\": [\"a >> href\"],\n      \"articles\": [{\n        \"_parent\": \".article\",\n        \"title\": \"h2 >> text\",\n        \"url\": \"a >> href\"\n      }]\n    }}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Extract structured data from the page. Results appear in the `extraction` field.\n\n**Selector syntax:** `<css_or_xpath> >> <function>`\n\nFunctions: `>> text`, `>> href` (any attribute), `>> json`, or omit for outer HTML.\n\nWrap in `[ ]` for arrays. Use `[{\"_parent\": \"...\"}]` for repeating structures. Tables auto-parse.\n\nPrefix with `js >>` for JavaScript execution."
          },
          "response": [
            {
              "name": "Extracted Data",
              "status": "OK",
              "code": 200,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"session_id\": \"ses_abc123def456\",\n  \"expires_at\": \"2026-03-18T14:00:00.000Z\",\n  \"request_id\": \"req_5e6f7a8b9c0d\",\n  \"completed\": 1,\n  \"page\": {\"url\": \"https://example.com\", \"title\": \"Example\", \"stable\": true, \"markdown\": {\"content\": \"# Example Domain\\n\\n...\"}, \"interactive_elements\": [], \"forms\": [], \"changes\": null, \"scroll\": {\"y\": 0, \"height\": 600, \"viewport\": 720, \"percent\": 100}},\n  \"extraction\": {\n    \"title\": \"Example Domain\",\n    \"links\": [\"https://www.iana.org/domains/reserved\"],\n    \"articles\": []\n  },\n  \"media\": [],\n  \"blockers_dismissed\": [],\n  \"error\": null\n}"
            }
          ]
        },
        {
          "name": "Fill Form + Submit",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"fill_form\": {\n      \"fields\": {\n        \"Email\": \"user@example.com\",\n        \"Password\": \"secret123\"\n      },\n      \"submit\": true\n    }}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Fill multiple form fields by label and optionally submit. Auto-detects field types.\n\n- `fields` (required): `{label: value}` pairs\n- `submit` (default: false): Auto-find submit button and click it"
          },
          "response": []
        },
        {
          "name": "Upload File",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"upload\": {\"ref\": \"e5\", \"files\": [\"https://example.com/document.pdf\"]}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Upload files to a `<input type=\"file\">` element.\n\n- `ref`/`text`/`label`: Element targeting (one required)\n- `files` (required): Array of file URLs to download and attach"
          },
          "response": []
        },
        {
          "name": "Generate PDF",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"pdf\": {\"format\": \"A4\", \"print_background\": true}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Generate a PDF of the current page. Returns base64 data in the `media` array with `type: \"pdf\"`.\n\n- `format` (default: `\"A4\"`): Paper size\n- `landscape` (default: false)\n- `print_background` (default: true)\n- `scale` (default: 1): 0.1–2\n- `margin`: `{top, right, bottom, left}` in CSS units"
          },
          "response": []
        },
        {
          "name": "Execute JavaScript",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"execute_js\": {\"code\": \"return document.title\"}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Run custom JavaScript in the browser page context. The return value is placed in the `extraction` object.\n\n- `code` (required): JavaScript code to execute. Use `return` to send values back.\n- `result_key` (default: `\"js_result\"`): Key name in `extraction` for the return value.\n- `timeout` (default: 10000): Max execution time in ms.\n\nThe code runs inside a `new Function()` wrapper — no access to Node.js APIs."
          },
          "response": [
            {
              "name": "JS Execution Result",
              "status": "OK",
              "code": 200,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"session_id\": \"ses_abc123def456\",\n  \"expires_at\": \"2026-03-18T14:00:00.000Z\",\n  \"request_id\": \"req_3d4e5f6a7b8c\",\n  \"completed\": 1,\n  \"page\": {\"url\": \"https://example.com\", \"title\": \"Example Domain\", \"stable\": true, \"markdown\": {\"content\": \"# Example Domain\\n\\n...\"}, \"interactive_elements\": [], \"forms\": [], \"changes\": null, \"scroll\": {\"y\": 0, \"height\": 600, \"viewport\": 720, \"percent\": 100}},\n  \"extraction\": {\n    \"js_result\": \"Example Domain\"\n  },\n  \"media\": [],\n  \"blockers_dismissed\": [],\n  \"error\": null\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Workflows",
      "description": "Complete workflow examples combining session creation and step execution. These demonstrate common real-world patterns using the minimal API surface.",
      "item": [
        {
          "name": "Login Flow (1 call)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var json = pm.response.json();",
                  "    pm.collectionVariables.set('session_id', json.session_id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com/login\",\n  \"steps\": [\n    {\"fill_form\": {\n      \"fields\": {\n        \"Email\": \"user@example.com\",\n        \"Password\": \"secret123\"\n      },\n      \"submit\": true\n    }},\n    {\"wait\": {\"ms\": 2000}},\n    {\"screenshot\": {\"full_page\": true}},\n    {\"close\": {}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "Navigate to login page, fill credentials, submit, wait, screenshot, and auto-destroy — all in one call.\n\nThe `close` step destroys the session after all steps complete."
          },
          "response": []
        },
        {
          "name": "Scrape Full Page (1 call)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var json = pm.response.json();",
                  "    pm.collectionVariables.set('session_id', json.session_id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com/long-article\",\n  \"steps\": [\n    {\"scroll_collect\": {\"max_text_length\": 50000}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "Navigate to a page and scroll through it entirely, capturing all lazy-loaded content in a single response."
          },
          "response": []
        },
        {
          "name": "Extract + Close (1 call)",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com/products\",\n  \"steps\": [\n    {\"extract\": {\n      \"products\": [{\n        \"_parent\": \".product-card\",\n        \"name\": \"h2 >> text\",\n        \"price\": \".price >> text\",\n        \"url\": \"a >> href\"\n      }]\n    }},\n    {\"close\": {}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "One-shot extraction: navigate, extract structured data, and auto-destroy the session."
          },
          "response": []
        },
        {
          "name": "PDF Generation (1 call)",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com/report\",\n  \"steps\": [\n    {\"pdf\": {\"format\": \"A4\", \"landscape\": true}},\n    {\"close\": {}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "Navigate to a page, generate a PDF, and auto-destroy. PDF data returned as base64 in the `media` array with `type: \"pdf\"`."
          },
          "response": []
        },
        {
          "name": "Search + Extract (1 call)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "if (pm.response.code === 201) {",
                  "    var json = pm.response.json();",
                  "    pm.collectionVariables.set('session_id', json.session_id);",
                  "}"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com\",\n  \"steps\": [\n    {\"type\": {\"label\": \"Search\", \"value\": \"browser automation\", \"delay\": 50}},\n    {\"click\": {\"text\": \"Search\"}},\n    {\"wait\": {\"selector\": \".results\", \"timeout\": 10000}},\n    {\"extract\": {\n      \"results\": [{\n        \"_parent\": \".result-item\",\n        \"title\": \"h3 >> text\",\n        \"url\": \"a >> href\",\n        \"snippet\": \".snippet >> text\"\n      }]\n    }},\n    {\"close\": {}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "Complete search workflow: navigate, type query, click search, wait for results, extract structured data, and close."
          },
          "response": []
        },
        {
          "name": "Explore then Act (2 calls)",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"steps\": [\n    {\"fill\": {\"ref\": \"e1\", \"value\": \"updated value\"}},\n    {\"select\": {\"ref\": \"e3\", \"value\": \"option2\"}},\n    {\"check\": {\"ref\": \"e5\"}},\n    {\"click\": {\"ref\": \"e8\"}},\n    {\"screenshot\": {}}\n  ]\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions/{{session_id}}/act",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "{{session_id}}", "act"]
            },
            "description": "Second call in a 2-step workflow:\n\n1. `POST /v1/sessions` with `url` — get page state + element refs\n2. `POST /v1/sessions/:id/act` — use refs to fill, select, check, click, and screenshot\n\nThis request is the second call, using element refs from the first call's response."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Errors",
      "description": "Examples of error responses from the API.",
      "item": [
        {
          "name": "Unauthorized (no key)",
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "Request without an API key returns 401."
          },
          "response": [
            {
              "name": "Unauthorized",
              "status": "Unauthorized",
              "code": 401,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"error\": {\n    \"code\": \"unauthorized\",\n    \"message\": \"Missing Authorization header\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Session Not Found",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{base_url}}/v1/sessions/ses_nonexistent",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions", "ses_nonexistent"]
            },
            "description": "Requesting a session that doesn't exist returns 404."
          },
          "response": [
            {
              "name": "Not Found",
              "status": "Not Found",
              "code": 404,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"error\": {\n    \"code\": \"session_not_found\",\n    \"message\": \"Session ses_nonexistent not found\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Quota Exceeded",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com\"\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "When your plan's runtime quota is exhausted, session creation returns 429."
          },
          "response": [
            {
              "name": "Quota Exceeded",
              "status": "Too Many Requests",
              "code": 429,
              "header": [{"key": "Content-Type", "value": "application/json"}, {"key": "Retry-After", "value": "3600"}],
              "body": "{\n  \"error\": {\n    \"code\": \"quota_exceeded\",\n    \"message\": \"Runtime quota exhausted. Upgrade your plan for more hours.\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Rate Limited",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "When you exceed your plan's rate limit, requests return 429."
          },
          "response": [
            {
              "name": "Rate Limited",
              "status": "Too Many Requests",
              "code": 429,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"error\": {\n    \"code\": \"rate_limited\",\n    \"message\": \"Rate limit exceeded. Try again shortly.\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Engine Unavailable",
          "request": {
            "method": "POST",
            "header": [
              {"key": "Content-Type", "value": "application/json"}
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com\"\n}",
              "options": {"raw": {"language": "json"}}
            },
            "url": {
              "raw": "{{base_url}}/v1/sessions",
              "host": ["{{base_url}}"],
              "path": ["v1", "sessions"]
            },
            "description": "When all browser engine workers are unavailable, returns 503. Retry after a short delay."
          },
          "response": [
            {
              "name": "Engine Unavailable",
              "status": "Service Unavailable",
              "code": 503,
              "header": [{"key": "Content-Type", "value": "application/json"}],
              "body": "{\n  \"error\": {\n    \"code\": \"engine_unavailable\",\n    \"message\": \"Browser engine is temporarily unavailable. Please retry.\"\n  }\n}"
            }
          ]
        }
      ]
    }
  ]
}
