# Notte — Orthogonal API

> Pay-per-use API on Orthogonal. Each call is billed to your Orthogonal balance.
> Base API: `https://api.orth.sh/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.orth.sh/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": "<usd>", "data": { ... } }`.

## Endpoints

### 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.orth.sh/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":"<string>"},"body":{"selector":"<string>","scrape_links":"<boolean>","scrape_images":"<boolean>","only_main_content":"<boolean>","response_format":"<object>","instructions":"<string>"}}'
```

### 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.orth.sh/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":"<string>"}}'
```

### 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.orth.sh/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":"<string>"}}'
```

### 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.orth.sh/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":"<string>"}}'
```

### 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.orth.sh/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":"<string>"}}'
```

### 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.orth.sh/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":"<string>"}}'
```

### 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.orth.sh/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":"<string>"},"body":{"max_nb_actions":"<number>","min_nb_actions":"<number>","instruction":"<string>"}}'
```

### 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.orth.sh/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":"<string>"}}'
```

### 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.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"notte","path":"/scrape","body":{"url":"<string>","schema":"<object>"}}'
```

### 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.orth.sh/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":"<string>"},"body":{"type":"<string>","url":"<string>","ref":"<string>","text":"<string>","value":"<string>","direction":"<string>","amount":"<number>","timeout":"<number>"}}'
```

### 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.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"notte","path":"/sessions/{session_id}/cookies","query":{"session_id":"<string>"},"body":{"cookies":"<array>"}}'
```

### 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.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"notte","path":"/sessions/start","body":{"headless":"<boolean>","browser_type":"<string>","proxies":"<boolean>","solve_captchas":"<boolean>","idle_timeout_minutes":"<integer>","max_duration_minutes":"<integer>","viewport_width":"<integer>","viewport_height":"<integer>","user_agent":"<string>"}}'
```

### 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.orth.sh/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":"<string>"},"body":{"full_page":"<boolean>"}}'
```

### 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.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"notte","path":"/agents/start","body":{"task":"<string>","session_id":"<string>","url":"<string>","max_steps":"<number>","use_vision":"<boolean>"}}'
```

### 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.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"notte","path":"/scrape_from_html","body":{"frames":"<array>"}}'
```

---

Full details and an interactive quickstart: https://orthogonal.com/discover/notte
