Create a LinkedIn scraper (start an extraction)

POST
/linkedin-scrappers

Starts extracting the people (or companies) of a LinkedIn search into a CSV. The extraction runs in the background on Emelia servers: this call only creates the scraper and returns its id (scrapId). Follow it with GET /linkedin-scrappers/{id} or with a webhook (POST /linkedin-scrappers/{id}/webhook).

Accepted URLs and accounts

  • Sales Navigator people search (https://www.linkedin.com/sales/search/people...), lead list (.../sales/lists/people/...) or account search (.../sales/search/company..., companies instead of people). authes must contain ids of LinkedIn accounts connected for scraping (the authId returned by POST /linkedin-scrappers/authes).
  • Classic LinkedIn people search (https://www.linkedin.com/search/results/people/...). It runs on a LinkedIn account connected for campaigns: authes must contain ids of LinkedIn accounts connected for campaigns, not of accounts connected for scraping.
  • Any other https://linkedin.com/sales/... URL is accepted here but the scraper then stops with the error BAD_SALES_NAV_URL.

Volume limits (applied during the extraction, not at creation)

  • Sales Navigator never returns more than 2,500 results per search (100 pages of 25). Lead lists and saved searches are capped at 2,500, searches filtered on your network (CONNECTION_OF) at 1,000, account searches at 1,000 companies, classic searches at 1,000 people.
  • Grow and Scale plans: a search with 3,000 results or more that contains filters is split automatically into chunks of at most 2,500 (segmented: true) and extracted over several days, at 2,500 contacts per day per LinkedIn account (5,000 for an account with a Sales Navigator Advanced seat). Give several accounts in authes to go faster. Above 80,000 results the scraper stops with TOO_MUCH_RESULT.
  • Start plan and free use: capped at 2,500, no automatic split.
  • max_contacts stops the extraction early. On Sales Navigator it is applied per page of 25 (you can get up to 25 more) and it is ignored for segmented searches. On classic searches it is exact.

Rules checked by this call: the name is unique among your scrapers; with a single account and no plannedStart, that account must not already run a scraper; every account exists, belongs to you and is valid; plannedStart is at least one hour ahead; your workspace has an active subscription, or has not used its free extraction yet, or still has credits (without subscription, extraction costs about 1 credit per 2 contacts and pauses when credits run out). Fields not listed in the schema are rejected.

Authorization

apiKey
Authorization<token>

Your 48 character API key, sent as is (a Bearer prefix is tolerated). Create it at https://v3.emelia.io/settings/api.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/linkedin-scrappers" \  -H "Authorization: YOUR_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "name": "Acme CTOs France",    "authes": [      "66e0f1a2b3c4d5e6f7a8b9c0"    ],    "url": "https://www.linkedin.com/sales/search/people?query=(filters%3AList((type%3ACURRENT_TITLE%2Cvalues%3AList((text%3ACTO%2CselectionType%3AINCLUDED)))%2C(type%3AREGION%2Cvalues%3AList((text%3AFrance%2CselectionType%3AINCLUDED)))))"  }'
{  "success": true,  "scrapId": "66f1a2b3c4d5e6f7a8b9c0d1"}