LinkedIn Jobs Scraper | Details & Companies avatar

LinkedIn Jobs Scraper | Details & Companies

Pricing

from $0.22 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper | Details & Companies

LinkedIn Jobs Scraper | Details & Companies

Export public LinkedIn jobs by title, location or URL with available descriptions, salary fields and optional company profiles. Deduplicate jobs and retain context.

Pricing

from $0.22 / 1,000 results

Rating

0.0

(0)

Developer

Eli J

Eli J

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

What you can export

Use this LinkedIn jobs scraper for role research and hiring analysis. Supply titles and locations, job/search URLs or supported company inputs to export deduplicated public guest jobs with available descriptions, salary fields and source context.

Optional company-profile reads add public company information. No LinkedIn login or uploaded CV is required; field availability and result coverage depend on the guest surfaces.

Try the example input

The Console prefill searches Software Engineer in United States and returns up to three detailed jobs. API callers should send their own search; {} exits successfully with guidance and no LinkedIn reads or result rows.

{
"titles": [
"Software Engineer"
],
"locations": [
"United States"
],
"startUrls": [],
"companyIds": [],
"companyUrls": [],
"companyNames": [],
"mode": "detailed",
"maxItems": 3,
"maxRowsPerSearch": 0,
"companyProfile": true,
"datePosted": "anyTime",
"easyApply": false,
"under10Applicants": false,
"geoId": "",
"customUrlParams": {},
"filters": {},
"resumeKeywords": [],
"splitByLocation": false,
"splitCountry": "",
"splitLocations": [],
"splitTimeRanges": [],
"splitCompanyIds": []
}

Run through the Apify API with your Actor ID:

curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"titles":["Software Engineer"],"locations":["United States"],"maxItems":100}'

Read the resulting run’s default dataset as JSON, CSV or Excel. The output links also expose ERRORS, COVERAGE, SEARCH_TOTALS, METRICS and run-local STATE.

Inputs

Omitted or null values use the runtime values below. Explicit empty arrays, false and zero are preserved. Schema prefill is a Console example; it is never an API default.

InputTypeDefaultMeaning
titlesarray[]Keywords; each title is paired with every location.
locationsarray[]LinkedIn location hints; each is paired with every title.
startUrlsarray[]LinkedIn job, search or company URLs; strings or objects containing url. Read together with structured searches.
companyIdsarray[]Numeric LinkedIn organization IDs as strings.
companyUrlsarray[]Public company root/jobs/about/posts URLs; resolve the canonical root to its numeric ID.
companyNamesarray[]Exact company names; resolve uniquely from guest search and confirm the company root name. Ambiguity goes to ERRORS.
modestring"detailed"quick reads cards; detailed adds full job descriptions and optional company profiles.
maxItemsinteger1000Maximum unique delivered jobs across the run; 0 performs no reads. Maximum 100000.
maxRowsPerSearchinteger0Delivered-row cap per partition; 0 uses the 1000-card source window. Maximum 1000.
companyProfilebooleantrueJoin the public company root in detailed mode. Company identity/bound filters may still require a root read when false.
datePostedstring"anyTime"anyTime, past24Hours, pastWeek, pastMonth or r followed by positive seconds. Conservative observed-date post-check.
easyApplybooleanfalseDetailed only; require an explicit onsite-apply marker. Unknown is excluded.
under10ApplicantsbooleanfalseDetailed only; require an explicit applicant number below ten. Lower-bound captions are excluded.
geoIdstring""LinkedIn geographic ID passed to the guest query.
distanceintegernullOptional nonnegative distance hint in the guest query; units and nearby results are controlled by LinkedIn.
customUrlParamsobject{}Supported guest parameters only: keywords, location, geoId, distance, f_TPR, f_C, f_AL, f_EA, sortBy; legacy f_WT/f_JT/f_E are translated to exact local filters.
filtersobject{}Exact filters and dynamic flags described below; filters alone start a broad search.
resumeKeywordsarray[]Local literal keyword/alias matching in full descriptions; no uploaded CV, model calls or external enrichment.
splitByLocationbooleanfalseAdd capped partitions for distinct visible card locations; derived city rows must match the full observed location string.
splitCountrystring""With splitByLocation, replace each initial search location with this country hint; preserve derived city partitions.
splitLocationsarray[]Additional location partitions preserving each initial query’s other constraints.
splitTimeRangesarray[]Additional time partitions, each r followed by positive seconds; preserve other constraints.
splitCompanyIdsarray[]Additional numeric-company partitions preserving other constraints.

Exact filters

filters.workplaceTypes accepts Remote, Hybrid, On-site; employmentTypes accepts Full-time, Part-time, Contract, Temporary, Internship, Volunteer, Other; experienceLevels accepts Internship, Entry level, Associate, Mid-Senior level, Director, Executive. These match explicit observed values, case-insensitively. Unknown values never pass. Generic mentions of remote benefits are not workplace proof. industries and jobFunctions require any requested phrase’s words in the corresponding criterion. easyApply and under10Applicants are equally strict. An applicant caption like “Be among the first 25 applicants” is a range, and cannot pass an under-ten filter.

titleInclude is an OR of phrases, each requiring all its words in any order. titleExclude rejects any such phrase. skipJobIds excludes exact IDs; locationExclude excludes case-insensitive substrings; companyExclude excludes exact case-insensitive employer names. All are string arrays. Quick mode supports these card-level filters and observed dates; detail-level filters and skill matching require detailed mode.

Legacy search-URL f_WT, f_JT and f_E codes are translated into these local labels, rather than trusting LinkedIn to enforce them. URL and global label constraints must overlap; derived partitions retain those constraints. Global date, easy-apply and under-ten requirements also apply to URL sources and individual jobs. A URL date window and global date window use the narrower requirement. These modifiers do not add an unrelated broad search when source inputs are present. Supported custom parameters configure structured searches; unknown parameters and filters are declined into ERRORS. LinkedIn keyword/location/distance/geoId inputs are search hints, not promises of exact text or geography. Supply title filters when exact role wording matters. Automatic observed-city partitions additionally require an exact full location-string match. Explicit location partitions retain LinkedIn’s nearby-result behavior.

Dynamic filters and skill matching

These filters set dynamicFilterMatch and retain both matching and nonmatching jobs: jobFunctionInclude/jobFunctionExclude, jobIndustryInclude/jobIndustryExclude, companyOrganizationTypeInclude/companyOrganizationTypeExclude (string arrays), companySizeMin/companySizeMax, companyFoundedDateMin/companyFoundedDateMax, companyFollowersCountMin/companyFollowersCountMax (nonnegative integers), and excludeRecruitingAgencies, requireRecruiterProfile, requireSalaryInfo (booleans). Include takes precedence over exclude for each pair. Unknown company facts pass that dynamic check; they are not silently guessed. Company size bounds apply to the exact observed employee count, never a size band.

{"titles":["Engineer"],"locations":["Canada"],"maxItems":25,"filters":{"workplaceTypes":["Hybrid"],"titleExclude":["Sales Engineer"],"requireSalaryInfo":true},"resumeKeywords":[{"keyword":"C++","aliases":["CPP"]},{"keyword":"JavaScript","aliases":["JS"]}]}

Skill scoring checks literal keywords or aliases against description text with word boundaries. JS does not match JSON. This is a transparent text match, not an assessment of employability, semantic ranking or resume processing.

Source modes and partitions

{"startUrls":["https://www.linkedin.com/jobs/search/?keywords=Data%20Engineer&location=Canada",{"url":"https://www.linkedin.com/jobs/view/4419969671"},"https://www.linkedin.com/company/microsoft/jobs/"],"companyIds":["1035"],"companyNames":["Microsoft"],"maxItems":20}

Company URLs resolve their public root to a numeric organization ID. Company names must resolve uniquely to an exact name in a guest search and the company root; unresolved names go to ERRORS and never broaden into all jobs. A job URL must expose its own matching ID and a full description. Search cards may carry their own job link or a child full link; either form must match the card’s numeric job ID. Quick search mode reads cards without job-detail requests; company-filter identity checks may read a company root. Individual job URLs always require a detail read, including in quick mode.

{"titles":["Engineer"],"locations":["United States"],"mode":"quick","maxItems":10000,"maxRowsPerSearch":1000,"splitLocations":["Canada","United Kingdom","Germany","France","India","Singapore","United Arab Emirates","Japan","Brazil","Australia"]}

Every search stops before the measured start=1000 boundary. Ten or more populated capped partitions can supply 10,000 unique jobs; this is a run capacity, not guaranteed yield. Explicit location, time and company partitions preserve other query constraints and are added once to each initial search; time/company splits can overlap. Automatic location splitting discovers locations from visible cards; it is not a complete country or city inventory. All partitions deduplicate by job ID, with first-delivered query context retained. An initial structured query equivalent to a search URL shares one partition and uses structured context (inputUrl is empty), including after restart. COVERAGE states whether a partition ended on an empty page or hit a source/row/global/charge limit. SEARCH_TOTALS preserves the displayed total separately; it is not an expected final dataset size.

On an Apify migration/restart, the existing run dataset supplies delivered IDs and counts. STATE retains the pending partition queue and skips completed partitions; incomplete, uncapped partitions replay from offset zero and deduplicate delivered IDs. Row-capped partitions report row_cap without further target reads. Replayed coverage/totals replace their earlier partition record; earlier errors remain available. A partial detail, company or totals failure prevents a complete coverage claim. Resume is within one run, not between new runs or a change-feed mode. No error becomes a dataset row. Invalid/unresolved inputs and source failures are recorded in ERRORS; mixed-source runs can still deliver valid jobs. A run where every source attempt fails reports FAILED. A valid empty search/filter result exits successfully. maxItems: 0 makes no target requests. Native PPE charge limits stop delivery and further source reads; at most an already-finished batch of eight enrichments precedes a binding push.

Output

Every job has the same nullable shape in quick and detailed modes. Quick fields from cards remain populated; unavailable detail/company facts are null or empty arrays. Full descriptions, salary, poster, external apply and workplace fields depend on the public page. No missing fact is inferred. Applicant numbers can be lower bounds; source captions remain available. applyUrl is the public LinkedIn job landing page; externalApplyUrl is nullable when the guest route exposes no usable offsite target. Posting dates retain their observed precision; exact timestamps and expiry are not manufactured.

FieldMeaning
idLinkedIn job ID; deduplication and billing identity.
jobUrlCanonical public job URL.
titleObserved job title.
companyNameObserved employer; verified root name when joined.
companyUrlCanonical company root URL; null for absent or other employer-link families.
companyIdVerified organization ID, nullable without a join.
companyLogoPublic company/card logo URL.
locationDisplayed location; not a geocoded address.
locationParsedNullable; no guessed geocoding.
postedTimeObserved relative posting-age caption.
publishedAtCard time datetime, preserving source precision.
postedAtTimestampNullable; no invented millisecond posting timestamp.
benefitsVisible card benefit/badge strings.
hiringBadgeVisible card hiring badge.
isActivelyHiringTrue only from a visible actively-hiring badge; otherwise null.
isEarlyApplicantTrue only from an explicit early-applicant badge; otherwise null.
descriptionFull public description as plain text.
descriptionHtmlInner HTML of the full public description.
applicantTextOriginal applicant caption, including lower-bound qualifiers.
applicantsCountNumber in the caption; may be a lower bound, not an exact count.
applyUrlCanonical LinkedIn job landing URL in both modes.
externalApplyUrlOffsite application target exposed by an apply anchor or embedded applyUrl JSON comment; null for Easy Apply or when no usable offsite target is exposed.
applyTypeEASY_APPLY for an onsite control; EXTERNAL with a usable offsite target; NOT_EXPOSED when details expose no usable offsite target; null when quick mode skips details.
easyApplyTrue for an onsite control; false for a usable offsite target; otherwise null.
seniorityLevelLabeled job criterion.
employmentTypeLabeled job criterion.
jobFunctionLabeled job criterion.
industriesLabeled job criterion.
workplaceTypeRemote/Hybrid/On-site from an explicit role statement or title suffix; otherwise null.
workRemoteAllowedTrue only for verified Remote; false for Hybrid/On-site; unknown null.
salaryVisible compensation text, otherwise null.
salaryInfoObserved currency-and-amount strings.
salaryMinParsed visible minimum; no currency conversion.
salaryMaxParsed visible maximum.
salaryCurrencyExplicit currency, otherwise null; bare $ is ambiguous.
salaryPeriodExplicit hour/day/week/month/year period, otherwise null.
salarySourceNullable; no guessed source.
salaryInsightsNullable; no hidden insights fetched.
expireAtNullable; not exposed by the measured guest route.
jobStateCLOSED only when the source explicitly says no longer accepting; otherwise null.
repostedJobTrue only when explicitly labeled reposted; otherwise null.
verifiedNullable; no guessed verification.
insightsEmpty when unavailable.
posterFullNamePublic recruiter card name, otherwise null.
posterProfileUrlPublic recruiter card link; its profile is never fetched.
posterHeadlinePublic recruiter card headline.
posterPhotoPublic recruiter card image.
contactEmailAn email literally present in the job description; no contact enrichment.
yearsOfExperienceLiteral English years-of-experience phrases with context.
companyDescriptionPublic Organization JSON-LD description.
companyWebsiteLabeled company website; never visited.
companyEmployeeCountExact public Organization numberOfEmployees, otherwise null.
companySizeLabeled size band, distinct from the exact count.
companyFollowerCountPublic follower count.
companyIndustriesLabeled company industry.
companyTaglinePublic Organization JSON-LD slogan; null when absent. Distinct from industry and company description.
companyHeadquartersPublic Organization address object, otherwise null.
companyHeadquartersTextLabeled headquarters text.
companyTypeLabeled organization type.
companyFoundedYearLabeled founded year.
companySpecialtiesVisible specialties.
companyOfficeLocationsVisible office-location strings, empty if absent.
companyAffiliatedPagesVisible affiliated-page names, empty if absent.
companyRecentPostsVisible public post text, URL and source datePublished; dates may be incomplete.
companySourceUrlVerified company root read URL.
companyScrapedAtCompany observation UTC.
dynamicFilterMatchCombined dynamic-filter flag; does not remove rows.
matchedKeywordsMatched requested skill keywords.
unmatchedKeywordsUnmatched requested skill keywords.
keywordMatchScorePercentageMatched keyword fraction × 100, rounded; null when no keywords.
scrapingInfoInput URL, title, location, query, offset, page, index and partition key.
sourceUrlExact guest list/detail URL used for the row.
scrapedAtRow observation UTC.

Access, limits and billing

The Actor uses ordinary anonymous HTTP on LinkedIn public guest search, detail and company roots. It uses Apify’s automatically allocated US datacenter proxy pool and up to eight concurrent reads. Company reads may reuse a successful sticky session for less than 50 seconds; classified blocks retire it and retry with fresh sessions, up to ten attempts with backoff capped at two seconds. Other reads use fresh sessions and at most three classified attempts with shared backoff for blocking/rate limits/transient failures. Redirects, unknown pages and absent identities are errors. Login-gated profile data, company employees, website crawling and residential fallback are outside this version.

One successfully delivered unique job is one native dataset-item billing event. Errors, totals, coverage and state are key-value-store records. See the Store Pricing tab for current pay-per-event prices and any Actor Start charge. Compute and proxy costs still depend on filters, retries and company diversity. METRICS response-body bytes are useful diagnostics, not an invoice or exact billable network traffic.

LinkedIn can change its guest surfaces, omit fields, cap results or block requests. The public route offers no exhaustive coverage or long-term reliability guarantee.

Guest pages may expose only a sign-in or join modal for an offsite application. Those account controls are not application destinations: externalApplyUrl stays null and applyType is NOT_EXPOSED. The Actor does not sign in or derive an application URL from a company website.