linkedin-scraper

N8N node for interacting with the standalone LinkedIn scraper microservice

Package Information

Released: this month
Downloads: 16 weekly / 108 monthly
Latest Version: 1.0.42
Author: Marco Visin

Documentation

n8n-nodes-linkedin-scraper

An n8n community node for the InNotes LinkedIn scraper microservice
(https://scraper.innotes.me, hardcoded in LinkedinScraper.node.ts). It
exposes job search, job details, and company follower counts.

Installation

Published to NPM as the community node package n8n-nodes-linkedin-scraper
(package.json, .github/workflows/publish-linkedin-scraper-node.yml).

Build from source (engines in package.json: node >= 18.10, yarn >= 1.22.0):

yarn install
yarn build

Credentials

This node defines no credential of its own. It uses the InNotes API
credential (inNotesApi, n8n_node/credentials/InNotesApi.credentials.ts) from
the n8n-nodes-innotes
package, and reads only its Bearer Token (token) — the node throws
Bearer token is missing from InNotes API credentials if it is empty.

Resources

Jobs → Search (POST /jobs/search, 90-minute timeout). Comma-separated job
titles and locations, Max Results (default 500, max 2000), Include jobs.ch
(default on), Time Range (r86400 / r604800 / r2592000, default past 24
hours), plus company and keyword blacklists.

The node sends no cookies at all. JobSearchRequest.cookies defaults to
empty (scraper_service/app/schemas.py) and the scraper then fetches the
caller's session itself with the same Bearer token
(search_jobs → fetch_session_cookies, scraper_service/app/routes/api.py).

Job → Details (POST /jobs/details/batch, 15-minute timeout per batch).
Takes a Job URL (LinkedIn or jobs.ch) per input item; all items are collected
and sent in chunks of 30, max_concurrent: 5, max_retries: 7, with results
mapped back to their original item order. A URL not starting with http is
returned as a failed result rather than sent.

Company → Followers (POST /companies/followers/batch, 10-minute timeout
per batch). Same batching: chunks of 30, results mapped back by index.

Errors

A 401/403 reaching the outer handler is reported as "LinkedIn session expired.
Please visit LinkedIn in a browser with the InNotes extension enabled to renew
your session."
— and it always throws: that check runs before
this.continueOnFail(). Continue On Fail only changes non-auth errors, which
are emitted as { error, itemIndex } instead of throwing.

Company → Followers never produces that message. The Job → Details batch
catch re-throws on 401/403 so it reaches the outer handler; the followers batch
catch does not, so every batch failure — auth included — becomes a per-item
{ follower_count: 0, source: 'error', success: false, error: 'Batch request failed: …' }.

Development

yarn install
yarn lint
yarn test
yarn build

See BUILD.md. Publishing is automated; do not npm publish by hand.

License

MIT.

Discussion