LinkedIn Jobs Scraper: Job Search Results as JSON
Pricing
Pay per event
LinkedIn Jobs Scraper: Job Search Results as JSON
Scrape public LinkedIn job postings for a job title and a place as JSON: title, company, location, posted date, salary line shown and optional description. No login. Pay per offer returned, with a cost cap per run.
LinkedIn Jobs Scraper reads the public job offers that LinkedIn shows without logging in, for a job title and a place, and returns them as JSON: title, company, location, posted date, the salary line when the card shows one, and the offer address. You pay per offer returned, and you set a cost cap per run.
This Actor is independent and not affiliated with, endorsed by or sponsored by LinkedIn.
Scrape LinkedIn job postings as JSON
You give the Actor a job title (or keywords) and a place, the same two things you would type in the job search of the site. It reads the public result pages and saves one item per offer to the run's dataset. You can start it from the Apify Console or call it through the Apify API, and download the dataset in the formats the platform offers for datasets.
With includeDescription set to true, the Actor also opens the public page of each offer and adds its description and its criteria. It is off by default, because it adds one request per offer.
What you get
Always:
jobIdtitlecompanylocationpostedDate(YYYY-MM-DD, or null)salary(the salary line as displayed on the card, or null; most offers show none)url
With includeDescription:
description(plain text)seniorityLevelemploymentTypeindustries
What it does not return
- Anything about the person who published the offer: no name, no profile link, no job title of that person, no hiring-team block.
- Email addresses and phone numbers: those recognised in a description (international numbers with a plus sign, North American numbers, five pairs of digits) and email addresses are replaced by
[removed], as are links to personal profiles. A contact written in another way can remain; the pattern is a filter, not a guarantee. - Applicant counts, company pages and any field that is not listed above.
How to scrape LinkedIn jobs with this Actor
- Open the Actor on Apify and go to the Input tab.
- Type a job title in
query, for exampledata engineer, and a place inlocation, for exampleToronto. - Set
maxItems(default 20, up to 100). LeaveincludeDescriptionoff unless you need the description. - Click Start. When the run ends, open the Output tab, or read the dataset through the API.
Input
| Field | Meaning |
|---|---|
query | Job title or keywords, required |
location | City or country, required |
maxItems | Maximum offers returned. Default 20, up to 100 |
includeDescription | true opens the page of each offer to add its description and criteria. Default false |
maxCostUsd | Cost cap per run in USD, start event included. Default 0.25, enough for 100 offers |
proxyConfiguration | Optional Apify proxy settings. Unset by default |
Why run it on Apify
The Actor runs on the Apify platform, so there is nothing to host. You can call it from the API, schedule it, and read the run status and the run summary of each run. You pay per offer returned, and nothing for an offer that is not returned.
Pricing and cost cap
You are charged per offer, after the offer is saved to the dataset, plus a small start event for each run.
| Event | Price on every plan |
|---|---|
| Offer returned | $0.001 |
| Actor start | $0.00005 |
Examples of cost for one run:
| Offers returned | Cost |
|---|---|
| 20 (the default) | 20 × $0.001 + $0.00005 = $0.02005 |
| 100 (the maximum) | 100 × $0.001 + $0.00005 = $0.10005 |
maxCostUsd stops the run when the cost of the offers returned, start event included, reaches it. It is computed at the same price on every plan. Offers already returned are kept, and the run status says it stopped at the cost cap. The run also stops if the platform charge limit for the run is reached.
Input and output example
Input:
{"query": "data engineer","location": "Toronto","maxItems": 5,"includeDescription": false}
Output, from a run of this Actor with that input (two of the five items):
[{"jobId": "4412402859","title": "Data Engineer","company": "Lakeview Loan Servicing, LLC.","location": "North York, Ontario, Canada","postedDate": "2026-05-15","salary": null,"url": "https://www.linkedin.com/jobs/view/4412402859"},{"jobId": "4470030555","title": "Data Engineer","company": "Zurich Canada","location": "Toronto, Ontario, Canada","postedDate": "2026-10-16","salary": null,"url": "https://www.linkedin.com/jobs/view/4470030555"}]
The offers, dates and companies are those the site showed at the time of the run and change from one run to the next. With includeDescription set to true, an item also carries description, seniorityLevel (for example Associate), employmentType (for example Full-time) and industries.
Run summary
The key-value store holds RUN_SUMMARY: the run status, the number of offers, and counts only (requests, statuses, bytes, cards seen, why the run stopped). No page content and no offer content.
How the Actor reads the site
One request every 5 seconds, with a declared User-Agent that names this Actor. No login, no cookie, no account, no challenge solving, no disguise. If the site refuses two requests in a row (for example status 429 or 403, or a sign-in page), the run stops there and keeps what it already returned: it does not retry around the refusal. The first page of results gives about 60 offers; the next pages are read by offset. A run of 100 offers without descriptions took about 40 seconds in our measurement (6 list requests); with descriptions each offer adds one more request, so it takes much longer.
Other Actors by Tollprobe
The input fields, the output fields, the price per offer and a cost example for this Actor are also on its page at tollprobe.com; all the Actors by Tollprobe are listed at tollprobe.com/actors.
- Amazon Product Search Scraper: public Amazon search results for a keyword as JSON, billed per product.
FAQ
Is this the LinkedIn Jobs API?
No. It is an Actor that reads the public job pages and is called through the Apify API. It is not an API provided by LinkedIn.
Do I need a LinkedIn account or cookies?
No. The Actor does not log in and does not take a cookie.
Can I scrape the job description?
Yes, set includeDescription to true. The description comes as plain text, with the criteria seniorityLevel, employmentType and industries. Each offer then takes one more request.
How many job postings can I get in one run?
Up to 100 with maxItems. A run stops earlier if it reaches maxCostUsd, if the platform charge limit is reached, or if the site refuses two requests in a row.
Why is salary null on most offers?
The card showed no salary line. Most offers show none, and the Actor returns the line only as the site displays it.
Does it return the recruiter or the hiring team?
No. It returns nothing about the person who published the offer.
Is it legal to scrape LinkedIn?
Not legal advice. The site's terms apply to what you do with its content, and you are responsible for complying with them.
Where do I report a problem?
Use the Issues tab of this Actor on Apify.