Piotr VassevPiotr Vassev

How to Export LinkedIn Jobs by Keyword and Location

The LinkedIn Jobs Search Scraper turns keyword and location searches into job records. I maintain the Actor. This example collects machine-learning engineer postings in Berlin and Amsterdam as a starting point for a job-market research table.

A shared result cap can distort a city comparison. You will first verify the search, then collect separate, consistently scoped samples if counts by city are the goal.

How to Scrape LinkedIn Jobs by Keyword

Set the search population and data depth

Each keyword is combined with every location. The example's one keyword and two locations run two searches; three keywords and two places would run six. maxItems is the global cap across the run.

enrichment: "listing" returns search-card fields. detail adds posting information such as description, salary, seniority, employment type, and apply details. detail+company additionally adds employer profile information, charged once per distinct company.

Use postedWithin: "r604800" for the past week. This measures recently posted matches, not all open roles. The default proxy setting does not require residential proxies; keep the initial configuration simple unless the log identifies an access problem.

Budget for the sample

Pricing as of September 6, 2026. On Free, listing, detail, and company-profile events cost $0.0008, $0.003, and $0.01. Gold rates are $0.0004, $0.0012, and $0.004. Detail replaces the listing event; company enrichment is additive once per company. The Actor-start event is $0.00005 per GB of allocated memory, with a minimum of one event. Check current Actor pricing and the run charge breakdown; these calculations describe Actor events, and separately billed platform or proxy resources may also apply.

Run the two-location search

Open the Actor on Apify. In Input, switch to the JSON editor and paste:

{
  "keywords": [
    "machine learning engineer"
  ],
  "locations": [
    "Berlin, Germany",
    "Amsterdam, Netherlands"
  ],
  "postedWithin": "r604800",
  "enrichment": "listing",
  "maxItems": 100,
  "autoFanOut": true
}

Click Start, then open the completed run’s output dataset.

After completion, inspect title relevance and sourceQuery before counting rows. Machine learning engineer searches may also return neighboring specialties. Decide which titles belong in your analysis and document the rule.

Open RUN_SUMMARY in the run's key-value store and check for truncation. A dataset with exactly 100 rows has reached this example's deliberate global cap. It is a useful sample, but its city split need not reflect the underlying market.

Read the returned fields

FieldHow to use it
jobIdDeduplication key
titleJob title
companyNameEmployer
locationPosted location
postedDatePosting date
sourceQueryKeyword/location source

Deduplicate jobs using jobId, not title and company. Employers may use the same title for several different postings. Keep sourceQuery to explain how the Actor found a row and location for what the posting actually says.

With details enabled, keep salaryText as well as parsed bounds, currency, and period. A $ symbol alone may need source context to resolve its currency, and hourly amounts should not be mixed with annual ones.

Historical linkedin jobs search scraper output

Compare searches without confusing caps with demand

Export CSV with job ID, title, company, location, source query, posting date, source job link when returned, and collection time. Build a reviewed subset by removing irrelevant titles and duplicate IDs.

For an initial shortlist, sort recent relevant jobs and open the source posting to confirm requirements. Add application status and review notes in your own table rather than altering the source fields.

For a city comparison, run each city separately with the same keyword, date window, and sufficiently generous cap. Save the input and run summary with each export. If one search remains truncated, report that limitation instead of presenting its count as a total.

Count unique job IDs by company and city. Decide how you will handle multi-location or remote postings before calculating totals. A job listed in a city is not necessarily available only there, and one listing does not prove one unfilled headcount.

Only enable company enrichment when company size, industry, or website is needed for a further segment. Its fee is per distinct company rather than per job, so your cost depends on the employer mix. Keep repeated company attributes as context; do not sum employee counts over job rows.

If you want only newly seen jobs on future runs, use the LinkedIn jobs monitoring guide or maintain your own ID history. A date filter alone does not remember earlier exports.

Understand the search ceiling

LinkedIn serves at most about 1,000 results for a search. autoFanOut attempts narrower searches and deduplicates the merged results; it is not a guarantee that every matching job is accessible. Check the summary even when the run succeeds.

For empty results, verify the keyword and location on LinkedIn, then widen the posting window. For a broad, truncated result, narrow the research question or split the searches and retain overlap checks. Neither a bigger cap nor a successful status proves exhaustive coverage.

For collecting repeatable keyword-location job samples, see the Node.js example. Use the current input fields above if the example differs.

Frequently asked questions

How are multiple keywords and locations combined?

The Actor runs their cross product, so two keywords and three locations create six searches.

Which enrichment should I choose?

Use listing for discovery, detail for job-page fields, and detail+company when company profile fields justify the extra event cost.

Is company enrichment charged per job?

No. The current README says it is charged once per company in the run.

Piotr Vassev

Piotr Vassev

Founder of FalconScrape. Building production-grade web scraping systems and data automation pipelines for businesses worldwide.

Connect on LinkedIn