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

GTM intelligence platform. Search companies by traits/signals, enrich accounts with firmographic data, find and enrich people, get account timelines and insights, and deploy signal-monitoring agents.

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

### Get Accounts

Fetch account records in bulk by account IDs or domains. Use this when you already know the companies and want OpenFunnel account details, signals, and optional ICP people pagination in one request.

`POST /api/v2/account/batch`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `account_ids` | string | No | List of account IDs to get details for. Either account_ids or account_domains is required. |
| `account_domains` | string | No | List of account domains to get details for. Either account_ids or account_domains is required. |
| `icp_people_page` | integer | No | Page number for icp_people pagination (1-indexed, default 1) |
| `icp_people_page_size` | integer | No | Number of icp_people to return per page (default 100, max 500) |
| `max_signals_per_account` | integer | No | Maximum number of most recent signals to return per account (default 10, max 100) |
| `raw_content` | boolean | No | When false, it fetches faster responses that omit job_title, job_posting, post_content, and similar content-derived fields. Set to true to fetch full signal_content for each signal (job postings, social posts, etc.). |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"openfunnel","path":"/api/v2/account/batch","body":{"account_ids":"<string>","account_domains":"<string>","icp_people_page":"<integer>","icp_people_page_size":"<integer>","max_signals_per_account":"<integer>","raw_content":"<boolean>"}}'
```

### List People Ids

List people IDs that match structured filters from the people filters endpoint. Supports pagination and sorting, so it is useful for finding contacts by role, seniority, company, or other people attributes.

`POST /api/v1/people/filtered-people`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `filters` | string | No | Filters using V2 field names (matching /people/filters endpoint output) |
| `sort_key` | string | No |  |
| `sort_direction` | string | No |  |
| `page` | integer | No |  |
| `page_size` | integer | No |  |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"openfunnel","path":"/api/v1/people/filtered-people","body":{"filters":"<string>","sort_key":"<string>","sort_direction":"<string>","page":"<integer>","page_size":"<integer>"}}'
```

### Instant search on traits

Search companies by natural-language traits such as industry, product, business model, buyer, or technology usage. Use query and optional limit to return ranked company matches with relevance data.

`GET /api/v1/account/search-by-traits`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | string | Yes | Natural language description of company traits |
| `limit` | number | No | Max results to return |
| `query` | string | Yes | Describe the type of companies you're looking for |
| `limit` | integer | No | Maximum number of results to return (1-100) |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"openfunnel","path":"/api/v1/account/search-by-traits","method":"GET","query":{"query":"<string>","limit":"<integer>"},"body":{"query":"<string>","limit":"<number>"}}'
```

### List Accounts

List account IDs that match structured account filters from the account filters endpoint. Supports pagination and sorting, so it is useful for browsing or exporting companies after choosing filter criteria.

`POST /api/v2/account/filtered-accounts`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `filters` | string | No | Filters using V2 field names (matching /filters endpoint output) |
| `sort_key` | string | No |  |
| `sort_direction` | string | No |  |
| `page` | integer | No |  |
| `page_size` | integer | No |  |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"openfunnel","path":"/api/v2/account/filtered-accounts","body":{"filters":"<string>","sort_key":"<string>","sort_direction":"<string>","page":"<integer>","page_size":"<integer>"}}'
```

### Get Account Filters

Return the available account filter fields and allowed values for filtered account searches. Use this before filtered account search to build valid filter payloads.

`GET /api/v2/account/filters`

**Cost:** Free

_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":"openfunnel","path":"/api/v2/account/filters","method":"GET"}'
```

### Get People Filters

Return the available people filter fields and allowed values for filtered people searches. Use this before filtered people search to build valid filter payloads.

`GET /api/v1/people/filters`

**Cost:** Free

_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":"openfunnel","path":"/api/v1/people/filters","method":"GET"}'
```

### Deep Enrich

Start a background enrichment run for a company domain. OpenFunnel creates or finds the account, discovers intent signals, finds relevant people, and ICP-qualifies them. Requires domain plus either icp_id or target_icp_roles; jobs can take 15 to 30 minutes.

`POST /api/v1/enrich/deep-enrich`

**Estimated cost:** $0.132

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `domain` | string | Yes | Request model for end-to-end company qualification and people enrichment. |
| `goal` | string | No | Search goal (overrides default pitch) |
| `icp_id` | integer | No | ICP ID to fetch target roles from |
| `target_icp_roles` | string | No | Target ICP roles (overrides icp_id roles) |
| `timeframe` | integer | No | Timeframe in days to search back |
| `max_jobs_to_check` | integer | No | Max jobs to check for relevance |
| `campaign_name` | string | No | Campaign name to create for enriched people |
| `people_locations` | string | No | Target people locations (overrides ICP) |
| `people_sub_locations` | string | No | Target people sub-locations (overrides ICP) |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"openfunnel","path":"/api/v1/enrich/deep-enrich","body":{"domain":"<string>","goal":"<string>","icp_id":"<integer>","target_icp_roles":"<string>","timeframe":"<integer>","max_jobs_to_check":"<integer>","campaign_name":"<string>","people_locations":"<string>","people_sub_locations":"<string>"}}'
```

---

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