ScrapeField
A list of job postings is a list of companies that are hiring, and what for. The search gives you the list; the description, salary and seniority are on each posting. This guide gets both.
Two calls
GET /v1/linkedin/jobssearches, with aqueryand alocation. A page holds up to 25 postings, each with itsjob_id,title,company,locationandlisted_at. The fields only the posting has arenull. A page costs 3 credits.GET /v1/linkedin/jobtakes a result’sjob_idasidand returns the posting in full:description,salarywhere it shows one,seniority_level,employment_typeandworkplace_type. A posting costs 3 credits.
The code
const headers = { Authorization: `Bearer ${process.env.SCRAPEFIELD_KEY}` };
const base = 'https://api.scrapefield.com/v1/linkedin';
const q = new URLSearchParams({ query: 'data engineer', location: 'Berlin' });
const search = await (await fetch(`${base}/jobs?${q}`, { headers })).json();
if (search.error) throw new Error(search.error.message);
const postings = [];
for (const job of search.data) {
const res = await fetch(`${base}/job?id=${job.job_id}`, { headers });
const body = await res.json();
// a posting closed since the search is not found, and not charged
if (!res.ok) { console.error(job.job_id, body.error.code); continue; }
postings.push(body.data);
}
for (const p of postings) console.log(p.title, '|', p.company.name, '|', p.salary ?? 'no salary shown');A full page of 25 postings, with each one in full, costs 3 + 25 × 3 = 78 credits. Read more than one page by passing meta.next_cursor back as cursor (how lists work).
Only the new ones
Run it daily and keep the job_ids you have seen: a posting’s id never changes, so fetch in full only the ones you have not. Then a day’s run costs one search page and the new postings, not the whole list again. To have the new postings land in a sheet without code, see LinkedIn jobs into n8n; for thousands of postings, fetch several side by side, up to your limit of calls at once.