Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Control browser automation through HTTP API. Supports page navigation, element interaction (click, type, select), data extraction, accessibility snapshot analysis, screenshot, JavaScript execution, and batch operations.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 275% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 324% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 456% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 301% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 238% | 0% |
BrowserWing Executor provides comprehensive browser automation capabilities through HTTP APIs. You can control browser navigation, interact with page elements, extract data, and analyze page structure.
API Base URL: The BrowserWing Executor API address is configurable via environment variable.
BROWSERWING_EXECUTOR_URLhttp://127.0.0.1:8080$BROWSERWING_EXECUTOR_URL, if not set, use default http://127.0.0.1:8080Base URL Format: ${BROWSERWING_EXECUTOR_URL}/api/v1/executor or http://127.0.0.1:8080/api/v1/executor (if env var not set)
Authentication: Use X-BrowserWing-Key: <api-key> header or Authorization: Bearer <token> if required.
Important: Always construct the API URL by reading the environment variable first. In shell commands, use: ${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}
IMPORTANT: Always call this endpoint first to see all available commands and their parameters.
bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" curl -X GET "${EXECUTOR_URL}/api/v1/executor/help"
Response: Returns complete list of all commands with parameters, examples, and usage guidelines.
Query specific command:
bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" curl -X GET "${EXECUTOR_URL}/api/v1/executor/help?command=extract"
CRITICAL: Always call this after navigation to understand page structure and get element RefIDs.
bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" curl -X GET "${EXECUTOR_URL}/api/v1/executor/snapshot"
Response Example:
json{ "success": true, "snapshot_text": "Clickable Elements:\n @e1 Login (role: button)\n @e2 Sign Up (role: link)\n\nInput Elements:\n @e3 Email (role: textbox) [placeholder: your@email.com]\n @e4 Password (role: textbox)" }
Use Cases:
Note: All examples below use EXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" to read the API address from environment variable, with http://127.0.0.1:8080 as fallback default.
bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" curl -X POST "${EXECUTOR_URL}/api/v1/executor/navigate" \ -H 'Content-Type: application/json' \ -d '{"url": "https://example.com"}'
bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" curl -X POST "${EXECUTOR_URL}/api/v1/executor/click" \ -H 'Content-Type: application/json' \ -d '{"identifier": "@e1"}'
Identifier formats:
@e1, @e2 (from snapshot)#button-id, .class-name//button[@type='submit']Login (text content)bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" curl -X POST "${EXECUTOR_URL}/api/v1/executor/type" \ -H 'Content-Type: application/json' \ -d '{"identifier": "@e3", "text": "user@example.com"}'
bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" curl -X POST "${EXECUTOR_URL}/api/v1/executor/extract" \ -H 'Content-Type: application/json' \ -d '{ "selector": ".product-item", "fields": ["text", "href"], "multiple": true }'
bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" curl -X POST "${EXECUTOR_URL}/api/v1/executor/wait" \ -H 'Content-Type: application/json' \ -d '{"identifier": ".loading", "state": "hidden", "timeout": 10}'
bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" curl -X POST "${EXECUTOR_URL}/api/v1/executor/batch" \ -H 'Content-Type: application/json' \ -d '{ "operations": [ {"type": "navigate", "params": {"url": "https://example.com"}, "stop_on_error": true}, {"type": "click", "params": {"identifier": "@e1"}, "stop_on_error": true}, {"type": "type", "params": {"identifier": "@e3", "text": "query"}, "stop_on_error": true} ] }'
Step-by-step workflow:
$BROWSERWING_EXECUTOR_URL. If not set, use default http://127.0.0.1:8080. In shell commands, use: EXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}"GET /help to see all available operations and their parameters (do this first if unsure).POST /navigate to open the target webpage.GET /snapshot to understand page structure and get element RefIDs.@e1, @e2) or CSS selectors to:POST /clickPOST /typePOST /selectPOST /waitPOST /extract to get information from the page.User Request: "Search for 'laptop' on example.com and get the first 5 results"
Your Actions:
bashcurl -X POST 'http://127.0.0.1:18085/api/v1/executor/navigate' \ -H 'Content-Type: application/json' \ -d '{"url": "https://example.com/search"}'
bashcurl -X GET 'http://127.0.0.1:18085/api/v1/executor/snapshot'
Response shows: @e3 Search (role: textbox) [placeholder: Search...]
bashcurl -X POST 'http://127.0.0.1:18085/api/v1/executor/type' \ -H 'Content-Type: application/json' \ -d '{"identifier": "@e3", "text": "laptop"}'
bashcurl -X POST 'http://127.0.0.1:18085/api/v1/executor/press-key' \ -H 'Content-Type: application/json' \ -d '{"key": "Enter"}'
bashcurl -X POST 'http://127.0.0.1:18085/api/v1/executor/wait' \ -H 'Content-Type: application/json' \ -d '{"identifier": ".search-results", "state": "visible", "timeout": 10}'
bashcurl -X POST 'http://127.0.0.1:18085/api/v1/executor/extract' \ -H 'Content-Type: application/json' \ -d '{ "selector": ".result-item", "fields": ["text", "href"], "multiple": true }'
Found 15 results for 'laptop':
1. Gaming Laptop - $1299 (https://...)
2. Business Laptop - $899 (https://...)
...POST /navigate - Navigate to URLPOST /go-back - Go back in historyPOST /go-forward - Go forward in historyPOST /reload - Reload current pagePOST /click - Click element (supports: RefID @e1, CSS selector, XPath, text content)POST /type - Type text into input (supports: RefID @e3, CSS selector, XPath)POST /select - Select dropdown optionPOST /hover - Hover over elementPOST /wait - Wait for element state (visible, hidden, enabled)POST /press-key - Press keyboard key (Enter, Tab, Ctrl+S, etc.)POST /extract - Extract data from elements (supports multiple elements, custom fields)POST /get-text - Get element text contentPOST /get-value - Get input element valueGET /page-info - Get page URL and titleGET /page-text - Get all page textGET /page-content - Get full HTMLGET /snapshot - Get accessibility snapshot (⭐ ALWAYS call after navigation)GET /clickable-elements - Get all clickable elementsGET /input-elements - Get all input elementsPOST /screenshot - Take page screenshot (base64 encoded)POST /evaluate - Execute JavaScript codePOST /batch - Execute multiple operations in sequencePOST /scroll-to-bottom - Scroll to page bottomPOST /resize - Resize browser windowPOST /tabs - Manage browser tabs (list, new, switch, close)POST /fill-form - Intelligently fill multiple form fields at onceGET /console-messages - Get browser console messages (logs, warnings, errors)GET /network-requests - Get network requests made by the pagePOST /handle-dialog - Configure JavaScript dialog (alert, confirm, prompt) handlingPOST /file-upload - Upload files to input elementsPOST /drag - Drag and drop elementsPOST /close-page - Close the current page/tabYou can identify elements using:
@e1, @e2, @e3/snapshot endpoint"identifier": "@e1"#id, .class, button[type="submit"]"identifier": "#login-button"//button[@id='login'], //a[contains(text(), 'Submit')]"identifier": "//button[@id='login']"Login, Sign Up, Submit"identifier": "Login"aria-label attributeBefore starting:
$BROWSERWING_EXECUTOR_URL environment variable, or use http://127.0.0.1:8080 as defaultGET /help if you're unsure about available commands or their parametersDuring automation:
/snapshot after navigation to get page structure and RefIDs@e1) over CSS selectors for reliability and stability/wait for dynamic content that loads asynchronously/batch for multiple sequential operations to improve efficiencyError handling:
/snapshot again to refresh page structureData extraction:
fields parameter to specify what to extract: ["text", "href", "src"]multiple: true to extract from multiple elementsScenario: User wants to login to a website
User: "Please log in to example.com with username 'john' and password 'secret123'"Your Actions:
Step 1: Navigate to login page
bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" curl -X POST "${EXECUTOR_URL}/api/v1/executor/navigate" \ -H 'Content-Type: application/json' \ -d '{"url": "https://example.com/login"}'
Step 2: Get page structure
bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" curl -X GET "${EXECUTOR_URL}/api/v1/executor/snapshot"
Response:
Clickable Elements:
@e1 Login (role: button)
Input Elements:
@e2 Username (role: textbox)
@e3 Password (role: textbox)Step 3: Enter username
bashPOST http://127.0.0.1:18085/api/v1/executor/type {"identifier": "@e2", "text": "john"}
Step 4: Enter password
bashPOST http://127.0.0.1:18085/api/v1/executor/type {"identifier": "@e3", "text": "secret123"}
Step 5: Click login button
bashPOST http://127.0.0.1:18085/api/v1/executor/click {"identifier": "@e1"}
Step 6: Wait for login success (optional)
bashPOST http://127.0.0.1:18085/api/v1/executor/wait {"identifier": ".welcome-message", "state": "visible", "timeout": 10}
Step 7: Inform user
"Successfully logged in to example.com!"Scenario: Fill out a form with multiple fields
Instead of making 5 separate API calls, use one batch operation:
bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" curl -X POST "${EXECUTOR_URL}/api/v1/executor/batch" \ -H 'Content-Type: application/json' \ -d '{ "operations": [ { "type": "navigate", "params": {"url": "https://example.com/form"}, "stop_on_error": true }, { "type": "type", "params": {"identifier": "#name", "text": "John Doe"}, "stop_on_error": true }, { "type": "type", "params": {"identifier": "#email", "text": "john@example.com"}, "stop_on_error": true }, { "type": "select", "params": {"identifier": "#country", "value": "United States"}, "stop_on_error": true }, { "type": "click", "params": {"identifier": "#submit"}, "stop_on_error": true } ] }'
/help or /help?command=<name> to learn about commands/snapshot after navigation to understand the page/wait before interacting with elements that load asynchronously/batch for multiple sequential operations/type for each field: @e1, @e2, etc./select for dropdowns/wait/extract with CSS selector and multiple: true["text", "href", "src"]@e2@e3@e1wait_visible: true (default) for reliable element interaction$BROWSERWING_EXECUTOR_URL environment variable, fallback to http://127.0.0.1:8080 if not setX-BrowserWing-Key header or JWT token if configuredElement not found:
/snapshot to see available elementsTimeout errors:
/wait with appropriate state before interactionExtraction returns empty:
/wait first)bashEXECUTOR_URL="${BROWSERWING_EXECUTOR_URL:-http://127.0.0.1:8080}" # Discover commands curl -X GET "${EXECUTOR_URL}/api/v1/executor/help" # Navigate curl -X POST "${EXECUTOR_URL}/api/v1/executor/navigate" \ -H 'Content-Type: application/json' \ -d '{"url": "..."}' # Get page structure curl -X GET "${EXECUTOR_URL}/api/v1/executor/snapshot" # Click element curl -X POST "${EXECUTOR_URL}/api/v1/executor/click" \ -H 'Content-Type: application/json' \ -d '{"identifier": "@e1"}' # Type text curl -X POST "${EXECUTOR_URL}/api/v1/executor/type" \ -H 'Content-Type: application/json' \ -d '{"identifier": "@e3", "text": "..."}' # Extract data curl -X POST "${EXECUTOR_URL}/api/v1/executor/extract" \ -H 'Content-Type: application/json' \ -d '{"selector": "...", "fields": [...], "multiple": true}'
All operations return:
json{ "success": true, "message": "Operation description", "timestamp": "2026-01-15T10:30:00Z", "data": { // Operation-specific data } }
Error response:
json{ "error": "error.operationFailed", "detail": "Detailed error message" }
Other measured skills in the registry, with their headline benchmark lift.