# Octen — 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)

Real-time search infrastructure for AI agents and apps: web, broad, news and business search, URL content extraction, and text and multimodal embeddings.

**Verified:** no

## 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

### Web Search

Search the live web for ranked results with model-ready highlights and optional full page content.

`POST /search`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.octen.ai/api-reference/search

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | string | Yes | Search query (max 500 chars). Supports site: and -site: operators. |
| `count` | integer | No | Number of results (1-100, default 5). |
| `include_domains` | array | No | Domains to restrict results to. |
| `exclude_domains` | array | No | Domains to exclude. |
| `time_basis` | string | No | auto \| published \| crawled (default auto). |
| `time_range` | string | No | day \| week \| month \| year. |
| `start_time` | string | No | ISO 8601 start time. |
| `end_time` | string | No | ISO 8601 end time. |
| `language` | array | No | ISO 639-1 language codes, e.g. ["en"]. |
| `highlight` | object | No | {enable: bool (default true), max_tokens: 100-20000}. |
| `full_content` | object | No | {enable: bool (default false), max_tokens: 100-100000}. Return full page content for results. |
| `include_text` | array | No | Strings that must appear (max 5). |
| `exclude_text` | array | No | Strings that must not appear (max 5). |
| `format` | string | No | markdown \| text. |
| `safesearch` | string | No | off \| strict (default strict). |
| `include_images` | boolean | No | Include images per result. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"octen","path":"/search","body":{"query":"<string>","count":"<integer>","include_domains":"<array>","exclude_domains":"<array>","time_basis":"<string>","time_range":"<string>","start_time":"<string>","end_time":"<string>","language":"<array>","highlight":"<object>","full_content":"<object>","include_text":"<array>","exclude_text":"<array>","format":"<string>","safesearch":"<string>","include_images":"<boolean>"}}'
```

### Broad Search

Break one question into up to 30 sub-queries, search them concurrently, and return results grouped by sub-query.

`POST /broad-search`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.octen.ai/api-reference/broad-search

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | string | Yes | Original question (max 500 chars). |
| `max_queries` | integer | No | Upper bound on sub-queries (1-30, default 5). |
| `search_options` | object | No | Web Search options applied to each sub-query (count, domains, time filters, language, highlight, full_content, format, safesearch, include_images). |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"octen","path":"/broad-search","body":{"query":"<string>","max_queries":"<integer>","search_options":"<object>"}}'
```

### News Search

Search real-time news, with related articles clustered into subjects and events.

`POST /news-search`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.octen.ai/api-reference/news-search

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | string | Yes | News query (max 500 chars). |
| `count` | integer | No | Number of results (1-100, default 5). |
| `include_domains` | array | No | Domains to restrict results to. |
| `exclude_domains` | array | No | Domains to exclude. |
| `time_basis` | string | No | auto \| published \| crawled (default auto). |
| `time_range` | string | No | day \| week \| month \| year. |
| `start_time` | string | No | ISO 8601 start time. |
| `end_time` | string | No | ISO 8601 end time. |
| `language` | array | No | ISO 639-1 language codes, e.g. ["en"]. |
| `highlight` | object | No | {enable: bool (default true), max_tokens: 100-20000}. |
| `full_content` | object | No | {enable: bool (default false), max_tokens: 100-100000}. Return full page content for results. |
| `subjects` | object | No | {enable: bool (default true), count: 1-5, max_sub_news: 1-20}. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"octen","path":"/news-search","body":{"query":"<string>","count":"<integer>","include_domains":"<array>","exclude_domains":"<array>","time_basis":"<string>","time_range":"<string>","start_time":"<string>","end_time":"<string>","language":"<array>","highlight":"<object>","full_content":"<object>","subjects":"<object>"}}'
```

### Business Search

Search companies and people, returning entity cards with key people, career history and recent activity alongside ranked web results.

`POST /business-search`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.octen.ai/api-reference/business-search

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | string | Yes | Company or person query (max 500 chars). |
| `count` | integer | No | Number of results (1-100, default 5). |
| `include_domains` | array | No | Domains to restrict results to. |
| `exclude_domains` | array | No | Domains to exclude. |
| `time_basis` | string | No | auto \| published \| crawled (default auto). |
| `time_range` | string | No | day \| week \| month \| year. |
| `start_time` | string | No | ISO 8601 start time. |
| `end_time` | string | No | ISO 8601 end time. |
| `language` | array | No | ISO 639-1 language codes, e.g. ["en"]. |
| `highlight` | object | No | {enable: bool (default true), max_tokens: 100-20000}. |
| `full_content` | object | No | {enable: bool (default false), max_tokens: 100-100000}. Return full page content for results. |
| `entities` | object | No | {enable: bool (default true), count: 1-20, max_activities: 1-20}. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"octen","path":"/business-search","body":{"query":"<string>","count":"<integer>","include_domains":"<array>","exclude_domains":"<array>","time_basis":"<string>","time_range":"<string>","start_time":"<string>","end_time":"<string>","language":"<array>","highlight":"<object>","full_content":"<object>","entities":"<object>"}}'
```

### Extract

Turn up to 20 URLs into clean, LLM-ready markdown or text, with optional query-focused highlights, links and media.

`POST /extract`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.octen.ai/api-reference/extract

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `urls` | array | Yes | URLs to extract (max 20, each max 2048 chars). |
| `mode` | string | No | standard (default, prioritizes speed) \| advanced (prioritizes success on hard-to-reach pages) \| auto (picks one per URL). advanced and auto can take longer, so raise timeout. |
| `query` | string | No | Intent keywords for highlights (max 500 chars). |
| `max_age_seconds` | integer | No | Max cache age, 300-31536000 (default 86400). |
| `format` | string | No | markdown \| text. |
| `timeout` | integer | No | Per-URL timeout seconds, 1-60. |
| `include_images` | boolean | No | Return image URLs. |
| `include_videos` | boolean | No | Return video URLs. |
| `include_audio` | boolean | No | Return audio URLs. |
| `include_links` | object | No | {scope: prefer_internal \| prefer_external, max_links: 1-1000}. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"octen","path":"/extract","body":{"urls":"<array>","mode":"<string>","query":"<string>","max_age_seconds":"<integer>","format":"<string>","timeout":"<integer>","include_images":"<boolean>","include_videos":"<boolean>","include_audio":"<boolean>","include_links":"<object>"}}'
```

### Text Embedding (octen-embedding-0.6b)

Convert up to 1000 texts into semantic vectors with octen-embedding-0.6b (max dimension 1024), optimized for high volume and low cost. The model is fixed for this endpoint.

`POST /embedding/octen-embedding-0.6b`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.octen.ai/api-reference/embedding

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `input` | array | Yes | Texts to embed (max 1000, each max 10000 chars, 2MB body). |
| `dimension` | integer | No | Output dimension (default 1024). |
| `input_type` | string | No | query \| document (retrieval prompts). |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"octen","path":"/embedding/octen-embedding-0.6b","body":{"input":"<array>","dimension":"<integer>","input_type":"<string>"}}'
```

### Text Embedding (octen-embedding-4b)

Convert up to 1000 texts into semantic vectors with octen-embedding-4b (max dimension 2560), balancing quality and cost. The model is fixed for this endpoint.

`POST /embedding/octen-embedding-4b`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.octen.ai/api-reference/embedding

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `input` | array | Yes | Texts to embed (max 1000, each max 10000 chars, 2MB body). |
| `dimension` | integer | No | Output dimension (default 2560). |
| `input_type` | string | No | query \| document (retrieval prompts). |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"octen","path":"/embedding/octen-embedding-4b","body":{"input":"<array>","dimension":"<integer>","input_type":"<string>"}}'
```

### Text Embedding (octen-embedding-8b)

Convert up to 1000 texts into semantic vectors with octen-embedding-8b (max dimension 4096), Octen's most accurate text embedding model. The model is fixed for this endpoint.

`POST /embedding/octen-embedding-8b`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.octen.ai/api-reference/embedding

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `input` | array | Yes | Texts to embed (max 1000, each max 10000 chars, 2MB body). |
| `dimension` | integer | No | Output dimension (default 4096). |
| `input_type` | string | No | query \| document (retrieval prompts). |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"octen","path":"/embedding/octen-embedding-8b","body":{"input":"<array>","dimension":"<integer>","input_type":"<string>"}}'
```

### VL Embedding (octen-vl-embedding)

Encode text, up to 5 images and one video into a shared vector space with octen-vl-embedding (max dimension 2048), as one fused vector or one vector per element. The model is fixed for this endpoint.

`POST /vl-embedding/octen-vl-embedding`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.octen.ai/api-reference/vl-embedding

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `input` | object | Yes | {contents: [{text}\|{image: https URL or data:image/...;base64,... URI, max 5MB}\|{video: https URL, max 50MB}]}. Max 20 elements, 5 images, 1 video; text max 10,000 characters total. |
| `enable_fusion` | boolean | No | Fuse all contents into one vector. |
| `dimension` | integer | No | Output dimension. |
| `fps` | number | No | Video frames per second, 0-1 (max 64 frames). |
| `instruct` | string | No | Task instruction (counts toward text tokens). |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"octen","path":"/vl-embedding/octen-vl-embedding","body":{"input":"<object>","enable_fusion":"<boolean>","dimension":"<integer>","fps":"<number>","instruct":"<string>"}}'
```

### VL Embedding (octen-vl-embedding-large)

Encode text, up to 5 images and one video into a shared vector space with octen-vl-embedding-large (max dimension 4096), as one fused vector or one vector per element. The model is fixed for this endpoint.

`POST /vl-embedding/octen-vl-embedding-large`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.octen.ai/api-reference/vl-embedding

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `input` | object | Yes | {contents: [{text}\|{image: https URL or data:image/...;base64,... URI, max 5MB}\|{video: https URL, max 50MB}]}. Max 20 elements, 5 images, 1 video; text max 10,000 characters total. |
| `enable_fusion` | boolean | No | Fuse all contents into one vector. |
| `dimension` | integer | No | Output dimension. |
| `fps` | number | No | Video frames per second, 0-1 (max 64 frames). |
| `instruct` | string | No | Task instruction (counts toward text tokens). |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"octen","path":"/vl-embedding/octen-vl-embedding-large","body":{"input":"<object>","enable_fusion":"<boolean>","dimension":"<integer>","fps":"<number>","instruct":"<string>"}}'
```

---

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