# LinkedIn people search

> A different database to the company search above: this queries LinkedIn through your own connected LinkedIn account, so it needs a paid LinkedIn slot and a…

Source: https://warmerly.com/docs/leads/linkedin-people-search

```text
GET /linkedin/search
GET /linkedin/search/parameters
```

A different database to the company search above: this queries **LinkedIn** through your own connected LinkedIn account, so it needs a paid LinkedIn slot and a connected account (`400 no_linkedin_account` otherwise).

| Query param | Type | Description |
| --- | --- | --- |
| `query` | string | **Required.** Keywords. A missing `query` returns `400 bad_request`. |
| `cursor` | string | Next page, from the previous response's `cursor`. |
| `locationIds` | comma-separated | Location facet values. |
| `industryIds` | comma-separated | Industry facet values. |
| `companyIds` | comma-separated | Current company facet values. |
| `networkDistance` | comma-separated integers | 1st / 2nd / 3rd degree. |
| `profileLanguage` | comma-separated strings | Profile language codes. |

Each page holds up to 15 people. What the facet filters take depends on how your LinkedIn account is connected. On an account connected through Unipile they are LinkedIn's own numeric IDs. On an account connected through LinkupAPI they are plain text names (for example `London`), only the first value of each of `locationIds`, `industryIds` and `companyIds` is used, and `profileLanguage` is not applied. `GET /linkedin/search/parameters?type=LOCATION|INDUSTRY|COMPANY&keywords=…` is the typeahead that returns `{ "items": [{ "id": "…", "title": "…" }] }`. A missing or invalid `type` returns `400 bad_request` (`invalid_type`); an empty `keywords` returns an empty `items` list. On a LinkupAPI account the single suggestion is the text you typed.

```json
{
  "items": [
    {
      "id": "ACoAAA…",
      "public_identifier": "samexample",
      "name": "Sam Example",
      "headline": "Head of Growth at Example Ltd",
      "location": "London, United Kingdom",
      "company_name": "Example Ltd",
      "profile_url": "https://www.linkedin.com/in/samexample",
      "network_distance": "DISTANCE_2"
    }
  ],
  "cursor": "15"
}
```

Fields a profile does not have (`headline`, `location`, `company_name`, `email`, `phone` and so on) are omitted rather than set to `null`. `cursor` is omitted on the last page.

**One LinkedIn lookup is charged per search page, not per profile returned**, paging with `cursor` issues a fresh upstream call, which is the unit of real cost. A search that fails or is rejected costs nothing: the allowance is debited only after results come back. Out of allowance returns `402 payment_required` with `used`, `limit`, `remaining`, `label` and `upgradeUrl` in `details`; this check runs before the `query` check. If the search itself fails you get `400 bad_request` (`search_failed`), and `400 no_linkedin_account` also covers a session that has expired.

`email` and `phone` are present only when the profile lists them publicly and they are visible to your account, usually they are absent, which is what [`POST /campaigns/{id}/leads/find-emails`](https://warmerly.com/docs/campaigns) and the [Email Finder](https://warmerly.com/docs/email-finder) are for.

## More from Leads

- [Push to a campaign](https://warmerly.com/docs/leads/push-to-a-campaign): Same selection shape as export, plus a target campaign. It adds matching companies directly to a campaign's…
- [Export quota](https://warmerly.com/docs/leads/export-quota): Returns your current lead-export usage for the billing period. A pure read, checking it never debits quota.
- [Rate limits & errors](https://warmerly.com/docs/leads/rate-limits-and-errors): GET /leads/search has its own throttle on top of your API key's per-minute limit: 120 requests per 5…
