# Extruct AI — 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)

Extruct AI company research API. Semantic company search, lookalike company search, company profile lookup and enrichment, async deep search discovery tasks, and deep research report generation with citations. Find and discover companies using natural language queries, find similar companies to any domain, run AI-powered discovery tasks, and generate cited research reports on companies, people, and teams.

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

### Search Companies (POST)

POST variant of company search. Send filters as a JSON object (not a string). Use when exclude.domains list is too large for a GET URL.

`POST /v1/companies/search`

**Estimated cost:** $0.09

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `q` | string | Yes | Search query |
| `filters` | object | No | Structured filters object with include/exclude keys for size, country, city, domains, and founded_year_range |
| `pagination` | object | No | Offset/limit pagination object |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"extruct-ai","path":"/v1/companies/search","body":{"q":"<string>","filters":"<object>","pagination":"<object>"}}'
```

### Find Similar Companies

[Deprecated — use POST /v1/companies/{company_identifier}/similar instead.] Find companies similar to a reference company (UUID or domain). Supports same filters as semantic search.

`GET /v1/companies/{company_identifier}/similar`

**Estimated cost:** $0.09

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `company_identifier` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `filters` | string | No | JSON string of SearchFilters. Keys: include.size/country/city, exclude.size/country/city/domains, founded_year_range.min/max |
| `offset` | number | No | Pagination offset |
| `limit` | number | No | Pagination limit |

```bash
# Replace {company_identifier} 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":"extruct-ai","path":"/v1/companies/{company_identifier}/similar","method":"GET","query":{"filters":"<string>","offset":"<number>","limit":"<number>"}}'
```

### Get Discovery Task

Get a Deep Search task by ID, including status and metadata.

`GET /v1/discovery_tasks/{task_id}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `task_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |

```bash
# Replace {task_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":"extruct-ai","path":"/v1/discovery_tasks/{task_id}","method":"GET"}'
```

### Lookup Company Profile

Look up the canonical enriched Extruct company profile for a known company UUID or domain.

`GET /v1/companies/{company_identifier}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `company_identifier` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |

```bash
# Replace {company_identifier} 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":"extruct-ai","path":"/v1/companies/{company_identifier}","method":"GET"}'
```

### Get Discovery Task Results

Get the results of a Deep Search task by task ID.

`GET /v1/discovery_tasks/{task_id}/results`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `task_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `offset` | number | No | Pagination offset |
| `limit` | number | No | Pagination limit |

```bash
# Replace {task_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":"extruct-ai","path":"/v1/discovery_tasks/{task_id}/results","method":"GET","query":{"offset":"<number>","limit":"<number>"}}'
```

### Get Deep Research Task

Get a Deep Research task by ID, including the full cited report once status is done.

`GET /v1/deep_research_tasks/{task_id}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `task_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |

```bash
# Replace {task_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":"extruct-ai","path":"/v1/deep_research_tasks/{task_id}","method":"GET"}'
```

### Search Companies

[Deprecated — use POST /v1/companies/search instead.] Find companies using a natural-language query. Use filters (JSON string) to narrow results by size, country, city, and founded year range.

`GET /v1/companies/search`

**Estimated cost:** $0.09

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `q` | string | Yes | Search query |
| `filters` | string | No | JSON string of SearchFilters. Keys: include.size/country/city, exclude.size/country/city/domains, founded_year_range.min/max |
| `offset` | number | No | Pagination offset |
| `limit` | number | No | Pagination limit |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"extruct-ai","path":"/v1/companies/search","method":"GET","query":{"q":"<string>","filters":"<string>","offset":"<number>","limit":"<number>"}}'
```

### Find Similar Companies (POST)

POST variant of lookalike search. Send filters as a JSON object. Use when exclude.domains list is too large for a GET URL.

`POST /v1/companies/{company_identifier}/similar`

**Estimated cost:** $0.09

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `company_identifier` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `filters` | object | No | Structured filters object with include/exclude keys for size, country, city, domains, and founded_year_range |
| `pagination` | object | No | Offset/limit pagination object |

```bash
# Replace {company_identifier} 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":"extruct-ai","path":"/v1/companies/{company_identifier}/similar","body":{"filters":"<object>","pagination":"<object>"}}'
```

### Create Deep Research Task

Create an async Deep Research task that produces a cited report on a company, person, or team. Requires a Pro plan.

`POST /v1/deep_research_tasks`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `brief` | string | Yes | Free-text research brief about a company, person, or team |
| `depth` | string | No | Research depth: medium (5 agents), high (15), xhigh (25). Default: medium |
| `output_schema` | object | No | Optional JSON Schema for structured report output. Omit for markdown. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"extruct-ai","path":"/v1/deep_research_tasks","body":{"brief":"<string>","depth":"<string>","output_schema":"<object>"}}'
```

### Resume Discovery Task

Request additional results for a completed Deep Search task.

`POST /v1/discovery_tasks/{task_id}/resume`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `task_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `desired_new_results` | number | No | Additional results requested (default 25, limited by 250-result task cap) |

```bash
# Replace {task_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":"extruct-ai","path":"/v1/discovery_tasks/{task_id}/resume","body":{"desired_new_results":"<number>"}}'
```

### Create Discovery Task

Create an async Deep Search task. An AI agent ranks companies against your natural-language criteria using web, Extruct DB, Maps, and LinkedIn.

`POST /v1/discovery_tasks`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | string | Yes | Ideal description of companies to find |
| `desired_num_results` | number | No | Target number of results (max 250, default 100) |
| `auto_data_sources` | boolean | No | Automatically determine best data sources based on query (default true) |
| `data_sources` | array | No | Manual data source selection array (ignored if auto_data_sources is true) |
| `criteria` | array | No | Optional criteria array for evaluating discovered companies. Each criterion graded 1-5. |
| `exclude_domains` | array | No | Domains of companies the run must not return |
| `exclude_task_ids` | array | No | IDs of completed Deep Search tasks whose returned companies must be excluded |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"extruct-ai","path":"/v1/discovery_tasks","body":{"query":"<string>","desired_num_results":"<number>","auto_data_sources":"<boolean>","data_sources":"<array>","criteria":"<array>","exclude_domains":"<array>","exclude_task_ids":"<array>"}}'
```

---

Full details and an interactive quickstart: https://orthogonal.com/discover/extruct-ai
