# Notte — Orthogonal API > Pay-per-use API on Orthogonal. Each call is billed to your Orthogonal balance. > Base API: `https://api.orthogonal.com/v1/run` · [llms.txt](https://orthogonal.com/llms.txt) · [browse all APIs](https://orthogonal.com/discover) Browser automation API for AI agents. Start browser sessions, run AI agents, scrape webpages, and automate browser tasks with headless Chrome/Firefox. Features include CAPTCHA solving, proxy support, and persistent browser profiles. **Verified:** yes ## Access **Run API:** `POST https://api.orthogonal.com/v1/run` **Auth:** `Authorization: Bearer $ORTHOGONAL_API_KEY` Get an API key at https://orthogonal.com/dashboard/settings/api-keys Every call goes through the unified Run API: send the API `slug`, the endpoint `path`, and the `query`/`body` parameters. The response is `{ "success": true, "price": "", "data": { ... } }`. ## Endpoints ### Get Session Get session status and details. `GET /sessions/{session_id}` **Cost:** Free | Field | Type | Required | Description | |-------|------|----------|-------------| | `session_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. | | `session_id` | string | Yes | | ```bash # Replace {session_id} in "path" with real values before sending curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/sessions/{session_id}","method":"GET","query":{"session_id":""}}' ``` ### Get Network Logs Get network request/response logs from the session. `GET /sessions/{session_id}/network/logs` **Cost:** Free | Field | Type | Required | Description | |-------|------|----------|-------------| | `session_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. | | `session_id` | string | Yes | | ```bash # Replace {session_id} in "path" with real values before sending curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/sessions/{session_id}/network/logs","method":"GET","query":{"session_id":""}}' ``` ### Observe Page Observe the current page state and get available actions. `POST /sessions/{session_id}/page/observe` **Estimated cost:** $0.005 | Field | Type | Required | Description | |-------|------|----------|-------------| | `session_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. | | `max_nb_actions` | number | No | Maximum actions to return (default: 100) | | `min_nb_actions` | number | No | Minimum actions to return | | `instruction` | string | No | Optional instruction to filter actions | | `session_id` | string | Yes | | ```bash # Replace {session_id} in "path" with real values before sending curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/sessions/{session_id}/page/observe","query":{"session_id":""},"body":{"max_nb_actions":"","min_nb_actions":"","instruction":""}}' ``` ### Take Screenshot Take a screenshot of the current page. `POST /sessions/{session_id}/page/screenshot` **Estimated cost:** $0.001 | Field | Type | Required | Description | |-------|------|----------|-------------| | `session_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. | | `full_page` | boolean | No | Capture full page | | `session_id` | string | Yes | | ```bash # Replace {session_id} in "path" with real values before sending curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/sessions/{session_id}/page/screenshot","query":{"session_id":""},"body":{"full_page":""}}' ``` ### Stop Session Stop and clean up a browser session. `DELETE /sessions/{session_id}/stop` **Cost:** Free | Field | Type | Required | Description | |-------|------|----------|-------------| | `session_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. | | `session_id` | string | Yes | Session ID | ```bash # Replace {session_id} in "path" with real values before sending curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/sessions/{session_id}/stop","method":"DELETE","query":{"session_id":""}}' ``` ### Get Session Cookies Get all cookies from the browser session. `GET /sessions/{session_id}/cookies` **Cost:** Free | Field | Type | Required | Description | |-------|------|----------|-------------| | `session_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. | | `session_id` | string | Yes | | ```bash # Replace {session_id} in "path" with real values before sending curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/sessions/{session_id}/cookies","method":"GET","query":{"session_id":""}}' ``` ### Start Agent Start an AI agent to autonomously complete a browser task. `POST /agents/start` **Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling. | Field | Type | Required | Description | |-------|------|----------|-------------| | `task` | string | Yes | Task for the AI agent to perform | | `session_id` | string | Yes | Session ID to run the agent on | | `url` | string | No | Starting URL | | `max_steps` | number | No | Max steps (1-50, default: 20) | | `use_vision` | boolean | No | Use vision model (default: true) | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/agents/start","body":{"task":"","session_id":"","url":"","max_steps":"","use_vision":""}}' ``` ### Set Session Cookies Set cookies in the browser session. `POST /sessions/{session_id}/cookies` **Estimated cost:** $0.001 | Field | Type | Required | Description | |-------|------|----------|-------------| | `session_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. | | `cookies` | array | Yes | Array of cookie objects | | `session_id` | string | Yes | | ```bash # Replace {session_id} in "path" with real values before sending curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/sessions/{session_id}/cookies","query":{"session_id":""},"body":{"cookies":""}}' ``` ### Start Session Start a new browser session. Configure browser type, proxies, viewport, and session timeout. `POST /sessions/start` **Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling. | Field | Type | Required | Description | |-------|------|----------|-------------| | `headless` | boolean | No | Run in headless mode (default: true) | | `browser_type` | string | No | Browser type: chromium, chrome, firefox | | `proxies` | boolean | No | Enable proxy rotation | | `solve_captchas` | boolean | No | Auto-solve CAPTCHAs | | `idle_timeout_minutes` | integer | No | Idle timeout (default: 3) | | `max_duration_minutes` | integer | No | Max duration (default: 15) | | `viewport_width` | integer | No | | | `viewport_height` | integer | No | | | `user_agent` | string | No | | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/sessions/start","body":{"headless":"","browser_type":"","proxies":"","solve_captchas":"","idle_timeout_minutes":"","max_duration_minutes":"","viewport_width":"","viewport_height":"","user_agent":""}}' ``` ### Get Agent Status Get agent execution status and results. `GET /agents/{agent_id}` **Cost:** Free | Field | Type | Required | Description | |-------|------|----------|-------------| | `agent_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. | | `agent_id` | string | Yes | | ```bash # Replace {agent_id} in "path" with real values before sending curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/agents/{agent_id}","method":"GET","query":{"agent_id":""}}' ``` ### Stop Agent Stop a running agent. `DELETE /agents/{agent_id}/stop` **Cost:** Free | Field | Type | Required | Description | |-------|------|----------|-------------| | `agent_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. | | `session_id` | string | Yes | Session ID the agent is running on | ```bash # Replace {agent_id} in "path" with real values before sending curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/agents/{agent_id}/stop","method":"DELETE","query":{"session_id":""}}' ``` ### Scrape Webpage Scrape content from a URL without managing sessions. `POST /scrape` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `url` | string | Yes | URL to scrape | | `schema` | object | No | Structured extraction schema | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/scrape","body":{"url":"","schema":""}}' ``` ### Execute Page Action Execute an action on the page (click, type, navigate, etc.). `POST /sessions/{session_id}/page/execute` **Estimated cost:** $0.002 | Field | Type | Required | Description | |-------|------|----------|-------------| | `session_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. | | `type` | string | Yes | Action type: goto, click, type, scroll, select, hover, wait, screenshot | | `url` | string | No | URL for goto action | | `ref` | string | No | Element reference for click/type/select actions | | `text` | string | No | Text for type action | | `value` | string | No | Value for select action | | `direction` | string | No | Scroll direction: up/down | | `amount` | number | No | Scroll amount in pixels | | `timeout` | number | No | Wait timeout in ms | | `session_id` | string | Yes | | ```bash # Replace {session_id} in "path" with real values before sending curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/sessions/{session_id}/page/execute","query":{"session_id":""},"body":{"type":"","url":"","ref":"","text":"","value":"","direction":"","amount":"","timeout":""}}' ``` ### Scrape Page Scrape content from the current page in the session. `POST /sessions/{session_id}/page/scrape` **Estimated cost:** $0.003 | Field | Type | Required | Description | |-------|------|----------|-------------| | `session_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. | | `selector` | string | No | Playwright selector to scope the scrape | | `scrape_links` | boolean | No | Scrape links (default: true) | | `scrape_images` | boolean | No | Scrape images (default: false) | | `only_main_content` | boolean | No | Only main content, exclude nav/footer (default: true) | | `response_format` | object | No | Pydantic model or JSON Schema for structured extraction | | `instructions` | string | No | Additional extraction instructions | | `session_id` | string | Yes | | ```bash # Replace {session_id} in "path" with real values before sending curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/sessions/{session_id}/page/scrape","query":{"session_id":""},"body":{"selector":"","scrape_links":"","scrape_images":"","only_main_content":"","response_format":"","instructions":""}}' ``` ### Scrape from HTML Extract structured content from raw HTML without using a browser `POST /scrape_from_html` **Estimated cost:** $0.002 | Field | Type | Required | Description | |-------|------|----------|-------------| | `frames` | array | Yes | Array of HTML frames to parse | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"notte","path":"/scrape_from_html","body":{"frames":""}}' ``` --- Full details and an interactive quickstart: https://orthogonal.com/discover/notte