# HarvestAPI — Orthogonal API

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

Real-time LinkedIn data: profiles (with optional email finding), companies, people search, Sales Navigator lead search, posts, comments, reactions, jobs, groups, ads, services and geo ID lookup.

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

### Get LinkedIn Job

Get LinkedIn job details by job ID or URL. Provide jobId or url.

`GET /linkedin/job`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `jobId` | string | No | ID of the LinkedIn job |
| `url` | string | No | URL of the LinkedIn job |

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

### Search LinkedIn Profiles

Search LinkedIn profiles by name, company, location, and more

`GET /linkedin/profile-search`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `search` | string | No | Search profiles by name |
| `currentCompany` | string | No | Filter by company ID or Company URL. One value or multiple comma-separated |
| `pastCompany` | string | No | Filter by past company ID or Company URL. One value or multiple comma-separated |
| `school` | string | No | Filter by school ID or School URL. One value or multiple comma-separated |
| `firstName` | string | No | Filter by first name |
| `lastName` | string | No | Filter by last name |
| `title` | string | No | Filter by title |
| `location` | string | No | Filter by location text |
| `geoId` | string | No | Filter by location as LinkedIn Geo ID. Overrides the location query param. Use the /linkedin/geo-id-search endpoint to find the Geo ID |
| `industryId` | string | No | Filter by industry ID. One value or multiple comma-separated |
| `keywordsCompany` | string | No | Filter by keywords in company name |
| `keywordsSchool` | string | No | Filter by keywords in school name |
| `followerOf` | string | No | Filter profiles that are followers of a LinkedIn profile. Provide the profile URL or ID. One value or multiple comma-separated |
| `page` | string | No | Page number, use for pagination |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/profile-search","method":"GET","query":{"search":"<string>","currentCompany":"<string>","pastCompany":"<string>","school":"<string>","firstName":"<string>","lastName":"<string>","title":"<string>","location":"<string>","geoId":"<string>","industryId":"<string>","keywordsCompany":"<string>","keywordsSchool":"<string>","followerOf":"<string>","page":"<string>"}}'
```

### Search LinkedIn Leads (Sales Navigator filters)

Search LinkedIn profile leads by filters with advanced inclusion and exclusion criteria

`GET /linkedin/lead-search`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `search` | string | No | Search query. Fuzzy search, supports LinkedIn's search operators |
| `currentCompanies` | string | No | Filter by current company IDs or URLs. Comma-separated (max 50) |
| `pastCompanies` | string | No | Filter by past company IDs or URLs. Comma-separated (max 50) |
| `locations` | string | No | Filter by location text. Comma-separated (max 70) |
| `geoIds` | string | No | Filter by LinkedIn Geo ID. Comma-separated. Overrides location param. Use /linkedin/geo-id-search to find IDs |
| `schools` | string | No | Filter by school IDs or URLs. Comma-separated (max 50) |
| `currentJobTitles` | string | No | Filter by current job titles. Comma-separated (max 70) |
| `pastJobTitles` | string | No | Filter by past job titles. Comma-separated (max 70) |
| `firstNames` | string | No | Filter by first names. Comma-separated (max 70) |
| `lastNames` | string | No | Filter by last names. Comma-separated (max 70) |
| `industryIds` | string | No | Filter by industry IDs. Comma-separated (max 70). Full list: https://github.com/HarvestAPI/linkedin-industry-codes-v2/blob/main/linkedin_industry_code_v2_all_eng_with_header.csv |
| `yearsAtCurrentCompanyIds` | string | No | Filter by years at current company IDs. Comma-separated. https://github.com/HarvestAPI/harvestapi-sdk/blob/main/packages/scraper/README.md#yearsatcurrentcompanyids |
| `yearsOfExperienceIds` | string | No | Filter by years of experience IDs. Comma-separated. https://github.com/HarvestAPI/harvestapi-sdk/blob/main/packages/scraper/README.md#yearsofexperienceids |
| `seniorityLevelIds` | string | No | Filter by seniority level IDs. Comma-separated. https://github.com/HarvestAPI/harvestapi-sdk/blob/main/packages/scraper/README.md#senioritylevelids |
| `functionIds` | string | No | Filter by job function IDs. Comma-separated. https://github.com/HarvestAPI/harvestapi-sdk/blob/main/packages/scraper/README.md#functionids |
| `recentlyChangedJobs` | boolean | No | Filter leads who recently changed jobs in the last 90 days. |
| `postedOnLinkedin` | boolean | No | Filter leads who posted on LinkedIn in the last 30 days |
| `profileLanguages` | string | No | Filter by profile languages. Comma-separated. https://github.com/HarvestAPI/harvestapi-sdk/blob/main/packages/scraper/README.md#profilelanguages |
| `companyHeadcount` | string | No | Filter by company headcount. Comma-separated. https://github.com/HarvestAPI/harvestapi-sdk/blob/main/packages/scraper/README.md#companyheadcount |
| `companyHeadquarterLocations` | string | No | Filter by company headquarter location text. Comma-separated (max 70) |
| `excludeLocations` | string | No | Locations to exclude from search. Comma-separated (max 70) |
| `excludeGeoIds` | string | No | Geo IDs to exclude from search. Comma-separated (max 70) |
| `excludeCurrentCompanies` | string | No | Current companies to exclude. Comma-separated (max 50) |
| `excludePastCompanies` | string | No | Past companies to exclude. Comma-separated (max 50) |
| `excludeSchools` | string | No | Schools to exclude. Comma-separated (max 50) |
| `excludeCurrentJobTitles` | string | No | Current job titles to exclude. Comma-separated (max 70) |
| `excludePastJobTitles` | string | No | Past job titles to exclude. Comma-separated (max 70) |
| `excludeIndustryIds` | string | No | Industry IDs to exclude. Comma-separated (max 70) |
| `excludeSeniorityLevelIds` | string | No | Seniority level IDs to exclude. Comma-separated (max 20) |
| `excludeFunctionIds` | string | No | Function IDs to exclude. Comma-separated (max 30) |
| `excludeCompanyHeadquarterLocations` | string | No | Company headquarter locations to exclude from search. Comma-separated (max 70) |
| `salesNavUrl` | string | No | LinkedIn Sales Navigator search URL to use for the search. This will override all other search parameters, except the `page` parameter. For pagination, please pass the `page` query parameter separately.  Note: the scraper doesn't scrape the URL directly, it will parse the URL, sanitize and validate params. It supports all parameters currently, but if LinkedIn adds new parameters in the future, they might not be supported until we update the API. Please contact us in this case. |
| `page` | integer | No | Page number for pagination (clamped at 100) |
| `sessionId` | string | No | Optional. Any random string you generate (use a UUID). Reuse it across pages of the same search so HarvestAPI routes them to the same scraping resource for consistent results. Not sent to LinkedIn and stores no data. Requests with a sessionId may be queued and slower. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/lead-search","method":"GET","query":{"search":"<string>","currentCompanies":"<string>","pastCompanies":"<string>","locations":"<string>","geoIds":"<string>","schools":"<string>","currentJobTitles":"<string>","pastJobTitles":"<string>","firstNames":"<string>","lastNames":"<string>","industryIds":"<string>","yearsAtCurrentCompanyIds":"<string>","yearsOfExperienceIds":"<string>","seniorityLevelIds":"<string>","functionIds":"<string>","recentlyChangedJobs":"<boolean>","postedOnLinkedin":"<boolean>","profileLanguages":"<string>","companyHeadcount":"<string>","companyHeadquarterLocations":"<string>","excludeLocations":"<string>","excludeGeoIds":"<string>","excludeCurrentCompanies":"<string>","excludePastCompanies":"<string>","excludeSchools":"<string>","excludeCurrentJobTitles":"<string>","excludePastJobTitles":"<string>","excludeIndustryIds":"<string>","excludeSeniorityLevelIds":"<string>","excludeFunctionIds":"<string>","excludeCompanyHeadquarterLocations":"<string>","salesNavUrl":"<string>","page":"<integer>","sessionId":"<string>"}}'
```

### Get LinkedIn Company

Get a LinkedIn company page by URL, universal name or company ID.

`GET /linkedin/company`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | string | Yes | URL or universal name or company ID of the LinkedIn company |

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

### LinkedIn Company People Stats

Get the People statistics of a LinkedIn company page: where the employees are located, where they studied, etc.

`GET /linkedin/company-people-stats`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | string | Yes | URL or universal name or company ID of the LinkedIn company. A company ID skips the company lookup and answers faster |

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

### LinkedIn Comment Reactions

Get reactions of LinkedIn post comment by comment URL.

`GET /linkedin/comment-reactions`

**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 LinkedIn comment |
| `page` | integer | No | Page number for pagination. Default is 1 |

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

### Get LinkedIn Post

Get LinkedIn post details by post URL.

`GET /linkedin/post`

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

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

### LinkedIn Comment Replies

Get replies of LinkedIn post comment by comment URL.

`GET /linkedin/post-comment-replies`

**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 LinkedIn comment |
| `paginationToken` | string | No | Use this token from the previous page response. |

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

### LinkedIn Post Comments

Get comments of LinkedIn post by post URL.

`GET /linkedin/post-comments`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `post` | string | Yes | URL of the LinkedIn post |
| `sortBy` | string | No | Sort comments by field. Supported values: 'relevance', 'date' |
| `page` | integer | No | Page number for pagination. Default is 1 |
| `paginationToken` | string | No | Required only if sortBy is 'relevance' and page > 1. Use this token from the previous page response. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/post-comments","method":"GET","query":{"post":"<string>","sortBy":"<string>","page":"<integer>","paginationToken":"<string>"}}'
```

### LinkedIn Post Reactions

Get reactions of LinkedIn post by post URL.

`GET /linkedin/post-reactions`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `post` | string | Yes | URL of the LinkedIn post |
| `sortBy` | string | No | Sort order. Supported values: 'relevance', 'date' |
| `page` | integer | No | Page number for pagination. Default is 1 |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/post-reactions","method":"GET","query":{"post":"<string>","sortBy":"<string>","page":"<integer>"}}'
```

### LinkedIn Profile Comments

Get comments a LinkedIn profile has posted, by profile URL, public identifier or profile ID.

`GET /linkedin/profile-comments`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `profile` | string | Yes | URL of the LinkedIn profile or public identifier or profile ID |
| `postedLimit` | string | No | Filter posts by maximum posted date. Supported values: '24h', 'week', 'month' |
| `page` | integer | No | Page number for pagination. Default is 1 |
| `paginationToken` | string | No | Required for pages > 1. Use this token from the previous page response. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/profile-comments","method":"GET","query":{"profile":"<string>","postedLimit":"<string>","page":"<integer>","paginationToken":"<string>"}}'
```

### LinkedIn Profile Reactions

Get reactions a LinkedIn profile has made, by profile URL, public identifier or profile ID.

`GET /linkedin/profile-reactions`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `profile` | string | Yes | URL of the LinkedIn profile or public identifier or profile ID. |
| `page` | integer | No | Page number for pagination. Default is 1 |
| `paginationToken` | string | No | Required for pages > 1. Use this token from the previous page response. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/profile-reactions","method":"GET","query":{"profile":"<string>","page":"<integer>","paginationToken":"<string>"}}'
```

### Search LinkedIn Jobs

Search LinkedIn jobs by title, company, location, and more.

`GET /linkedin/job-search`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `search` | string | No | Search jobs by title |
| `companyId` | string | No | Filter by company ID. One value or multiple comma-separated. |
| `location` | string | No | Filter by location text |
| `geoId` | string | No | Filter by location as LinkedIn Geo ID. Overrides the location query param. Use the /linkedin/geo-id-search endpoint to find the Geo ID |
| `sortBy` | string | No | Sort by field. Supported values: 'relevance', 'date' |
| `workplaceType` | string | No | Filter by workplace type. One or multiple values comma-separated. Supported values: 'office', 'hybrid', 'remote' |
| `employmentType` | string | No | Filter by employment type. One or multiple values comma-separated. Supported values: 'full-time', 'part-time', 'contract', 'temporary', 'internship' |
| `salary` | string | No | Filter by salary range. Supported values: '40k+', '60k+', '80k+', '100k+', '120k+', '140k+', '160k+', '180k+', '200k+' |
| `postedLimit` | string | No | Filter posts by maximum posted date. Supported values: '24h', 'week', 'month' |
| `experienceLevel` | string | No | Filter by experience level. One or multiple values comma-separated. Supported values: 'internship', 'entry', 'associate', 'mid-senior', 'director', 'executive' |
| `industryId` | string | No | Filter by industry ID. One value or multiple comma-separated industry IDs. Full list of IDs: https://github.com/HarvestAPI/linkedin-industry-codes-v2/blob/main/linkedin_industry_code_v2_all_eng.csv |
| `functionId` | string | No | Filter by job function ID. One value or multiple comma-separated function IDs. Full list of IDs: https://github.com/HarvestAPI/apify-linkedin-profile-search/blob/main/.actor/input_schema.json#L142 |
| `under10Applicants` | string | No | Include this parameter to filter jobs with under 10 applicants |
| `easyApply` | string | No | Set this parameter to 'true' filter jobs with Easy Apply option or 'false' to exclude. Values can be 'true' or 'false' |
| `page` | integer | No | Page number for pagination |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/job-search","method":"GET","query":{"search":"<string>","companyId":"<string>","location":"<string>","geoId":"<string>","sortBy":"<string>","workplaceType":"<string>","employmentType":"<string>","salary":"<string>","postedLimit":"<string>","experienceLevel":"<string>","industryId":"<string>","functionId":"<string>","under10Applicants":"<string>","easyApply":"<string>","page":"<integer>"}}'
```

### Search LinkedIn Groups

Retrieve a list of LinkedIn Groups matching the specified search criteria.

`GET /linkedin/group-search`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `search` | string | No | Keywords to search for. |
| `page` | integer | No | Page number for pagination. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/group-search","method":"GET","query":{"search":"<string>","page":"<integer>"}}'
```

### Get LinkedIn Ad

Get a LinkedIn Ad Library ad by ad ID or URL. Provide adId or url.

`GET /linkedin/ad`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `adId` | string | No | The unique identifier of the LinkedIn Ad. |
| `url` | string | No | The URL of the LinkedIn Ad. |

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

### Search LinkedIn Geo IDs

Search LinkedIn Geo ID by location text

`GET /linkedin/geo-id-search`

**Estimated cost:** $0.00096

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `search` | string | Yes | Location text to look up, e.g. 'San Francisco' |

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

### Get LinkedIn Group

Get a LinkedIn group by URL or group ID. Provide url or groupId.

`GET /linkedin/group`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `url` | string | No | URL of the LinkedIn group |
| `groupId` | string | No | ID of the LinkedIn group |

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

### Search LinkedIn Services

Search LinkedIn profile services by name keywords and location.

`GET /linkedin/service-search`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `search` | string | Yes | Service keywords to search for, e.g. 'web design' |
| `location` | string | No | Filter by location text |
| `geoId` | string | No | Filter by location as LinkedIn Geo ID. Overrides the location query param. Use the /linkedin/geo-id-search endpoint to find the Geo ID |
| `page` | string | No | Page number, use for pagination |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/service-search","method":"GET","query":{"search":"<string>","location":"<string>","geoId":"<string>","page":"<string>"}}'
```

### Get LinkedIn Profile

Get a LinkedIn profile by URL, public identifier or profile ID. Billed at HarvestAPI's reported cost +20%: about $0.00612 for a full profile, $0.00384 with main=true, and $0.0192 with findEmail=true (profile plus SMTP-verified email search). findEmail=false or 0 skips the email search. Email search is not charged when the profile lacks enough data to search.

`GET /linkedin/profile`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | string | Yes | URL or public identifier or profile ID of the LinkedIn profile |
| `main` | string | No | Set to 'true' for the cheaper main profile version. Set this parameter to 'true' to return only main version of the profile that you can see on LinkedIn without expanding profile sections - up to 5 experiences, 2 educations, 2 skills, etc. This version charges fewer credits |
| `findEmail` | string | No | Set to 'true' to also find and SMTP-verify the person's email (priced higher). 'false' or '0' skips the email search. Catch-all domain emails are returned and marked 'risky'. |

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

### Search LinkedIn Ad Library

Retrieve a list of LinkedIn Ads matching the specified search criteria.

`GET /linkedin/ad-search`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchUrl` | string | No | Scrape Ad Library search URL, for example: https://www.linkedin.com/ad-library/search?accountOwner=test&keyword=test&dateOption=custom-date-range&startdate=2025-07-07&enddate=2025-08-21 |
| `keyword` | string | No | Search by keyword |
| `accountOwner` | string | No | Search by company or advertiser name |
| `countries` | string | No | One or comma separated list of country codes to filter ads by country. Eg. 'US,GB,FR'. Supports "ALL" value to search in all countries. |
| `dateOption` | string | No | One of the following options to filter ads by date: 'last-30-days', 'current-month', 'current-year', 'last-year', 'custom-date-range' |
| `startdate` | string | No | Start date for 'custom-date-range' filter in 'YYYY-MM-DD' format |
| `enddate` | string | No | End date for 'custom-date-range' filter in 'YYYY-MM-DD' format |
| `paginationToken` | string | No | Pagination token from the previous response for fetching the next page |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/ad-search","method":"GET","query":{"searchUrl":"<string>","keyword":"<string>","accountOwner":"<string>","countries":"<string>","dateOption":"<string>","startdate":"<string>","enddate":"<string>","paginationToken":"<string>"}}'
```

### Search LinkedIn Posts

Search LinkedIn posts by keywords, author, date range, and more.

`GET /linkedin/post-search`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `search` | string | No | Keywords to search for in posts |
| `profile` | string | No | Filter posts by author's profile URL(s) or public identifier(s) or profile ID(s) (comma-separated). Note: LinkedIn returns fewer results per profile when using post search. To extract all posts by a profile, use the /linkedin/profile-posts endpoint |
| `company` | string | No | Filter posts by this company URL(s) or company ID(s) (comma-separated). Note: LinkedIn returns fewer results per company when using post search. To extract all posts by a company, use the /linkedin/company-posts endpoint |
| `authorsCompany` | string | No | List of LinkedIn companies where authors of posts work (comma-separated). It supports company URLs and IDs. |
| `authorsIndustryId` | string | No | List of LinkedIn industry IDs of authors' companies (comma-separated). It supports industry IDs. Full list of industry IDs: https://github.com/HarvestAPI/linkedin-industry-codes-v2/blob/main/linkedin_industry_code_v2_all_eng.csv |
| `mentioningMember` | string | No | Filter posts mentioning this LinkedIn profile URL or ID (comma-separated). It supports profile URLs and IDs. |
| `mentioningCompany` | string | No | Filter posts mentioning this LinkedIn company URL or ID (comma-separated). It supports company URLs and IDs. |
| `contentType` | string | No | Filter by content type. Supported values: 'videos', 'images', 'live_videos', 'documents', 'collaborative_articles', 'jobs' |
| `authorKeywords` | string | No | Filter by keywords in authors' profiles |
| `group` | string | No | Group LinkedIn URL or Group ID |
| `postedLimit` | string | No | Filter posts by maximum posted date. Supported values: '24h', 'week', 'month'. This parameter will be sent to LinkedIn, the filtering will be done on their side |
| `scrapePostedLimit` | string | No | Post-Filter posts by maximum posted date. Supported values: '1h', '24h', 'week','month', '3months', '6months', 'year'. This parameter will be applied after receiving results from LinkedIn, the filtering will be done on our side |
| `sortBy` | string | No | Sort by field. Supported values: 'relevance', 'date' |
| `page` | integer | No | Page number for pagination |
| `paginationToken` | string | No | Required if it was returned by the previous page. Otherwise the page will always be 1 (on LinkedIn side). Doesn't apply for all queries, usually profile posts return this token |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/post-search","method":"GET","query":{"search":"<string>","profile":"<string>","company":"<string>","authorsCompany":"<string>","authorsIndustryId":"<string>","mentioningMember":"<string>","mentioningCompany":"<string>","contentType":"<string>","authorKeywords":"<string>","group":"<string>","postedLimit":"<string>","scrapePostedLimit":"<string>","sortBy":"<string>","page":"<integer>","paginationToken":"<string>"}}'
```

### Search LinkedIn Companies

Retrieve a list of LinkedIn companies matching the specified search criteria.

`GET /linkedin/company-search`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `search` | string | No | Keywords to search for in company names. |
| `location` | string | No | Filter companies by location. |
| `geoId` | string | No | Filter by location as LinkedIn Geo ID. Overrides the location query param. Use the /linkedin/geo-id-search endpoint to find the Geo ID |
| `companySize` | string | No | Filter by company size. One value or multiple comma-separated. Supported values: '1-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+' |
| `industryId` | string | No | Filter by industry ID. One value or multiple comma-separated industry IDs. Full list of IDs:  https://github.com/HarvestAPI/linkedin-industry-codes-v2/blob/main/linkedin_industry_code_v2_all_eng.csv |
| `page` | integer | No | Page number for pagination. |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/company-search","method":"GET","query":{"search":"<string>","location":"<string>","geoId":"<string>","companySize":"<string>","industryId":"<string>","page":"<integer>"}}'
```

### LinkedIn Company Posts

Get LinkedIn company posts by company URL, ID, or universal name.

`GET /linkedin/company-posts`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `company` | string | Yes | Company URL, universal name or company ID whose posts to return |
| `postedLimit` | string | No | Filter posts by maximum posted date. Supported values: '24h', 'week', 'month'.  Since LinkedIn doesn't offer a way to filter by date, the filtering will be done on our side, due to that the pagination might have incorrect values, because pagination is returned by LinkedIn without applying the postedLimit filter |
| `scrapePostedLimit` | string | No | Post-Filter posts by maximum posted date. Supported values: '1h', '24h', 'week','month', '3months', '6months', 'year'. This parameter will be applied after receiving results from LinkedIn, the filtering will be done on our side |
| `page` | integer | No | Page number for pagination |
| `paginationToken` | string | No | Required if it was returned by the previous page. Otherwise the page will always be 1 (on LinkedIn side). Doesn't apply for all queries, usually profile posts return this token |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/company-posts","method":"GET","query":{"company":"<string>","postedLimit":"<string>","scrapePostedLimit":"<string>","page":"<integer>","paginationToken":"<string>"}}'
```

### LinkedIn Profile Posts

Get LinkedIn profile posts by profile URL, ID, or public identifier.

`GET /linkedin/profile-posts`

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

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `profile` | string | Yes | Author's profile URL, public identifier or profile ID |
| `postedLimit` | string | No | Filter posts by maximum posted date. Supported values: '24h', 'week', 'month'.  Since LinkedIn doesn't offer a way to filter by date, the filtering will be done on our side, due to that the pagination might have incorrect values, because pagination is returned by LinkedIn without applying the postedLimit filter |
| `scrapePostedLimit` | string | No | Post-Filter posts by maximum posted date. Supported values: '1h', '24h', 'week','month', '3months', '6months', 'year'. This parameter will be applied after receiving results from LinkedIn, the filtering will be done on our side |
| `page` | integer | No | Page number for pagination |
| `paginationToken` | string | No | Required if it was returned by the previous page. Otherwise the page will always be 1 (on LinkedIn side). Doesn't apply for all queries, usually profile posts return this token |

```bash
curl -X POST 'https://api.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"harvestapi","path":"/linkedin/profile-posts","method":"GET","query":{"profile":"<string>","postedLimit":"<string>","scrapePostedLimit":"<string>","page":"<integer>","paginationToken":"<string>"}}'
```

---

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