
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Scrape public LinkedIn job search results by keyword and location: titles, companies, locations, posting dates, salaries, full descriptions, and optional company page details.
Pull public LinkedIn job search results into a dataset you can schedule, export, and hand to a recruiting or research workflow.
Built for talent teams, market researchers, and anyone tracking hiring in the open. Paste a public jobs search, or fill in the filters and leave the URL list empty.
urls is set, the filter fields below are ignored.keywords, location, geoId, distance, datePosted, companyIds, and under10Applicants.autoConvertToAiSearch turns old experience, job type, and workplace codes from a URL into words on the keyword search. Date posted, company, easy apply, and under-10-applicants stay as URL filters.scrapeCompany loads each employer's public company page and adds the about text, the website, and an exact employee count when the page publishes one.splitByLocation plus splitCountry repeats the search across major cities in that country and drops duplicate job ids. The city replaces location and geoId.limitPerSource caps jobs per search (and per city when a search is split). The default is 20; LinkedIn returns at most 1000 jobs per search.failedInputs in the run's OUTPUT record (no error rows in your dataset). A real search or job page that does not come back cleanly is retried on a new session. The run does not save a title-only row.Request-based fetches, not a browser session, so a search of public postings stays a normal actor run you can put on a schedule. Point a daily run at a past-24-hours search URL (datePosted past24Hours, or f_TPR=r86400 on a URL) and collect what was posted since yesterday.
Every saved job includes the public description from the job page. If that page comes back without the description, the actor opens a new session and tries the public job view before giving up. With scrapeCompany on, a job is saved only when the company page also yields an about blurb, a website, or an exact headcount.
A single search is sized for a 1 GB run. Raise memory when you pass many URLs or turn on city splitting, because each search paginates on its own.
{
"limitPerSource": 20,
"urls": [
"https://www.linkedin.com/jobs/search/?position=1&pageNum=0"
]
}
One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.
{
"id": "4384671812",
"link": "https://www.linkedin.com/jobs/view/cashier-at-the-home-depot-4384671812?position=1&pageNum=0&refId=lXK1dFrGNJl3IKILHSsZFA%3D%3D&trackingId=YvueRfhRvUo0stZMro…",
"title": "Cashier",
"companyName": "The Home Depot",
"companyLinkedinUrl": "https://www.linkedin.com/company/the-home-depot?trk=public_jobs_topcard-org-name",
"companyLogo": "https://media.licdn.com/…",
"location": "Syosset, NY",
"salaryInfo": [
"$17.50/hr",
"$18.50/hr"
],
"postedAt": "2026-03-14",
"benefits": [
"Actively Hiring"
],
"descriptionHtml": "78092BR<br/><br/><strong>Job Description<br/><br/></strong><strong>Position Purpose:<br/><br/></strong>Cashiers play a critical customer service role by prov…",
"descriptionText": "78092BR Job Description Position Purpose: Cashiers play a critical customer service role by providing customers with fast, friendly, accurate and safe servic…",
"applicantsCount": "47",
"seniorityLevel": "Not Applicable",
"employmentType": "Full-time",
"industries": "Consumer Services",
"salaryInsights": "This range is provided by The Home Depot. Your actual pay will be based on your skills and experience — talk with your recruiter to learn more.",
"applyMethod": "Offsite",
"companyDescription": "The Home Depot, the world’s largest home improvement specialty retailer, values and rewards dedicated, knowledgeable, and experienced professionals. We opera…",
"companyWebsite": "http://www.careers.homedepot.com",
"companyEmployeesCount": 142982
}
| Field | What it does |
|---|---|
urls | Public LinkedIn jobs search URLs. Build them in a private window at linkedin.com/jobs/search. These take priority over the filters. |
keywords | Title, skills, or free text. Used only when urls is empty. |
location | City, region, country, or Remote, as you would type it on LinkedIn. |
geoId | Optional LinkedIn geo id. Used instead of free-text location when it is set and city splitting is off. |
distance | Search radius in miles. Omitted when you leave it empty. |
datePosted | anyTime, past24Hours, pastWeek, or pastMonth. |
companyIds | Numeric LinkedIn company ids, the same values as f_C on a search URL. |
under10Applicants | When true, keeps the under-10-applicants filter. |
autoConvertToAiSearch | When true (the default), experience, job type, and on-site/remote/hybrid codes in an old URL are appended to keywords. |
scrapeCompany | When true (the default), requests each company page. |
limitPerSource | Max jobs for each search. Default 20, up to 1000. |
splitByLocation | Split one search into city searches. |
splitCountry | Country whose city list is used. Required when splitting. |
Industry, function, and title codes in a URL (f_I, f_F, f_T, and similar) are not converted and are not sent. Put those ideas in keywords yourself.
A field is present only when the public page contains it. Empty values are left off the item. A real false or 0 would be kept.
| Field | When it is set |
|---|---|
id, link, title, companyName, companyLinkedinUrl, location | From the search card, filled in from the job page when that page has them. |
companyLogo | Company logo image URL from the page. Placeholder images are skipped. |
postedAt | The date on the card (YYYY-MM-DD). |
postedAtTimestamp | Only when the page gives a full timestamp, not a date alone. |
benefits | Labels such as "Actively Hiring" when the card shows them. |
salaryInfo | Money amounts from a pay range on the job or the card, split into a list. |
salaryInsights | The pay-range note LinkedIn prints above the description, as text. |
descriptionHtml, descriptionText | The public job description. A job is not saved without one of these. |
applicantsCount | Digits from a caption that is exactly "N applicants". |
insights | Other public captions, such as a non-numeric applicant line. |
seniorityLevel, employmentType, jobFunction, industries | The criteria block on the job page, including a real "Not Applicable". |
applyMethod | Offsite or Easy Apply when the public page labels the button that way. The offsite destination itself is behind sign-in, so no apply URL is stored. |
workplaceTypes | Remote, Hybrid, or On-site only when those words are in the location text. |
workRemoteAllowed | true only when the location says Remote. It is omitted otherwise, not defaulted to false. |
companyDescription, companyWebsite | From the company page when scrapeCompany is on and the page has them. |
companyEmployeesCount | The exact headcount from "Discover all N employees", "View all N employees", or the page's numberOfEmployees value. A range such as "10,001+" is not turned into a number. |
Recruiter name, title, photo, and profile URL are not on the logged-out job page, so jobPosterName, jobPosterTitle, jobPosterPhoto, and jobPosterProfileUrl are not returned. expireAt is omitted for the same reason: the public job page does not include that timestamp.
You pay $0.0015 per job saved to the dataset, plus platform usage (compute and proxy traffic). Company details (scrapeCompany) are included at no extra charge.
Example: 1,000 jobs cost $1.50 in event fees plus platform usage. In our test runs platform usage was about $0.11 to $0.12 per 1,000 jobs. The default 20-job search costs $0.03 in event fees.
If you set a maximum cost per run, the run saves as many jobs as that budget pays for and then stops cleanly.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
urlsarrayOptionalLinkedIn job search URLs
Search on the public LinkedIn jobs page (a private window shows the public version), apply your filters and paste the URL here. Several URLs are allowed. When URLs are set, Keywords, Location and the search filters are ignored.
keywordsstringOptionalKeywords
Job search keywords, used when no search URLs are given.
locationstringOptionalLocation
Location for the keyword search, e.g. United States or Berlin.
limitPerSourceintegerOptionaldefault 20Max jobs per search
Maximum number of jobs to scrape from each URL, or from the keyword search when no URLs are set. LinkedIn returns at most about 1000 per search.
Narrow down which jobs are returned. Ignored when URLs are set.
datePostedenumOptionaldefault "anyTime"Date posted
Only return jobs posted within this window.
distanceintegerOptionalDistance (miles)
Search radius in miles around the location. Leave empty for LinkedIn's default.
companyIdsarrayOptionaldefault []Company IDs
LinkedIn numeric company IDs (from a company URL or `f_C=` in a search URL), e.g. "1441" for Google.
under10ApplicantsbooleanOptionaldefault falseUnder 10 applicants
Only jobs with fewer than 10 applicants.
geoIdstringOptionalGeo ID
Optional LinkedIn geoId for precise location targeting (found in a LinkedIn search URL as `geoId=`). Overrides free-text location when LinkedIn resolves it.
splitByLocationbooleanOptionaldefault falseSplit search by city locations
Enable this to split your search by cities within a country. This helps bypass LinkedIn's 1000 job limit per search URL by creating separate searches for each city. This will overwrite the location filter in input search URLs.
splitCountryenumOptionalCountry to split by
Select the country whose cities will be used to split the search. Only used when 'Split search by city locations' is enabled. Required to when 'Split search by city locations' is enabled.
autoConvertToAiSearchbooleanOptionaldefault trueAuto convert old search URLs to AI search URLs (recommended)
LinkedIn now only offers AI job search, which dropped many classic filters (experience, job type, workplace, salary, sort). When enabled, those filters in old search URLs are turned into keywords. Date posted, company, Easy apply and Under 10 applicants stay as filters.
scrapeCompanybooleanOptionaldefault trueScrape company details
This will require additional scraping requests for each job record and take longer to scrape
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | string | null | |
| link | string | null | |
| title | string | null | |
| companyName | string | null | |
| companyLinkedinUrl | string | null | |
| companyLogo | string | null | |
| location | string | null | |
| salaryInfo | array | |
| postedAt | string | null | |
| benefits | array | |
| descriptionHtml | string | null | |
| applicantsCount | string | null | |
| descriptionText | string | null | |
| jobPosterName | string | null | |
| jobPosterTitle | string | null | |
| jobPosterPhoto | string | null | |
| jobPosterProfileUrl | string | null | |
| seniorityLevel | string | null | |
| employmentType | string | null | |
| jobFunction | string | null | |
| industries | string | null | |
| companyDescription | string | null | |
| companyWebsite | string | null | |
| companyEmployeesCount | integer | null | |
| salaryInsights | string | null | |
| applyMethod | string | null | |
| expireAt | string | null | |
| workRemoteAllowed | boolean | null | |
| workplaceTypes | array | |
| postedAtTimestamp | string | null | |
| insights | array | |
| inputUrl | string | null | |
| error | string | null | |
| errorDescription | string | null |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Job | One LinkedIn job saved to the dataset, with company details when requested | $0.0015 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('openrole/linkedin-jobs-scraper').call({
"keywords": "data engineer",
"location": "Berlin, Germany",
"datePosted": "pastWeek",
"limitPerSource": 50,
"scrapeCompany": true
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run openrole/linkedin-jobs-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=openrole/linkedin-jobs-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Job search with location and date filters plus company details.
Jobs from a pasted LinkedIn search link.
Jobs filtered to one company by its LinkedIn ID.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.