# Airscale — Orthogonal API

> Pay-per-use API on Orthogonal. Each call is billed to your Orthogonal balance.
> Base API: `https://mono.orthogonal.com/v1/run` · [llms.txt](https://mono.orthogonal.com/llms.txt) · [browse all APIs](https://mono.orthogonal.com/catalog)

Airscale B2B data API: find professional and personal emails and mobile numbers, extract person and company profiles, reverse email/phone lookups, search people and companies for list building, company lookalikes, Airsearch web research, LinkedIn post and engagement data, website technologies, ad lookups, Google Maps search, email verification and DNC checks.

**Verified:** yes

## Access

**Run API:** `POST https://mono.orthogonal.com/v1/run`
**Auth:** `Authorization: Bearer $ORTHOGONAL_API_KEY`
Get an API key at https://mono.orthogonal.com/account/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

### Find a professional email

Finds a professional email from a recognized person profile or from a complete name and company identifier. The JSON request body is limited to 256 KiB.

`POST /v1/email`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `linkedin_profile_url` | string | No | A recognized LinkedIn person-profile URL or identifier. Airscale normalizes supported profile inputs. |
| `first_name` | string | No |  |
| `last_name` | string | No |  |
| `domain` | string | No |  |
| `company_name` | string | No |  |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/email","body":{"linkedin_profile_url":"<string>","first_name":"<string>","last_name":"<string>","domain":"<string>","company_name":"<string>"}}'
```

### Find a mobile phone number

Finds a primary mobile phone number and all available normalized phone numbers for a recognized person profile.

`POST /v1/phone`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `linkedin_profile_url` | string | Yes | A recognized LinkedIn person-profile URL or identifier. Airscale normalizes supported profile inputs. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/phone","body":{"linkedin_profile_url":"<string>"}}'
```

### Find a person's profile URL

Finds a person's public profile URL from their name and company name.

`POST /v1/url-search-people`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `first_name` | string | Yes |  |
| `last_name` | string | Yes |  |
| `company_name` | string | Yes |  |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/url-search-people","body":{"first_name":"<string>","last_name":"<string>","company_name":"<string>"}}'
```

### Extract a person profile

Extracts public profile data. The submitted URL determines whether the successful response is a person or company object.

`POST /v1/profile`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `linkedin_profile_url` | string | Yes |  |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/profile","body":{"linkedin_profile_url":"<string>"}}'
```

### Extract a company profile

Extracts public profile data. The submitted URL determines whether the successful response is a person or company object.

`POST /v1/company`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `linkedin_profile_url` | string | Yes |  |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/company","body":{"linkedin_profile_url":"<string>"}}'
```

### Find a LinkedIn company URL from a domain

Accepts only a company domain and returns only its LinkedIn company URL. Use a current workspace API key from Airscale Settings; keys from the previous dashboard are not supported. The lookup deadline is 120 seconds; allow 130 seconds in the client. The charge may appear after the result, including after a top-up if your balance is insufficient.

`POST /v1/domain-to-linkedin`

**Estimated cost:** $0.002044

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `domain` | string | Yes | A company hostname without scheme, path, port, or credentials. Case and a leading www. are normalized. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/domain-to-linkedin","body":{"domain":"<string>"}}'
```

### Find a profile from an email

Resolves a public person profile from an email address, or returns the JSON string "not found" when no profile is available. A match usually returns a nested person record with camelCase keys: names are under profile (profile.firstName, profile.lastName), not at the top level. A match from a fallback lookup uses the flat fields of POST /v1/profile instead, or contains only url and identifier.

`POST /v1/reverse-email`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `email` | string | Yes |  |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/reverse-email","body":{"email":"<string>"}}'
```

### Find a profile from a phone number

Resolves a public person profile from a phone-number string, or returns a not_found status when no profile is available. A match returns the same nested person record as reverse email, plus a body field holding a copy of it.

`POST /v1/reverse-phone`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `mobile_phone` | string | Yes |  |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/reverse-phone","body":{"mobile_phone":"<string>"}}'
```

### Find people

Searches for people who match structured person, role, and company filters. The JSON request body is limited to 256 KiB.

`POST /v1/find-people`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | object | Yes |  |
| `size` | string | No | A page size from 1 through 100 supplied as an integer JSON number or one of the equivalent canonical decimal strings. OpenAPI intentionally uses canonical decimal strings even though runtime Number() accepts additional JS-coercible spellings. |
| `cursor` | string | No | An opaque value returned as next_cursor by the preceding page. Send it unchanged. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/find-people","body":{"query":"<object>","size":"<string>","cursor":"<string>"}}'
```

### Count people

Counts people using the exact same structured query contract as Find People, without retrieving or paginating lead records.

`POST /v1/find-people/count`

**Cost:** Free

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | object | Yes |  |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/find-people/count","body":{"query":"<object>"}}'
```

### List LinkedIn post commenters

Retrieves one synchronous, cursor-paginated page of people who commented on a LinkedIn post and enriches each returned profile.

`POST /v1/post-commenters`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `post_url` | string | Yes | An HTTP(S) LinkedIn post URL containing an activity identifier. |
| `limit` | integer | No | Number of engagements to request on this page. |
| `enrich_profiles` | boolean | No | Omitted or true enriches profiles at 0.2 credits per successful profile. False returns available engagement fields without profile lookups and costs 1 credit per fresh native provider page, including empty terminal pages; cached slices and identical retries are free. Keep the mode unchanged when continuing a cursor. |
| `cursor` | string | No | An opaque cursor returned by the preceding page. Send it unchanged. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/post-commenters","body":{"post_url":"<string>","limit":"<integer>","enrich_profiles":"<boolean>","cursor":"<string>"}}'
```

### Find companies

Searches for companies using firmographic, geographic, event, intent, technology, and website filters. The JSON request body is limited to 256 KiB.

`POST /v1/find-companies`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `filters` | object | Yes |  |
| `page` | string | No | A zero-based page supplied as an integer JSON number or one of the equivalent canonical decimal strings. OpenAPI intentionally uses canonical decimal strings even though runtime Number() accepts additional spellings. |
| `size` | string | No | A page size from 1 through 100 supplied as an integer JSON number or one of the equivalent canonical decimal strings. OpenAPI intentionally uses canonical decimal strings even though runtime Number() accepts additional spellings. |
| `cursor` | string | No | An opaque fc_ cursor returned by the preceding page. When supplied, its saved page size takes precedence over new page or size values. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/find-companies","body":{"filters":"<object>","page":"<string>","size":"<string>","cursor":"<string>"}}'
```

### List Find Companies filter values

Discovers normalized values accepted by location, industry, intent-topic, and technology filters.

`GET /v1/find-companies/filter-values`

**Cost:** Free

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `filter` | string | Yes | The Find Companies filter whose accepted values should be discovered. |
| `q` | string | No | At least one of q or query is required and must contain 2 to 120 characters after trimming. When q is present it is read first; a blank q suppresses query and returns 400. |
| `query` | string | No | At least one of q or query is required and must contain 2 to 120 characters after trimming. query is used only when q is absent. |
| `limit` | string | No | Omitted, non-numeric, or non-integer values default to 20; an explicit empty value becomes 0 then clamps to 1; integers below 1 clamp to 1; integers above 100 clamp to 100. |
| `country` | string | No | Optional country context supplied as repeat or comma-separated values. |
| `region` | string | No | Optional region context supplied as repeat or comma-separated values; a bare region name needs country context. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/find-companies/filter-values","method":"GET","query":{"filter":"<string>","q":"<string>","query":"<string>","limit":"<string>","country":"<string>","region":"<string>"}}'
```

### Search Leads Finder

Search with Leads Finder filters and zero-based page pagination. This filter model is different from Find people's query model.

`POST /v1/leads-finder`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `filters` | object | Yes | At least one non-empty filter other than searchMode is required. Use only the documented fields; some malformed legacy values are ignored by the runtime rather than rejected. |
| `page` | string | No |  |
| `size` | string | No |  |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/leads-finder","body":{"filters":"<object>","page":"<string>","size":"<string>"}}'
```

### Check business intent topics for a LinkedIn company

Checks selected business intent topic values for one LinkedIn company URL. Search valid topic values with the free GET /v1/find-companies/filter-values endpoint. The JSON request body is limited to 16 KiB.

`POST /v1/business-intent-topics`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `linkedin_company_url` | string | Yes | HTTPS LinkedIn company URL. Domains, person profiles, query strings, and fragments are not accepted. |
| `topics` | string | Yes | Copy complete topic value strings from GET /v1/find-companies/filter-values?filter=topics&q=... . |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/business-intent-topics","body":{"linkedin_company_url":"<string>","topics":"<string>"}}'
```

### Search LinkedIn posts

Returns one page of up to 50 LinkedIn posts matching keywords, author, mention, group, content-type, and date filters. Costs 1 credit per successful non-empty request; empty pages are free.

`POST /v1/post-search`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `keywords` | string | No | Words to search for in posts. |
| `author_keywords` | string | No | Words in the authors' profiles. |
| `author_profile_urls` | string | No | Posts written by these LinkedIn profiles (linkedin.com/in/...). A string or an array of up to 10 values. |
| `author_company_urls` | string | No | Posts published by these company pages, as LinkedIn company URLs or numeric company IDs. A string or an array of up to 10 values. |
| `author_employer_company_urls` | string | No | Posts whose authors work at these companies, as LinkedIn company URLs or numeric company IDs. A string or an array of up to 10 values. |
| `author_industry_ids` | string | No | Authors' company industry, as numeric LinkedIn industry IDs. A value or an array of up to 10 values. |
| `mentioning_profile_urls` | string | No | Posts that mention these LinkedIn profiles. A string or an array of up to 10 values. |
| `mentioning_company_urls` | string | No | Posts that mention these companies, as LinkedIn company URLs or numeric company IDs. A string or an array of up to 10 values. |
| `group_url` | string | No | Posts inside one LinkedIn group, as a group URL (linkedin.com/groups/...) or numeric group ID. |
| `content_type` | string | No |  |
| `sort_by` | string | No |  |
| `posted_within` | string | No | 24h, week, and month are filtered by LinkedIn. 1h, 3months, 6months, and year are applied to each fetched page, so pages can hold fewer than 50 posts; they require sort_by date. |
| `cursor` | string | No | The opaque `pagination.next_cursor` from the previous page. Send it unchanged with the same filters as the first page. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/post-search","body":{"keywords":"<string>","author_keywords":"<string>","author_profile_urls":"<string>","author_company_urls":"<string>","author_employer_company_urls":"<string>","author_industry_ids":"<string>","mentioning_profile_urls":"<string>","mentioning_company_urls":"<string>","group_url":"<string>","content_type":"<string>","sort_by":"<string>","posted_within":"<string>","cursor":"<string>"}}'
```

### Find company lookalikes

Finds companies similar to 1–10 reference domains and returns all results in a single response. Use your workspace API key and allow at least 100 seconds for the client timeout. Do not automatically retry this request. A search may complete even when you receive an error or no response, and repeating it can cause another charge.

`POST /v1/company-lookalikes`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `domains` | string | Yes | Reference company websites, normalized to domains and deduplicated. Accepts domains or website URLs, not LinkedIn URLs or IP addresses. Reference companies are excluded from results. |
| `limit` | integer | No | Total unique results across all references, not per domain. Maximum min(5000, 2000 × distinct normalized reference domains): 2000 for one, 4000 for two, 5000 for three through ten. Searches may return fewer results. |
| `include` | object | No | Optional company filters to include. |
| `exclude` | object | No | Optional company filters and domains to exclude. |
| `founded` | object | No | Optional founding-year bounds. min cannot exceed max. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/company-lookalikes","body":{"domains":"<string>","limit":"<integer>","include":"<object>","exclude":"<object>","founded":"<object>"}}'
```

### Search Google Maps

Search businesses within a strict circle around an address or supplied coordinates. Returns up to 500 unique businesses synchronously. Allow at least 100 seconds for the client timeout. Contact extraction is unavailable. Do not automatically retry after a timeout, disconnect, or uncertain result: repeating a search can cause another charge.

`POST /v1/google-maps`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | string | Yes | Business category or search phrase. Trimmed before validation. |
| `address` | string | Yes | Address or locality; still required with location. Trimmed before validation. |
| `radius_km` | integer | No | Strict circle radius in kilometers. Defaults only when omitted. |
| `limit` | integer | No | Maximum unique businesses. Defaults only when omitted. |
| `include_contacts` | boolean | No | Must be false; website contact extraction is unavailable. |
| `location` | object | No | Optional authoritative center, used instead of address geocoding. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/google-maps","body":{"query":"<string>","address":"<string>","radius_km":"<integer>","limit":"<integer>","include_contacts":"<boolean>","location":"<object>"}}'
```

### Find website technologies

Find technology names for one website. A balance of at least 0.5 credits is required before lookup. A nonempty result costs 0.5 credits; an empty result costs zero. Duplicate names are removed without regard to case. No caller idempotency key is supported; retrying can run and charge another lookup, including when the original response was lost.

`POST /v1/technologies`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `domain` | string | Yes | Bare website hostname or HTTP(S) URL. Whitespace is trimmed; the hostname is lowercased and leading www. and a trailing dot are removed. Paths and queries are ignored. IP literals, localhost, credentials, non-default ports, non-HTTP(S) schemes, and invalid domain labels are rejected. Send exactly one domain field. Maximum JSON body size: 16 KiB. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/technologies","body":{"domain":"<string>"}}'
```

### Look up Meta ads

Look up ads for one company domain. Only a finite numeric number_of_ads greater than zero costs one credit; zero, missing, nonnumeric, or nonpositive counts cost zero. A balance of at least one credit is required before lookup. No caller idempotency key is supported; retrying a successful lookup can incur another charge.

`POST /v1/meta-ads`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `domain` | string | Yes | Bare company hostname or HTTP(S) URL. Whitespace is trimmed; hostname is lowercased and leading www. and trailing dot are removed. Paths and queries are ignored. IP literals, credentials, non-default ports, and invalid domain labels are rejected. Maximum JSON body size: 16 KiB (oversize returns 400). |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/meta-ads","body":{"domain":"<string>"}}'
```

### Look up Google ads

Look up the first page of up to 20 Google ads for one company domain. A valid positive count or nonempty ads array costs one credit; a valid zero-ad result costs zero. A balance of at least one credit is required before lookup. No caller idempotency key is supported.

`POST /v1/google-ads`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `domain` | string | Yes | Bare company hostname or HTTP(S) URL. Whitespace is trimmed; hostname is lowercased and leading www. and trailing dot are removed. Paths and queries are ignored. IP literals, credentials, non-default ports, and invalid domain labels are rejected. Maximum JSON body size: 16 KiB (oversize returns 400). |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/google-ads","body":{"domain":"<string>"}}'
```

### Check a US phone number against the US DNC list

Checks a US phone number against the US Do Not Call list. A successful check costs one credit whether the number is listed or not. Non-US and malformed numbers are rejected before the lookup. The original /v1/dnc-check route accepts the same request and returns the same response for existing integrations. For UK numbers, use /v1/uk-dnc-check.

`POST /v1/us-dnc-check`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `phone` | string | No | Recommended phone field. A US phone number, normalized to +1 format. |
| `phone_number` | string | No | Alias used only if phone is null or absent. |
| `mobile_phone` | string | No | Alias used only if phone and phone_number are null or absent. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/us-dnc-check","body":{"phone":"<string>","phone_number":"<string>","mobile_phone":"<string>"}}'
```

### Check a UK phone number against TPS and CTPS

Checks one UK (+44) phone number against the UK TPS register for individuals and the CTPS register for businesses. A completed check costs one credit whether the number is listed or not. Non-UK and malformed numbers are rejected before the check and are not charged.

`POST /v1/uk-dnc-check`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `phone` | string | No | Recommended field. A UK number in national (020 7946 0000) or international (+44 20 7946 0000) format, including Crown dependency ranges. At most 32 characters; digits, spaces, parentheses, dots, hyphens, and a leading + only. |
| `phone_number` | string | No | Alias used only when phone is null or absent. |
| `mobile_phone` | string | No | Alias used only when phone and phone_number are null or absent. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/uk-dnc-check","body":{"phone":"<string>","phone_number":"<string>","mobile_phone":"<string>"}}'
```

### Verify an email address

Verify one email address for 0.5 credits. Allow at least 135 seconds plus a network margin for the response. Inconclusive verification returns risky without another charge. Read the result from body when present, otherwise from the top level. The legacy /email-verifier route is also available. No caller idempotency key is supported.

`POST /v1/email-verifier`

**Estimated cost:** $0.002044

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `email` | string | Yes | One email address. Surrounding whitespace is trimmed; the trimmed value must be at most 320 characters. Maximum JSON body size: 16 KiB. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/email-verifier","body":{"email":"<string>"}}'
```

### Research the web with Airsearch

Researches a public question and returns a sourced answer with optional requested output fields. The JSON request body is limited to 256 KiB.

`POST /v1/airsearch`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `prompt` | string | Yes | A research question or instruction that remains non-empty after surrounding whitespace is trimmed. |
| `schema` | object | No | Maps arbitrary requested output names to non-empty type keywords or plain-language descriptions. Stable envelope names are reserved because dynamic requested fields must not collide with status, response, reasoning, sources, confidence_score, certainty_tag, or duration_ms. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/airsearch","body":{"prompt":"<string>","schema":"<object>"}}'
```

### List LinkedIn post likers

Retrieves one synchronous, cursor-paginated page of people who liked a LinkedIn post and enriches each returned profile.

`POST /v1/post-likers`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `post_url` | string | Yes | An HTTP(S) LinkedIn post URL containing an activity identifier. |
| `limit` | integer | No | Number of engagements to request on this page. |
| `enrich_profiles` | boolean | No | Omitted or true enriches profiles at 0.2 credits per successful profile. False returns available engagement fields without profile lookups and costs 1 credit per fresh native provider page, including empty terminal pages; cached slices and identical retries are free. Keep the mode unchanged when continuing a cursor. |
| `cursor` | string | No | An opaque cursor returned by the preceding page. Send it unchanged. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/post-likers","body":{"post_url":"<string>","limit":"<integer>","enrich_profiles":"<boolean>","cursor":"<string>"}}'
```

### List a LinkedIn profile's comments

Returns one page of comments written by a LinkedIn profile, each with the post it was left on. Costs 1 credit per successful non-empty request; empty pages are free.

`POST /v1/profile-comments`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `profile_url` | string | Yes | LinkedIn profile URL (linkedin.com/in/...). |
| `posted_within` | string | No | Only return comments from this period. |
| `cursor` | string | No | The opaque `pagination.next_cursor` from the previous page. Send it unchanged with the same filters as the first page. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/profile-comments","body":{"profile_url":"<string>","posted_within":"<string>","cursor":"<string>"}}'
```

### List LinkedIn comment likers

Returns one page of up to 100 people who reacted to one LinkedIn comment. Costs 1 credit per successful non-empty request; empty pages are free.

`POST /v1/comment-likers`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `comment_url` | string | Yes | LinkedIn URL that identifies one comment (it contains urn:li:comment:(...)), such as a comment_url returned by Profile comments. |
| `cursor` | string | No | The opaque `pagination.next_cursor` from the previous page. Send it unchanged with the same filters as the first page. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/comment-likers","body":{"comment_url":"<string>","cursor":"<string>"}}'
```

### List a LinkedIn profile's posts

Returns one page of up to 50 posts from a LinkedIn profile's feed, newest first, including the person's posts and reposts. Costs 1 credit per successful non-empty request; empty pages are free.

`POST /v1/profile-posts`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `profile_url` | string | Yes | LinkedIn profile URL (linkedin.com/in/...). |
| `posted_within` | string | No | Only return posts from this period. The period is applied to each fetched page, so pages can hold fewer than 50 posts, and pagination stops at the first page with no post inside the period. |
| `cursor` | string | No | The opaque `pagination.next_cursor` from the previous page. Send it unchanged with the same filters as the first page. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/profile-posts","body":{"profile_url":"<string>","posted_within":"<string>","cursor":"<string>"}}'
```

### List a LinkedIn company's posts

Returns one page of up to 50 posts from a LinkedIn company page's feed, newest first. Costs 1 credit per successful non-empty request; empty pages are free.

`POST /v1/company-posts`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `company_url` | string | Yes | LinkedIn company URL (linkedin.com/company/...) or numeric company ID. |
| `posted_within` | string | No | Only return posts from this period. The period is applied to each fetched page, so pages can hold fewer than 50 posts, and pagination stops at the first page with no post inside the period. |
| `cursor` | string | No | The opaque `pagination.next_cursor` from the previous page. Send it unchanged with the same filters as the first page. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/company-posts","body":{"company_url":"<string>","posted_within":"<string>","cursor":"<string>"}}'
```

### Check WhatsApp availability

Check one phone number. Definitive yes and no outcomes both cost one credit. An optional Idempotency-Key makes retries of the same phone reuse the operation; a different phone with the same key returns 409. When omitted, the server generates an operation ID. Save the returned ID for reconciliation.

`POST /v1/whatsapp-check`

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

**Docs:** https://docs.airscale.io/

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `phone` | string | Yes | Strict E.164 number, with no spaces or punctuation other than the leading +. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"airscale","path":"/v1/whatsapp-check","body":{"phone":"<string>"}}'
```

---

Full details and an interactive quickstart: https://mono.orthogonal.com/publisher/airscale
