---
title: "Get one LinkedIn scraper (poll its progress)"
method: GET
path: "/linkedin-scrappers/{id}"
tags: ["LinkedIn scraper"]
---

# Get one LinkedIn scraper (poll its progress)

`GET /linkedin-scrappers/{id}`

## Request

- Base URL: `https://api.emelia.io`
- URL: `https://api.emelia.io/linkedin-scrappers/{id}`
- Auth: API key in header `Authorization`

Returns one scraper with its progress. This is the call to poll while an extraction or an enrichment runs (every 30 to 60 seconds is enough).

**Reading the progress**
- `status`: see `ScrapperStatus`. The extraction is over when `status` is `done`; `error` gives the reason when `status` is `error`.
- `scrapIndex` contacts extracted out of `totalContact` (0 until LinkedIn reports the result count, then capped by the plan rules).
- Segmented searches: `segments`, `estimatedEnd`, `nextRunningSegment`, `betweenSegment`.
- After `POST /{id}/enrich`: `status` is `enriching`, then `done` again. `enrichIndex` and `enrichFound` are only filled at the end of the enrichment.
- `convertedListId`: id of the Emelia list automatically created from a finished scraper (usually within a few minutes after `done`), `null` before.

Unlike the list route, this response also contains `userId`.

## Path parameters

- `id` string, required

## Response `200`

The scraper.

- ScrapperGetResponse
  - `success` boolean, required
  - `scrap` ScrapperScrap, required: A scraper (one extraction of a LinkedIn search).
    - `_id` string: Scrapper id.
    - `userId` string: Workspace id. Only returned by `GET /linkedin-scrappers/{id}`.
    - `name` string
    - `url` string: Search URL given at creation.
    - `scrapType` 'people' | 'account' | 'classic': `people`: Sales Navigator people search or lead list. `account`: Sales Navigator account (company) search; detected when the extraction starts, so it reads `people` before. `classic`: classic LinkedIn people search.
    - `status` 'running' | 'planified' | 'paused' | 'enriching' | 'done' | 'error': Life cycle of a scraper: - `planified`: waiting for `plannedStart`. - `running`: extraction in progress. For a segmented extraction, also between two chunks (see `betweenSegment`). - `paused`: paused by you (segmented extractions only) or by Emelia when credits ran out. Restart with resume. - `done`: extraction finished; also the state after an enrichment ends. - `enriching`: email enrichment in progress (`POST /{id}/enrich`). - `error`: stopped, the reason is in `error`.
    - `error` 'INVALID_COOKIE' | '2FA_REQUIRED' | 'BAD_SALES_NAV_URL' | 'NEED_SUBSCRIPTION' | 'TOO_MUCH_RESULT' | 'RATE_LIMIT' | 'SEGMENTATION_ERROR' | 'PROCESS_ERROR' | 'NO_AUTH_FOUND': Why a scraper stopped (`status: error`): - `INVALID_COOKIE`: LinkedIn rejected the session (cookie expired or user logged out; for classic searches, campaign account disconnected). Refresh the account, then resume. - `2FA_REQUIRED`: LinkedIn asks for a two-step verification on the account. Validate it on LinkedIn, then create a new scraper (resume is refused). - `BAD_SALES_NAV_URL`: the URL is not a Sales Navigator people search, lead list or account search, or LinkedIn answers 404 (deleted or expired search). - `NEED_SUBSCRIPTION`: free extraction refused because this LinkedIn account was already used for a free extraction by another Emelia workspace. A subscription is needed. - `TOO_MUCH_RESULT`: more than 80,000 results. Narrow the search. - `RATE_LIMIT`: LinkedIn limited the account. Sales Navigator scrapers are retried automatically about 12 hours later; you can also resume later. - `SEGMENTATION_ERROR`: the large search could not be planned in chunks. Contact support. - `PROCESS_ERROR`: unexpected technical error. Contact support. - `NO_AUTH_FOUND`: no LinkedIn account attached to the scraper.
    - `errorDetail` object: Internal diagnostic written by the scraper (free text in French). Not a stable contract: use `error`.
    - `totalContact` integer: Contacts to extract: 0 until LinkedIn reports the result count, then capped by the plan rules and `maxContacts`. Final count once `done`. Reduced by a split or a filter.
    - `scrapIndex` integer: Contacts extracted so far.
    - `maxContacts` integer: Value of `max_contacts` at creation, 0 = no limit.
    - `segmented` boolean: True when the search was split into chunks (Grow and Scale, 3,000 results or more).
    - `segments` ScrapperSegment[]
      - `_id` string: Chunk id.
      - `url` string: Sales Navigator URL of the chunk.
      - `count` integer: Contacts expected in this chunk (2,500 max).
      - `scrapIndex` integer: Contacts extracted in this chunk.
      - `complete` boolean: True when the chunk is finished. Absent before.
    - `estimatedEnd` string, date-time: Estimated end of a segmented extraction.
    - `nextRunningSegment` string, date-time, nullable: Computed for running segmented scrapers: when the next chunk is scheduled.
    - `betweenSegment` boolean: Computed for running segmented scrapers: true when no chunk is being extracted right now.
    - `plannedStart` string, date-time: Scheduled start, when given at creation.
    - `date` string, date-time: Creation date.
    - `lastUpdate` string, date-time: Last time the scraper wrote progress.
    - `enrichEnabled` boolean: True once an email enrichment was started.
    - `startEnrichDate` string, date-time: Start of the email enrichment.
    - `enrichIndex` integer: Contacts processed by the enrichment. Only set at the end.
    - `enrichFound` integer: Emails found. Only set at the end of the enrichment.
    - `enrichPhoneEnabled` boolean: True when a phone enrichment was started from the app.
    - `enrichPhoneIndex` integer
    - `enrichPhoneFound` integer
    - `processing` boolean: True while `POST /{id}/filter` runs.
    - `webhooks` ScrapperWebhook[]
      - `_id` string: Webhook entry id.
      - `webhookUrl` string, uri
      - `events` string[]: Events requested at registration.
    - `authes` string[]: LinkedIn account ids used by the scraper.
    - `auth` string: Legacy single account id (old scrapers only).
    - `convertedListId` string, nullable: Id of the Emelia list created automatically from the finished scraper, `null` before.

## Other responses

- `400`: Unknown or deleted scraper.
- `401`: Missing or invalid API key (`Authorization` header).
- `404`: The id is not 24 hexadecimal characters: no route matches and the server answers with its default HTML page (not JSON).
- `500`: Unexpected server error. Current behavior: also returned when the per-minute API quota of the workspace is exceeded (30 requests per minute without subscription, 100 on Start, 300 on Grow, 1,000 on Scale). A 429 would be expected; retry after a minute.

---

[API](https://skmtc.dev/emelia/apis/emelia-api.md) · [All operations](https://skmtc.dev/emelia/apis/emelia-api/llms.txt) · [OpenAPI document](https://skmtc.dev/emelia/apis/emelia-api/revisions/8c0cb435f2c4?raw)
