# Enrich Layer — 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)

B2B people, company, contact, job and school data: profile enrichment, lookups, reverse email/phone, employee listing and people/company search.

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

### Personal Phone Lookup

Personal phone numbers for a LinkedIn, Twitter/X or Facebook profile. $0.0236 per number returned. No numbers found means no charge. page_size defaults to 10 on Orthogonal (0 = no limit). x402/MPP callers prepay for the requested page_size (50 if 0).

`GET /contact-api/personal-contact`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `profile_url` | string | No | The Profile URL from which you wish to extract personal contact numbers Include only one of: `profile_url`, `twitter_profile_url`, or `facebook_profile_url`. |
| `twitter_profile_url` | string | No | The Twitter/X Profile URL from which you wish to extract personal contact numbers Include only one of: `profile_url`, `twitter_profile_url`, or `facebook_profile_url`. |
| `facebook_profile_url` | string | No | The Facebook Profile URL from which you wish to extract personal contact numbers Include only one of: `profile_url`, `twitter_profile_url`, or `facebook_profile_url`. |
| `page_size` | string | No | Maximum numbers to return. Orthogonal default is 10. Set 0 for unlimited (x402/MPP callers then prepay for 50). You are billed per number returned. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/contact-api/personal-contact","method":"GET","query":{"profile_url":"<string>","twitter_profile_url":"<string>","facebook_profile_url":"<string>","page_size":"<string>"}}'
```

### Job Profile

Structured job posting data from a LinkedIn job URL. $0.0472 per call.

`GET /job`

**Estimated cost:** $0.0472

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `url` | string | Yes | URL of the a Job Profile to target. The [Job Search](/docs/api/v2/jobs-api/job-search) endpoint can be used to retrieve a job URL. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/job","method":"GET","query":{"url":"<string>"}}'
```

### Person Profile Picture

Get a cached person profile picture URL from a LinkedIn profile URL. Free.

`GET /person/profile-picture`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `person_profile_url` | string | Yes | Profile URL of the person that you are trying to get the profile picture of. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/person/profile-picture","method":"GET","query":{"person_profile_url":"<string>"}}'
```

### Person Profile

Structured person profile from a LinkedIn, Twitter/X or Facebook URL. $0.0236 per call (use_cache defaults to if-present). extra, GitHub/Facebook/Twitter IDs and inferred_salary: +$0.0236 each, only when that data is returned. personal_email / personal_contact_number: +$0.0236 per item returned. skills: free. use_cache=if-recent +$0.0236; live_fetch=force +$0.2124. x402/MPP callers prepay each requested add-on (3 items each for email/phone).

`GET /profile`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `profile_url` | string | No | The Profile URL from which you wish to extract. We support both raw UTF-8 input and URL-encoded input. For example, `https://linkedin.com/in/rodríguez/` and `https://linkedin.com/in/rodr%C3%ADguez/` are both valid. We don't support URLs with a hashed ID, e.g. `https://www.linkedin.com/in/ACwAAExzrQ0Bjqu...` Include only one of: `profile_url`, `twitter_profile_url`, or `facebook_profile_url`. |
| `twitter_profile_url` | string | No | The Twitter/X Profile URL from which you wish to extract person profile URL should be in the format of `https://x.com/<public-identifier>` Include only one of: `profile_url`, `twitter_profile_url`, or `facebook_profile_url`. |
| `facebook_profile_url` | string | No | The Facebook Profile URL from which you wish to extract person profile URL should be in the format of `https://facebook.com/<public-identifier>` Include only one of: `profile_url`, `twitter_profile_url`, or `facebook_profile_url`. |
| `extra` | string | No | include to add extra details (gender, birth date, industry, interests). +$0.0236, charged only if data is returned. Default exclude. |
| `github_profile_id` | string | No | include to add the GitHub ID. +$0.0236, charged only if data is returned. Default exclude. |
| `facebook_profile_id` | string | No | include to add the Facebook ID. +$0.0236, charged only if data is returned. Default exclude. |
| `twitter_profile_id` | string | No | include to add the Twitter/X ID. +$0.0236, charged only if data is returned. Default exclude. |
| `personal_contact_number` | string | No | include to add personal phone numbers. +$0.0236 per number returned. Default exclude. |
| `personal_email` | string | No | include to add personal emails. +$0.0236 per email returned. Default exclude. |
| `inferred_salary` | string | No | include to add an inferred salary range. +$0.0236, charged only if data is returned. Default exclude. |
| `skills` | string | No | include to add skills (limited coverage: historic or inferred only). Free. Default exclude. |
| `use_cache` | string | No | if-present (Orthogonal default): cached profile regardless of age; sourced externally if not cached. if-recent: best effort profile no older than 29 days, +$0.0236. |
| `fallback_to_cache` | string | No | Tweaks the fallback behavior if an error arises from fetching a fresh profile. This parameter accepts the following values: * `on-error` (default value) - Fallback to reading the profile from cache if an error arises. * `never` - Do not ever read profile from cache. |
| `live_fetch` | string | No | force: fetch a fresh profile, +$0.2124. default (default): do not force; prefer use_cache=if-recent. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/profile","method":"GET","query":{"profile_url":"<string>","twitter_profile_url":"<string>","facebook_profile_url":"<string>","extra":"<string>","github_profile_id":"<string>","facebook_profile_id":"<string>","twitter_profile_id":"<string>","personal_contact_number":"<string>","personal_email":"<string>","inferred_salary":"<string>","skills":"<string>","use_cache":"<string>","fallback_to_cache":"<string>","live_fetch":"<string>"}}'
```

### Company Search

Search companies by industry, location, size, funding and more. Billed per result returned: $0.0708 each, +$0.0236 with enrich_profiles=enrich, +$0.0472 with use_cache=if-recent. page_size defaults to 10 on Orthogonal (max 100; max 10 with enrich or if-recent), so a default search costs at most $0.708. x402/MPP callers prepay for the requested page_size.

`GET /search/company`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `country` | string | No | Filter companies with an office based in this country. This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). |
| `region` | string | No | Filter companies with an office based in this region. A “region” in this context means “state,” “province,” or similar political division, depending on what country you’re querying. |
| `city` | string | No | Filter companies based in cities matching the provided search expression. |
| `type` | string | No | Filter companies of the provided type. Possible values: * `EDUCATIONAL`: Educational Institution * `GOVERNMENT_AGENCY`: Government Agency * `NON_PROFIT` : Nonprofit * `PARTNERSHIP` : Partnership * `PRIVATELY_HELD` : Privately Held * `PUBLIC_COMPANY` : Public Company * `SELF_EMPLOYED` : Self-Employed * `SELF_OWNED` : Sole Proprietorship |
| `follower_count_min` | string | No | Filter companies with a follower count of **more than** this value. |
| `follower_count_max` | string | No | Filter companies with a follower count **less than** this value. |
| `name` | string | No | Filter companies with a name matching the provided search expression. |
| `industry` | string | No | Filter companies whose industry matches this search expression. Values come from a fixed list (https://enrichlayer.com/docs/guides/industry-values) and can be inferred, e.g. Apple may match both Computers and Electronics Manufacturing and Software Development. Use primary_industry to match the primary industry only. |
| `primary_industry` | string | No | Filter companies that has an industry that matches the provided search expression as the primary industry. The `industry` attribute, found in a Company profile, describes the primary industry in which the company operates. The value of this attribute is an enumerator. [See the full list of possible values for this attribute](/docs/guides/industry-values). |
| `specialities` | string | No | Filter companies that have a speciality that matches the provided search expression. Please note that we use the spelling `specialities` rather than `specialties` in this document. |
| `employee_count_category` | string | No | Filter companies based on their employee count category. This parameter will take precedence over `employee_count_min` and `employee_count_max` parameters. The valid values are: - `custom` (default): uses `employee_count_min` and `employee_count_max` parameters - `startup`: 1-10 employees - `small`: 11-50 employees - `medium`: 51-250 employees - `large`: 251-1000 employees - `enterprise`: 1001+ employees |
| `employee_count_max` | string | No | Filter companies with **at most** this many employees. |
| `employee_count_min` | string | No | Filter companies with **at least** this many employees. |
| `description` | string | No | Filter companies with a description matching the provided search expression. |
| `founded_after_year` | string | No | Filter companies founded **after** this year. |
| `founded_before_year` | string | No | Filter companies founded **before** this year. |
| `funding_amount_max` | string | No | Filter companies that have raised **at most** this much (USD) funding amount. |
| `funding_amount_min` | string | No | Filter companies that have raised **at least** this much (USD) funding amount. |
| `funding_raised_after` | string | No | Filter companies that have raised funding **after** this date. |
| `funding_raised_before` | string | No | Filter companies that have raised funding **before** this date. |
| `public_identifier_in_list` | string | No | A list of public identifiers (the identifying portion of the company’s profile URL). The target company’s identifier must be a member of this list. |
| `public_identifier_not_in_list` | string | No | A list of public identifiers (the identifying portion of the company’s profile URL). The target company’s identifier must **not** be a member of this list. |
| `domain_name` | string | No | Filter companies with a domain name matching the provided search expression. |
| `page_size` | string | No | Maximum results to return. Orthogonal default is 10 (Enrich Layer would default to 100). Accepted 1 to 100; limited to 10 with enrich_profiles=enrich or use_cache=if-recent. You are billed per result returned. |
| `enrich_profiles` | string | No | skip (default): company URLs only. enrich: full company data, +$0.0236 per result; limits page_size to 10. |
| `use_cache` | string | No | if-present (default): no freshness guarantee. if-recent: best effort results no older than 29 days, +$0.0472 per result; limits page_size to 10. |
| `next_token` | string | No | The token for fetching the next page of results. Take the value of the `next_token` query parameter from the `next_page` URL of the previous response. When this parameter is provided, the search query is restored from the token. Filter parameters are not applied to the search, but they must still be syntactically valid, otherwise the request fails with a 400; only `page_size`, `enrich_profiles` and `use_cache` are honored. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/search/company","method":"GET","query":{"country":"<string>","region":"<string>","city":"<string>","type":"<string>","follower_count_min":"<string>","follower_count_max":"<string>","name":"<string>","industry":"<string>","primary_industry":"<string>","specialities":"<string>","employee_count_category":"<string>","employee_count_max":"<string>","employee_count_min":"<string>","description":"<string>","founded_after_year":"<string>","founded_before_year":"<string>","funding_amount_max":"<string>","funding_amount_min":"<string>","funding_raised_after":"<string>","funding_raised_before":"<string>","public_identifier_in_list":"<string>","public_identifier_not_in_list":"<string>","domain_name":"<string>","page_size":"<string>","enrich_profiles":"<string>","use_cache":"<string>","next_token":"<string>"}}'
```

### Company Profile

Structured company profile from a LinkedIn company URL. $0.0236 per call (use_cache defaults to if-present). categories, funding_data, exit_data and acquisitions: +$0.0236 each only when requested AND data is returned. extra: +$0.0236 whenever requested. use_cache=if-recent (data no older than 29 days) +$0.0236; live_fetch=force +$0.2124. Max $0.3776 per call. x402/MPP callers prepay every requested add-on.

`GET /company`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `url` | string | Yes | URL Company Profile to crawl. |
| `categories` | string | No | include to add company categories. +$0.0236 only if categories are returned. Default exclude. |
| `funding_data` | string | No | include to add funding rounds. +$0.0236 only if funding rounds are returned. Default exclude. |
| `exit_data` | string | No | include to add investment portfolio exits. +$0.0236 only if exits are returned. Default exclude. |
| `acquisitions` | string | No | include to add acquisitions data (companies acquired and acquirer). +$0.0236 only if acquisition data is returned. Default exclude. |
| `extra` | string | No | include to add extra details (Crunchbase rank, contact email, phone, Facebook/Twitter accounts, funding totals, IPO status, investors). +$0.0236 whenever requested, even if few fields come back. Default exclude. |
| `use_cache` | string | No | if-present (Orthogonal default): cached profile regardless of age; sourced externally if not cached. if-recent: best effort profile no older than 29 days, +$0.0236. |
| `fallback_to_cache` | string | No | Tweaks the fallback behavior if an error arises from fetching a fresh profile. This parameter accepts the following values: * `on-error` (default value) - Fallback to reading the profile from cache if an error arises. * `never` - Do not ever read profile from cache. |
| `live_fetch` | string | No | force: fetch a fresh profile, +$0.2124. default (default): do not force; prefer use_cache=if-recent. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/company","method":"GET","query":{"url":"<string>","categories":"<string>","funding_data":"<string>","exit_data":"<string>","acquisitions":"<string>","extra":"<string>","use_cache":"<string>","fallback_to_cache":"<string>","live_fetch":"<string>"}}'
```

### Company Profile Picture

Get a cached company profile picture URL from a LinkedIn company URL. Free.

`GET /company/profile-picture`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `company_profile_url` | string | Yes | Profile URL of the company that you are trying to get the profile picture of. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/company/profile-picture","method":"GET","query":{"company_profile_url":"<string>"}}'
```

### Disposable Email Check

Check whether an email address belongs to a disposable email service. Free.

`GET /disposable-email`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `email` | string | Yes | Email address to check |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/disposable-email","method":"GET","query":{"email":"<string>"}}'
```

### Company Lookup

Resolve a company profile URL from company name, domain and/or location. $0.0472 per call, +$0.0236 with enrich_profile=enrich. Charged even when no match is found.

`GET /company/resolve`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `company_location` | string | No | The location / region of company. ISO 3166-1 alpha-2 codes |
| `company_domain` | string | No | Company website or Company domain Requires either `company_domain` or `company_name` |
| `company_name` | string | No | Company Name Requires either `company_domain` or `company_name` |
| `enrich_profile` | string | No | skip (default) or enrich: add the cached profile to the result, +$0.0236. For fresh data, chain with the profile endpoint using use_cache=if-recent. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/company/resolve","method":"GET","query":{"company_location":"<string>","company_domain":"<string>","company_name":"<string>","enrich_profile":"<string>"}}'
```

### Role Lookup

Find the person who best matches a role at a company, e.g. CTO of Apple. $0.0708 per call, +$0.0236 with enrich_profile=enrich. Charged even when no match is found.

`GET /find/company/role/`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `role` | string | Yes | Role of the profile that you are looking up |
| `company_name` | string | Yes | Name of the company that you are searching for |
| `enrich_profile` | string | No | skip (default) or enrich: add the cached profile to the result, +$0.0236. For fresh data, chain with the profile endpoint using use_cache=if-recent. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/find/company/role/","method":"GET","query":{"role":"<string>","company_name":"<string>","enrich_profile":"<string>"}}'
```

### School Profile

Structured school profile from a LinkedIn school URL. $0.0236 per call. use_cache=if-recent (data no older than 29 days) +$0.0236; live_fetch=force +$0.2124.

`GET /school`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `url` | string | Yes | URL of the School Profile to crawl. |
| `use_cache` | string | No | if-present (default): cached profile regardless of age; sourced externally if not cached. if-recent: best effort profile no older than 29 days, +$0.0236. |
| `live_fetch` | string | No | force: fetch a fresh profile, +$0.2124. default (default): do not force; prefer use_cache=if-recent. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/school","method":"GET","query":{"url":"<string>","use_cache":"<string>","live_fetch":"<string>"}}'
```

### Company ID Lookup

Resolve a numeric LinkedIn company ID to its vanity identifier. Free.

`GET /company/resolve-id`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `id` | string | Yes | The company's internal, immutable numeric ID. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/company/resolve-id","method":"GET","query":{"id":"<string>"}}'
```

### Employee Listing

List a company's employees. Charged up front for page_size (default 10; max 10 with enrich or if-recent) at $0.0708 per employee. Per employee: country +$0.0708, enrich_profiles=enrich +$0.0236, use_cache=if-recent +$0.0472. Role search: +$0.236 per call and +$0.0708 per employee. sort_by: +$1.18 per call and +$0.236 per employee ($4.25 at page_size 10). Call Employee Count first so you don't pay for more employees than exist.

`GET /company/employees/`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `url` | string | Yes | URL of the Company Profile to target. |
| `coy_name_match` | string | No | include (default): also list profiles whose work experience exactly matches the company name, not just the company URL. exclude: match by company URL only. |
| `use_cache` | string | No | if-present (default): no freshness guarantee. if-recent: best effort profiles no older than 29 days, +$0.0472 per employee; limits page_size to 10. |
| `country` | string | No | Comma-separated ISO 3166-1 alpha-2 country codes, case-insensitive (e.g. us or us,sg). +$0.0708 per employee. |
| `enrich_profiles` | string | No | skip (default): profile URLs only. enrich: full employee profiles, +$0.0236 per employee; limits page_size to 10. |
| `boolean_role_search` | string | No | Filter by job title with a boolean search expression (max 255 chars, case-insensitive). Takes precedence over role_search. +$0.236 per call and +$0.0708 per employee. |
| `role_search` | string | No | Deprecated; use boolean_role_search. Case-insensitive Lucene regular expression matched against the title, anchored at both ends (wrap in .* for partial matches). +$0.236 per call and +$0.0708 per employee. |
| `page_size` | string | No | Max employees returned, 1 to 9999 (default 10). Max 10 with enrich_profiles=enrich or use_cache=if-recent. You are charged up front for this many employees, so set it to what you need (check Employee Count first). |
| `employment_status` | string | No | Parameter to tell the API to return past or current employees. Valid values are `current`, `past`, and `all`: * `current` (default) : lists current employees * `past` : lists past employees * `all` : lists current & past employees |
| `sort_by` | string | No | recently-joined, recently-left, oldest, or none (default). Any value other than none adds $1.18 per call and $0.236 per employee ($4.25 total at page_size 10). Use only when order matters. |
| `resolve_numeric_id` | string | No | true: support company URLs with numeric IDs, +$0.0472 per call. false (default). |
| `after` | string | No | The cursor for fetching the next page of results. Take the value of the `after` query parameter from the `next_page` URL of the previous response. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/company/employees/","method":"GET","query":{"url":"<string>","coy_name_match":"<string>","use_cache":"<string>","country":"<string>","enrich_profiles":"<string>","boolean_role_search":"<string>","role_search":"<string>","page_size":"<string>","employment_status":"<string>","sort_by":"<string>","resolve_numeric_id":"<string>","after":"<string>"}}'
```

### Personal Email Lookup

Personal emails for a LinkedIn, Twitter/X or Facebook profile. $0.0236 per email returned (valid or invalid), $0.0472 with email_validation=precise; fast validation is free. No emails found means no charge. page_size defaults to 10 on Orthogonal (0 = no limit). x402/MPP callers prepay for the requested page_size (50 if 0).

`GET /contact-api/personal-email`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `profile_url` | string | No | The Profile URL from which you wish to extract personal email addresses. Include only one of: `profile_url`, `twitter_profile_url`, or `facebook_profile_url`. |
| `twitter_profile_url` | string | No | The Twitter/X Profile URL from which you wish to extract personal email addresses. Include only one of: `profile_url`, `twitter_profile_url`, or `facebook_profile_url`. |
| `facebook_profile_url` | string | No | The Facebook Profile URL from which you wish to extract personal email addresses. Include only one of: `profile_url`, `twitter_profile_url`, or `facebook_profile_url`. |
| `email_validation` | string | No | none (default): no validation. fast: quick validation, free. precise: deliverability validation, +$0.0236 per email. include = precise, exclude = none. |
| `page_size` | string | No | Maximum emails to return. Orthogonal default is 10. Set 0 for unlimited (x402/MPP callers then prepay for 50). You are billed per email returned. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/contact-api/personal-email","method":"GET","query":{"profile_url":"<string>","twitter_profile_url":"<string>","facebook_profile_url":"<string>","email_validation":"<string>","page_size":"<string>"}}'
```

### Reverse Phone Lookup

Find social profiles associated with an E.164 phone number. $0.0708 when a profile is found; free when nothing is found on the credits rail (x402/MPP always prepay $0.0708).

`GET /resolve/phone`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `phone_number` | string | Yes | [E.164 formatted](/docs/guides/e164-phone-format) phone number of the person you want to identify social media profiles of. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/resolve/phone","method":"GET","query":{"phone_number":"<string>"}}'
```

### Company Job Search

Search a company's job postings by search_id (from Company Profile), keyword, type, experience level, recency, flexibility and geo. $0.0472 per call.

`GET /company/job`

**Estimated cost:** $0.0472

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `job_type` | string | No | The nature of the job. It accepts the following 7 case-insensitive values only: - `full-time` - `part-time` - `contract` - `internship` - `temporary` - `volunteer` - `anything` (default) |
| `experience_level` | string | No | The experience level needed for the job. It accepts the following 6 case-insensitive values only: - `internship` - `entry_level` - `associate` - `mid_senior_level` - `director` - `anything` (default) |
| `when` | string | No | The time when the job is posted, It accepts the following case-insensitive values only: - `yesterday` - `past-week` - `past-month` - `anytime` (default) |
| `flexibility` | string | No | The flexibility of the job. It accepts the following 3 case insensitive values only: - `remote` - `on-site` - `hybrid` - `anything` (default) |
| `geo_id` | string | No | The `geo_id` of the location to search for. For example, `92000000` is the `geo_id` of world wide. |
| `keyword` | string | No | The keyword to search for. |
| `search_id` | string | No | The `search_id` of the company. You can get the `search_id` of a company via [Company Profile API](#company-api-company-profile-endpoint). |
| `pagination` | string | No | The token for fetching the next page of results. Take the value of the `pagination` query parameter from the `next_page_api_url` of the previous response. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/company/job","method":"GET","query":{"job_type":"<string>","experience_level":"<string>","when":"<string>","flexibility":"<string>","geo_id":"<string>","keyword":"<string>","search_id":"<string>","pagination":"<string>"}}'
```

### Person Lookup

Resolve a person profile URL from first name and company name or domain (plus optional last name, title, location). $0.0472 per call, +$0.0236 with enrich_profile=enrich. Charged even when no match is found, unless similarity_checks=skip, where a null result is free on the credits rail (x402/MPP always prepay).

`GET /profile/resolve`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `company_domain` | string | Yes | Company name or domain |
| `first_name` | string | Yes | First name of the user |
| `similarity_checks` | string | No | include (default): discard obviously wrong matches and return null instead; charged even when the result is null. skip: return the closest match without checks; a null result is not charged. |
| `enrich_profile` | string | No | skip (default) or enrich: add the cached profile to the result, +$0.0236. For fresh data, chain with the profile endpoint using use_cache=if-recent. |
| `location` | string | No | The location of this user. Name of country, city or state. |
| `title` | string | No | Title that user is holding at his/her current job |
| `last_name` | string | No | Last name of the user |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/profile/resolve","method":"GET","query":{"company_domain":"<string>","first_name":"<string>","similarity_checks":"<string>","enrich_profile":"<string>","location":"<string>","title":"<string>","last_name":"<string>"}}'
```

### Reverse Email Lookup

Find a person profile from a personal or work email address. $0.0708 per call, +$0.0236 with enrich_profile=enrich. lookup_depth=deep (default) is always charged; lookup_depth=superficial is free when no match is found on the credits rail (x402/MPP always prepay).

`GET /profile/resolve/email`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `email` | string | Yes | Email address of the user you want to look up. |
| `lookup_depth` | string | No | deep (default): database plus heuristics, recommended for work emails; always charged. superficial: database match only, fewer results; not charged when nothing is found. |
| `enrich_profile` | string | No | skip (default) or enrich: add the cached profile to the result, +$0.0236. For fresh data, chain with the profile endpoint using use_cache=if-recent. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/profile/resolve/email","method":"GET","query":{"email":"<string>","lookup_depth":"<string>","enrich_profile":"<string>"}}'
```

### Employee Count

Employee count for a company, optionally at a historic date. $0.0236 per call (use_cache defaults to if-present). at_date +$0.118; estimated_employee_count=include +$0.0236; use_cache=if-recent +$0.0236 and requires estimated_employee_count=include.

`GET /company/employees/count`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `url` | string | Yes | URL of the Company Profile to target. |
| `coy_name_match` | string | No | include (default): also count profiles whose work experience exactly matches the company name, not just the company URL. exclude: match by company URL only. |
| `at_date` | string | No | Historic date (YYYY-MM-DD) to get the employee count at that point in time. +$0.118. |
| `use_cache` | string | No | if-present (Orthogonal default): cached data regardless of age. if-recent: best effort data no older than 29 days, +$0.0236; requires estimated_employee_count=include. |
| `estimated_employee_count` | string | No | include to add the employee count shown on the company profile, +$0.0236. exclude (default). |
| `employment_status` | string | No | Parameter to tell the API to filter past or current employees. Valid values are `current`, `past`, and `all`: * `current` (default) : count current employees * `past` : count past employees * `all` : count current & past employees |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/company/employees/count","method":"GET","query":{"url":"<string>","coy_name_match":"<string>","at_date":"<string>","use_cache":"<string>","estimated_employee_count":"<string>","employment_status":"<string>"}}'
```

### Person Search

Search people by role, company, location, education, skills and more. Billed per result returned: $0.0708 each, +$0.0236 with enrich_profiles=enrich, +$0.0472 with use_cache=if-recent. page_size defaults to 10 on Orthogonal (max 100; max 10 with enrich or if-recent), so a default search costs at most $0.708. x402/MPP callers prepay for the requested page_size.

`GET /search/person`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `country` | string | No | Filter people located in this country. This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). |
| `first_name` | string | No | Filter people whose first names match the provided search expression. |
| `last_name` | string | No | Filter people whose last names match the provided search expression. |
| `education_field_of_study` | string | No | Filter people with a field of study matching the provided search expression, based on education history. |
| `education_degree_name` | string | No | Filter people who earned a degree matching the provided search expression, based on education history. |
| `education_school_name` | string | No | Filter people who have attended a school whose name matches the provided search expression, based on education history. |
| `education_school_profile_url` | string | No | Filter people who have attended a school with a specific profile URL, based on education history. |
| `current_role_title` | string | No | Filter people who are **currently** working as a role whose title matches the provided search expression. You'll be looking for profiles that show a person's current job. However, keep in mind that some of these profiles may not be up-to-date, which means you might sometimes see a person's old job instead of their current job. |
| `past_role_title` | string | No | Filter people who have **in the past** worked as a role whose title matches the provided search expression. |
| `current_role_before` | string | No | Filter people who started their current role **before** this date. You'll be looking for profiles that show a person's current job. However, keep in mind that some of these profiles may not be up-to-date, which means you might sometimes see a person's old job instead of their current job. This parameter takes a ISO8601 date. Default value of this parameter is `null`. |
| `current_role_after` | string | No | Filter people who started their current role **after** this date. You'll be looking for profiles that show a person's current job. However, keep in mind that some of these profiles may not be up-to-date, which means you might sometimes see a person's old job instead of their current job. This parameter takes a ISO8601 date. Default value of this parameter is `null`. |
| `current_company_profile_url` | string | No | Filter people who are **currently** working at a company represented by this Company Profile URL. Default value of this parameter is `null`. |
| `past_company_profile_url` | string | No | Filter people who have **in the past** worked at the company represented by this Company Profile URL. This parameter takes a Company Profile URL. Default value of this parameter is `null`. |
| `current_job_description` | string | No | Filter people with **current** job descriptions matching the provided search expression. |
| `past_job_description` | string | No | Filter people with **past** job descriptions matching the provided search expression. |
| `current_company_name` | string | No | Filter people who are **currently** working at a company whose name matches the provided search expression. |
| `past_company_name` | string | No | Filter people who **have previously** worked at a company whose name matches the provided search expression. |
| `groups` | string | No | Filter people who are members of groups whose names match the provided search expression. |
| `languages` | string | No | Filter people who list a language matching the provided search expression. |
| `region` | string | No | Filter people located in a region matching the provided search expression. A “region” in this context means “state,” “province,” or similar political division, depending on what country you’re querying. |
| `city` | string | No | Filter people located in a city matching the provided search expression. |
| `headline` | string | No | Filter people whose headline fields match the provided search expression. |
| `summary` | string | No | Filter people whose summary fields match the provided search expression. |
| `industries` | string | No | Person's inferred industry. May sometimes exist when `current_company_industry` does not, but `current_company_industry` should be preferred when it exists. |
| `interests` | string | No | Filter people whose interest fields match the provided search expression. |
| `skills` | string | No | Filter people whose skill fields match the provided search expression. |
| `skills_all_in_list` | string | No | Filter people whose skill fields match all the skills in the list. This parameter accepts a comma-separated list of skills and returns profiles that include all the skills in the list. This parameter can't be combined with the `skills` parameter. Please only use one of them. |
| `current_company_country` | string | No | Filter people who are currently working at a company with an office based in this country. This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). |
| `current_company_region` | string | No | Filter people who are currently working at a company based in a region matching the provided search expression. |
| `current_company_city` | string | No | Filter people who are currently working at a company based in a city matching the provided search expression. |
| `current_company_type` | string | No | Filter people who are currently working at a company of the provided type. Possible values: * `EDUCATIONAL`: Educational Institution * `GOVERNMENT_AGENCY`: Government Agency * `NON_PROFIT` : Nonprofit * `PARTNERSHIP` : Partnership * `PRIVATELY_HELD` : Privately Held * `PUBLIC_COMPANY` : Public Company * `SELF_EMPLOYED` : Self-Employed * `SELF_OWNED` : Sole Proprietorship |
| `current_company_follower_count_min` | string | No | Filter people who are currently working at a company with a follower count of **more than** this value. |
| `current_company_follower_count_max` | string | No | Filter people who are currently working at a company with a follower count **less than** this value. |
| `current_company_industry` | string | No | Filter people whose current company's industry matches this search expression. Values come from a fixed list (https://enrichlayer.com/docs/guides/industry-values) and can be inferred, e.g. Apple may match both Computers and Electronics Manufacturing and Software Development. Use current_company_primary_industry to match the primary industry only. |
| `current_company_primary_industry` | string | No | Filter people who are currently working at a company belonging to an `industry` that matches the provided search expression. The `industry` attribute, found in a Company profile, describes the primary industry in which the company operates. The value of this attribute is an enumerator. [See the full list of possible values for this attribute](/docs/guides/industry-values). |
| `current_company_specialities` | string | No | Filter people who are currently working at a company with a specialty matching the provided search expression. Please note that we use the spelling `specialities` rather than `specialties` in this document. |
| `current_company_employee_count_category` | string | No | Filter people who are currently working at a company in this employee count category. This parameter will take precedence over `current_company_employee_count_min` and `current_company_employee_count_max` parameters. The valid values are: - `custom` (default): uses `current_company_employee_count_min` and `current_company_employee_count_max` parameters - `startup`: 1-10 employees - `small`: 11-50 employees - `medium`: 51-250 employees - `large`: 251-1000 employees - `enterprise`: 1001+ employees |
| `current_company_employee_count_min` | string | No | Filter people who are currently working at a company with **at least** this many employees. |
| `current_company_employee_count_max` | string | No | Filter people who are currently working at a company with **at most** this many employees. |
| `current_company_description` | string | No | Filter people who are currently working at a company with a description matching the provided search expression. |
| `current_company_founded_after_year` | string | No | Filter people who are currently working at a company that was founded **after** this year. |
| `current_company_founded_before_year` | string | No | Filter people who are currently working at a company that was founded **before** this year. |
| `current_company_funding_amount_min` | string | No | Filter people who are currently working at a company that has raised **at least** this much (USD) funding amount. |
| `current_company_funding_amount_max` | string | No | Filter people who are currently working at a company that has raised **at most** this much (USD) funding amount. |
| `current_company_funding_raised_after` | string | No | Filter people who are currently working at a company that has raised funding **after** this date. |
| `current_company_funding_raised_before` | string | No | Filter people who are currently working at a company that has raised funding **before** this date. |
| `current_company_domain_name` | string | No | Filter people who are currently working at a company with a domain name matching the provided search expression. |
| `public_identifier_in_list` | string | No | A list of public identifiers (the identifying portion of the person’s profile URL). The target person’s identifier must be a member of this list. |
| `public_identifier_not_in_list` | string | No | A list of public identifiers (the identifying portion of the person’s profile URL). The target person’s identifier must **not** be a member of this list. |
| `page_size` | string | No | Maximum results to return. Orthogonal default is 10 (Enrich Layer would default to 100). Accepted 1 to 100; limited to 10 with enrich_profiles=enrich or use_cache=if-recent. You are billed per result returned. |
| `follower_count_min` | string | No | Filter people with a follower count of **more than** this value. |
| `follower_count_max` | string | No | Filter people with a follower count **less than** this value. |
| `enrich_profiles` | string | No | skip (default): profile URLs only. enrich: full profile data, +$0.0236 per result; limits page_size to 10. |
| `use_cache` | string | No | if-present (default): no freshness guarantee. if-recent: best effort profiles no older than 29 days, +$0.0472 per result; limits page_size to 10. |
| `next_token` | string | No | The token for fetching the next page of results. Take the value of the `next_token` query parameter from the `next_page` URL of the previous response. When this parameter is provided, the search query is restored from the token. Filter parameters are not applied to the search, but they must still be syntactically valid, otherwise the request fails with a 400; only `page_size`, `enrich_profiles` and `use_cache` are honored. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/search/person","method":"GET","query":{"country":"<string>","first_name":"<string>","last_name":"<string>","education_field_of_study":"<string>","education_degree_name":"<string>","education_school_name":"<string>","education_school_profile_url":"<string>","current_role_title":"<string>","past_role_title":"<string>","current_role_before":"<string>","current_role_after":"<string>","current_company_profile_url":"<string>","past_company_profile_url":"<string>","current_job_description":"<string>","past_job_description":"<string>","current_company_name":"<string>","past_company_name":"<string>","groups":"<string>","languages":"<string>","region":"<string>","city":"<string>","headline":"<string>","summary":"<string>","industries":"<string>","interests":"<string>","skills":"<string>","skills_all_in_list":"<string>","current_company_country":"<string>","current_company_region":"<string>","current_company_city":"<string>","current_company_type":"<string>","current_company_follower_count_min":"<string>","current_company_follower_count_max":"<string>","current_company_industry":"<string>","current_company_primary_industry":"<string>","current_company_specialities":"<string>","current_company_employee_count_category":"<string>","current_company_employee_count_min":"<string>","current_company_employee_count_max":"<string>","current_company_description":"<string>","current_company_founded_after_year":"<string>","current_company_founded_before_year":"<string>","current_company_funding_amount_min":"<string>","current_company_funding_amount_max":"<string>","current_company_funding_raised_after":"<string>","current_company_funding_raised_before":"<string>","current_company_domain_name":"<string>","public_identifier_in_list":"<string>","public_identifier_not_in_list":"<string>","page_size":"<string>","follower_count_min":"<string>","follower_count_max":"<string>","enrich_profiles":"<string>","use_cache":"<string>","next_token":"<string>"}}'
```

### Company Job Count

Count the jobs a company has posted, filterable by job type, experience level, recency, flexibility, location and keyword. Use search_id from the Company Profile endpoint. $0.0472 per call. Large companies with no filters can time out upstream (503, not charged); add filters such as when, job_type or flexibility.

`GET /company/job/count`

**Estimated cost:** $0.0472

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `job_type` | string | No | The nature of the job. It accepts the following 7 case-insensitive values only: - `full-time` - `part-time` - `contract` - `internship` - `temporary` - `volunteer` - `anything` (default) |
| `experience_level` | string | No | The experience level needed for the job. It accepts the following 6 case-insensitive values only: - `internship` - `entry_level` - `associate` - `mid_senior_level` - `director` - `anything` (default) |
| `when` | string | No | The time when the job is posted, It accepts the following case-insensitive values only: - `yesterday` - `past-week` - `past-month` - `anytime` (default) |
| `flexibility` | string | No | The flexibility of the job. It accepts the following 3 case insensitive values only: - `remote` - `on-site` - `hybrid` - `anything` (default) |
| `geo_id` | string | No | The `geo_id` of the location to search for. For example, `92000000` is the `geo_id` of world wide. |
| `keyword` | string | No | The keyword to search for. |
| `search_id` | string | No | The `search_id` of the company. You can get the `search_id` of a company via [Company Profile API](#company-api-company-profile-endpoint). |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"enrich-layer","path":"/company/job/count","method":"GET","query":{"job_type":"<string>","experience_level":"<string>","when":"<string>","flexibility":"<string>","geo_id":"<string>","keyword":"<string>","search_id":"<string>"}}'
```

---

Full details and an interactive quickstart: https://orthogonal.com/discover/enrich-layer
