# Massive Web — 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)
One API to chat with AI, browse, and search the live web. The Massive Web Render API turns hard-to-reach web content into clean, structured data. Supports AI completions (ChatGPT, Gemini, Perplexity, Copilot), web search with geotargeting, and full browser rendering with antibot bypass.
**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": "<usd>", "data": { ... } }`.
## Endpoints
### Async Search Results
Retrieve results or status of a queued search.
`GET /search/results`
**Estimated cost:** $0.00625
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `id` | string | Yes | UUID of the queued search |
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/search/results","method":"GET","query":{"id":"<string>"}}'
```
### Batch Search
Queue multiple searches (up to 1000 terms).
`POST /search/batches`
**Estimated cost:** $0.0625
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `terms` | array | Yes | Array of search terms (max 1000) |
| `engine` | string | No | Search engine (google) |
| `serps` | integer | No | Results pages per query |
| `country` | string | No | Two-letter ISO country code |
| `mode` | string | No | async (default for batches) |
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/search/batches","body":{"terms":"<array>","engine":"<string>","serps":"<integer>","country":"<string>","mode":"<string>"}}'
```
### Async Browse Content
Retrieve content or status of a queued browser request.
`GET /browser/content`
**Estimated cost:** $0.00625
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `id` | string | Yes | UUID of the queued request |
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/browser/content","method":"GET","query":{"id":"<string>"}}'
```
### Batch Browse Status
Retrieve status of batch browsing requests.
`GET /browser/batches`
**Estimated cost:** $0.00625
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `id` | string | Yes | UUID of the batch |
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/browser/batches","method":"GET","query":{"id":"<string>"}}'
```
### Browse Content
Retrieve web content with full JS rendering. Supports antibot bypass, difficulty levels, speed tiers, CAPTCHA handling, and output as rendered HTML, raw HTML, or markdown.
`GET /browser`
**Estimated cost:** $0.0125
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `url` | string | Yes | URL of the page to browse |
| `difficulty` | string | No | Difficulty pool: low or medium (high is planned) |
| `speed` | string | No | Speed: light, ridiculous |
| `device` | string | No | Device name to emulate |
| `session` | string | No | Unique identifier (max 255 chars) for sticky session routing to same egress node for up to 12 minutes |
| `country` | string | No | Two-letter ISO country code |
| `subdivision` | string | No | Subdivision code |
| `city` | string | No | City name |
| `captcha` | string | No | CAPTCHA resolution: solved, ignored, or rejected |
| `readiness` | string | No | Ready event: load or domcontentloaded |
| `delay` | number | No | Supplemental delay in seconds (0.1-10) |
| `format` | string | No | Output: rendered, raw, or markdown |
| `expiration` | integer | No | Cache expiration in days (0 disables) |
| `callback` | string | No | Encoded callback URL or SQS queue URL/ARN for async notification |
| `mode` | string | No | sync or async mode |
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/browser","method":"GET","query":{"url":"<string>","difficulty":"<string>","speed":"<string>","device":"<string>","session":"<string>","country":"<string>","subdivision":"<string>","city":"<string>","captcha":"<string>","readiness":"<string>","delay":"<number>","format":"<string>","expiration":"<integer>","callback":"<string>","mode":"<string>"}}'
```
### Search Results
Retrieve search results or queue a search for later retrieval. Supports Google engine with geotargeting by country, subdivision, and city. Returns structured SERP data. Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request.
`GET /search`
**Estimated cost:** $0.0125
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `terms` | string | Yes | The broad or exact word or phrase to query |
| `engine` | string | No | Search engine (google) |
| `serps` | integer | No | Number of results pages (1-10, default 1) |
| `size` | integer | No | Results per page (0-100) |
| `offset` | integer | No | Initial results to skip For later offset pages of the same logical search, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. |
| `device` | string | No | Device name to emulate |
| `uule` | string | No | Proprietary encoded string for emulating search location |
| `country` | string | No | Two-letter ISO country code |
| `subdivision` | string | No | First-level subdivision code |
| `city` | string | No | City name |
| `language` | string | No | Language name or ISO code |
| `display` | string | No | Display language for the search interface |
| `url` | string | No | Encoded results page URL (up to 2047 chars); overrides other params |
| `awaiting` | string | No | Lazy features to wait for (ai, answers, ads); repeatable |
| `expiration` | integer | No | Cache expiration in days (0 disables) |
| `callback` | string | No | Encoded callback URL or SQS queue URL/ARN for async notification |
| `mode` | string | No | sync or async mode |
| `format` | string | No | Output format accepted by Massive: html or json. Defaults to html when omitted. |
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/search","method":"GET","query":{"terms":"<string>","engine":"<string>","serps":"<integer>","size":"<integer>","offset":"<integer>","device":"<string>","uule":"<string>","country":"<string>","subdivision":"<string>","city":"<string>","language":"<string>","display":"<string>","url":"<string>","awaiting":"<string>","expiration":"<integer>","callback":"<string>","mode":"<string>","format":"<string>"}}'
```
### Batch Search Status
Retrieve status of batch searches.
`GET /search/batches`
**Estimated cost:** $0.00625
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `id` | string | Yes | UUID of the batch |
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/search/batches","method":"GET","query":{"id":"<string>"}}'
```
### Search Devices
Retrieve supported device names for search emulation.
`GET /search/devices`
**Estimated cost:** $0.00125
_No parameters required._
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/search/devices","method":"GET"}'
```
### Async AI Completion
Retrieve completion or status of a queued AI conversation.
`GET /ai/completions`
**Estimated cost:** $0.00625
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `id` | string | Yes | UUID of the queued conversation |
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/ai/completions","method":"GET","query":{"id":"<string>"}}'
```
### Batch AI Completions
Queue multiple LLM conversations (up to 1000 prompts).
`POST /ai/batches`
**Estimated cost:** $0.3125
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `prompts` | array | Yes | Array of chat prompts (max 1000) |
| `model` | string | No | AI model: chatgpt, gemini, perplexity, copilot |
| `country` | string | No | Two-letter ISO country code |
| `language` | string | No | Language name or ISO code |
| `format` | string | No | Output format: json or rendered |
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/ai/batches","body":{"prompts":"<array>","model":"<string>","country":"<string>","language":"<string>","format":"<string>"}}'
```
### Batch AI Status
Retrieve status of batch AI conversations.
`GET /ai/batches`
**Estimated cost:** $0.00625
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `id` | string | Yes | UUID of the batch |
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/ai/batches","method":"GET","query":{"id":"<string>"}}'
```
### AI Devices
Retrieve supported device names for AI emulation.
`GET /ai/devices`
**Estimated cost:** $0.00125
_No parameters required._
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/ai/devices","method":"GET"}'
```
### Batch Browse
Queue multiple browsing requests (up to 1000 URLs).
`POST /browser/batches`
**Estimated cost:** $0.0625
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `urls` | array | Yes | Array of URLs (max 1000) |
| `difficulty` | string | No | Difficulty: low, medium, high |
| `speed` | string | No | Speed: light, ridiculous |
| `country` | string | No | Two-letter ISO country code |
| `format` | string | No | Output: rendered, raw, markdown |
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/browser/batches","body":{"urls":"<array>","difficulty":"<string>","speed":"<string>","country":"<string>","format":"<string>"}}'
```
### Browser Devices
Retrieve supported device names for browser emulation.
`GET /browser/devices`
**Estimated cost:** $0.00125
_No parameters required._
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/browser/devices","method":"GET"}'
```
### AI Completion
Retrieve an LLM completion. Supports ChatGPT, Gemini, Perplexity, and Copilot with geotargeting.
`GET /ai`
**Estimated cost:** $0.0625
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `prompt` | string | Yes | Question or instruction (max 2047 chars) |
| `model` | string | No | AI model: chatgpt, gemini, perplexity, copilot |
| `device` | string | No | Device name to emulate |
| `country` | string | No | Two-letter ISO country code |
| `subdivision` | string | No | Subdivision code |
| `city` | string | No | City name |
| `language` | string | No | Language name or ISO code (planned) |
| `format` | string | No | Output format: json or rendered |
| `expiration` | integer | No | Cache expiration in days (0 disables) |
| `callback` | string | No | Encoded callback URL or SQS queue URL/ARN for async notification |
| `mode` | string | No | sync or async mode |
```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
-H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"api":"joinmassive","path":"/ai","method":"GET","query":{"prompt":"<string>","model":"<string>","device":"<string>","country":"<string>","subdivision":"<string>","city":"<string>","language":"<string>","format":"<string>","expiration":"<integer>","callback":"<string>","mode":"<string>"}}'
```
---
Full details and an interactive quickstart: https://orthogonal.com/discover/joinmassive