LinkedIn Jobs Scraper avatar

LinkedIn Jobs Scraper

Pricing

from $1.10 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper

LinkedIn Jobs Scraper

Search LinkedIn jobs by keyword and location with date, experience, job-type, and workplace filters, paginate through results, and optionally enrich each job with the full posting.

Pricing

from $1.10 / 1,000 results

Rating

0.0

(0)

Developer

The Netaji

The Netaji

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

The Actor searches public LinkedIn job postings by keyword and location, applies date, experience, employment-type, and workplace filters, paginates through the result set, and optionally fetches the full posting for every result. No LinkedIn account or session cookie is required.

Accepted input

FieldTypeDefaultDescription
keywordsstringRequired. Job title, skill, or free-text query.
locationstringPlace name. Resolved to a LinkedIn geo ID automatically.
geo_idstringA known LinkedIn geo ID. Overrides location when set.
maxItemsinteger100Maximum job listings saved. 0 removes the limit.
enrichJobbooleanfalseFetches the full posting for each result.
date_postedenumpast_24_hours, past_week, past_month.
experience_levelsmulti-selectinternship, entry_level, associate, mid_senior, director, executive.
job_typesmulti-selectfull_time, part_time, contract, temporary, internship, volunteer, other.
workplaceenumon_site, remote, hybrid.
sortByenummost_recent, most_relevant.
{
"keywords": "data engineer",
"location": "Berlin",
"maxItems": 100,
"date_posted": "past_week",
"experience_levels": ["mid_senior"],
"workplace": "remote",
"sortBy": "most_recent"
}

How the location is resolved

A location value is a place name, not a code. Before the search begins it is sent to LinkedIn's geo typeahead and matched to a geo ID, and the resolved name and ID are written to the run log so the interpretation is visible.

When the place name matches nothing, the run does not fail. A warning is logged and the search proceeds without a location filter, returning jobs from everywhere. A result set far larger and geographically broader than expected is almost always this case, and the run log states it explicitly. Supplying geo_id directly bypasses the lookup and removes the ambiguity.

Response fields

One record per job listing.

FieldContents
job_idLinkedIn job posting ID
titleJob title
companyHiring company name
company_urlCompany page URL
locationLocation as displayed on the listing
urlJob posting URL
posted_atPosting timestamp
posted_labelRelative posting text, such as 2 days ago
salarySalary information, where published
benefitsBenefits listed
logoCompany logo URL
urnLinkedIn URN for the posting
enrichedWhether the full posting was fetched

Present only when enrichJob is enabled:

FieldContents
applicantsNumber of applicants reported
is_activeWhether the posting is still open
criteriaSeniority, employment type, job function, industries
description_textFull description as plain text
description_htmlFull description as HTML
posterThe member who posted the role, where attributed
{
"job_id": "4021884321",
"title": "Senior Data Engineer",
"company": "Zalando",
"location": "Berlin, Germany",
"posted_label": "3 days ago",
"url": "https://www.linkedin.com/jobs/view/4021884321",
"enriched": false
}

Pagination and result limits

Results are collected in pages of 20 and the search offset advances until one of four conditions is met: maxItems is reached, a page contributes no listing not already seen, a page returns fewer than 20 listings, or the offset passes 1,000.

That last condition is a hard ceiling imposed by the search endpoint itself. A single search cannot return more than approximately 1,000 listings, regardless of maxItems or how many jobs match. Setting maxItems to 0 does not lift it. Covering a query with more matches than that requires splitting it into narrower searches — by location, by date window, or by experience level — and combining the results.

Listings are deduplicated within a run by job ID, so the same posting surfaced at two offsets is saved once.

Behaviour on partial results

A page request that fails after the client's own retries ends collection and the run completes with the listings already gathered, rather than aborting and discarding them. A dataset smaller than maxItems therefore indicates the result set was exhausted, the 1,000 ceiling was reached, or a page failed; the run log distinguishes the three.

Enrichment is applied per listing and issues one additional request each. A failed enrichment leaves that record with its search fields, enriched set to false, and no description, and is not charged. The run continues.

Frequently asked questions

Why did the run return around 1,000 jobs when far more match? The search endpoint stops serving results past an offset of roughly 1,000, and this is a property of LinkedIn's search rather than of maxItems. Split the query into narrower searches to cover more of the result set.

Why were jobs returned from the wrong country? The place name in location did not resolve, so the search ran without a location filter. The run log records the failure and names the value that was not matched. Supplying geo_id avoids the lookup entirely.

Where is a geo ID found? In the geoId query parameter of a LinkedIn job search URL performed in a browser. Once known, it is stable and can be reused.

What does enabling enrichJob add, and what does it cost? It attaches applicants, is_active, criteria, description_text, description_html, and poster. Each listing costs one additional request and one additional billed event, so a 500-listing run performs 500 extra requests. The search fields alone are usually sufficient for filtering, after which a second enriched run over the shortlist is cheaper than enriching everything.

Is a LinkedIn account or session cookie required? No. Only publicly visible job postings are read, and no credentials or logged-in session are supplied.

Why is salary empty on most listings? Salary is published only where the employer chose to include it or where local pay-transparency law requires it. Where it is absent from the posting it is returned as null rather than estimated.

ActorPurpose
LinkedIn Company ScraperDetails of the hiring company by handle or URL
LinkedIn Profile ScraperMember profile details by username or URL
LinkedIn Post ScraperPost, activity, and article details by URL
LinkedIn Related User ScraperProfiles LinkedIn shows alongside a seed profile