ScrapeField
Hiring signals are one of the best reasons to watch LinkedIn: a company posting five backend roles this week is a company with budget. This guide builds an n8n workflow that runs every morning, fetches every posting for a search, keeps the ones listed since yesterday, and appends them to a Google Sheet. It uses n8n’s built-in nodes, including the HTTP Request node’s pagination, so there is nothing to install.
The shape of it
Five nodes, in a line:
- Schedule Trigger, once a day.
- HTTP Request, which calls us and follows every page.
- Split Out, which turns each page into one item per job.
- Filter, which keeps the jobs listed since yesterday.
- Google Sheets, Append Row.
The HTTP Request node
| Setting | Value |
|---|---|
| Method | GET |
| URL | https://api.scrapefield.com/v1/linkedin/jobs |
| Authentication | Generic Credential Type → Header Auth, with name Authorization and value Bearer sf_live_… |
| Send Query Parameters | query = backend engineer, location = Berlin |
Keeping the key in a Header Auth credential, rather than typing it into the node, means it isn’t exported with the workflow when you share it.
Following every page
A list comes back a page at a time, with a cursor for the next one in meta.next_cursor, and null on the last page (how lists work). Under the node’s Options → Pagination:
| Setting | Value |
|---|---|
| Pagination Mode | Update a Parameter in Each Request |
| Parameters | Type Query, name cursor, value {{ $response.body.meta.next_cursor }} |
| Pagination Complete When | Other |
| Complete Expression | {{ $response.body.meta.next_cursor === null }} |
| Limit Pages Fetched | On, with a Max Pages you are comfortable paying for |
The page limit is your spending cap: each page is 3 credits, so 25 pages is at most 75 credits a run, between $0.03 and $0.06 depending on your pack.
One item per job
The HTTP Request node outputs one item per page, each with the page’s jobs in data. Add a Split Out node with data as the field to split out, and every job becomes its own item with title, company.name, location, listed_at and url. The jobs reference has every field.
Only what is new
A Filter node keeps a job when listed_at is after {{ $now.minus({ days: 1 }).toISO() }}. A posting with no date has listed_at null, never a made-up one, and the filter leaves it out.
Into the sheet
The Google Sheets node, Append Row, maps those fields to columns. Keep job_id as one of them: it is LinkedIn’s own id and never changes, so it is what you dedupe on when a posting shows up two mornings running.
Swap the URL and the parameters, and the same workflow follows an Instagram hashtag, a TikTok search or a place’s new reviews. The pagination settings stay exactly as they are, because every list pages the same way.