Extract structured data from 0.27 β π° $0.27 per 1,000 results β Scrape linkedin.com job salaries & pay ranges without login or cookies β compensation, seniority, skills and full employer data. π― Built for salary benchmarking and pay-transparency research.
π° LinkedIn Salary Scraper on Apify β
No credit card required. No commitment. Cancel anytime.
- Click sign up β pick GitHub, Google, or email; takes ~30 seconds
- Open this actor β input is pre-filled with a working example
- Click Start β export results as JSON, CSV, or Excel
Your $5 monthly platform credit is enough to run this actor right away β and again every month β scraping typically several hundred to several thousand results per run, depending on your input.
Incremental mode β Only get new or changed listings since your last run. Content hash per listing β no duplicates, no re-processing.
Change classification β Track unchanged, expired, cross-run repost detection across runs. Build audit trails of how listings evolve over time.
Compact output β Emit core fields only (AI-agent / MCP-friendly). Keeps response size small for LLM workflows.
Description truncation β Cap description length per listing to control output size and cost.
Result cap β Stop after N listings. Set to 0 for the full catalog.
Proxy support β Route traffic through Apify Proxy or your own proxy group to avoid regional blocks and rate limits.
Export anywhere β Download as JSON, CSV, or Excel. Stream via Apify API, webhooks, or integrations with Make, Zapier, Airbyte, Keboola.
Structured data β Every listing returns the same schema with consistent field naming. All fields always present β null when unavailable, never omitted.
Data pipeline automation Integrate with your ETL pipeline to collect structured listings from 0.27 on a schedule. Export to CSV, JSON, or directly to your database. Use compact mode to control output size.
Market research Monitor listings, track trends, and analyze market dynamics with structured, deduplicated data from 0.27.
Change monitoring Run daily or hourly in incremental mode to capture only new, updated, or expired listings. Perfect for price-tracking, churn analysis, and alerting pipelines.
Compensation benchmarking Aggregate salary ranges across roles, industries, and locations on 0.27 to inform pricing decisions, hiring plans, or candidate negotiations.
Lead generation Extract contact details alongside listings to build targeted outreach lists for sales teams, partnerships, or B2B prospecting.
AI / LLM training data Structured JSON per listing is ready for RAG pipelines, embeddings, and agent workflows. Compact mode trims tokens for LLM context windows.
{
"keywords": "software engineer",
"location": "United States",
"datePosted": "last7d",
"enrichDetails": true,
"maxResults": 100
}| Parameter | Type | Default | Description |
|---|---|---|---|
keywords |
string | β | Job search keywords (e.g. "software engineer", "nurse"). Leave blank to browse all jobs in the selected location. |
location |
string | β | City, state, region, or country (e.g. "Berlin, Germany", "United States"). LinkedIn resolves it for you β no IDs needed. Leave empty for global results. |
geoIds |
array | [] |
Advanced/optional override β most users just use π Location, which LinkedIn resolves automatically. For exact targeting, paste a LinkedIn jobs search URL into π Start URLs (the geoId is read for you), or copy the numeric geoId from a LinkedIn jobs URL. Each geoId becomes a separate query, deduped on jobId. |
regions |
array | [] |
Two-letter country codes (e.g. "US", "GB", "DE"). Resolved to LinkedIn country geoIds. Use geoIds[] for unsupported markets. |
regionPresets |
enum | β | Pre-defined country grouping. Combined with regions[] if both are set. |
datePosted |
enum | "anytime" |
Filter by posting recency. "lastHour" is unique to this scraper. |
jobType |
array | [] |
Multi-select employment type filter. |
experienceLevel |
array | [] |
Multi-select seniority filter. |
workType |
array | [] |
Multi-select onsite/remote/hybrid filter. |
salaryMin |
integer | β | Minimum annual salary (USD). Mapped to LinkedIn's nearest f_SB2 bucket. Post-filtered exactly. |
salaryMax |
integer | β | Maximum annual salary. Post-filtered (LinkedIn has no native max filter). |
salaryIncludeUnknown |
boolean | true |
When salaryMin/Max set, include jobs with no salary data. |
companies |
array | [] |
Scrape jobs from specific employers. Paste LinkedIn company-page URLs (e.g. https://www.linkedin.com/company/microsoft) or numeric companyIds β URLs are resolved for you, no ID lookup needed. Combine with π Keywords to filter within a company. |
excludeCompanies |
array | [] |
Company-name substrings to exclude (case-insensitive post-filter). |
excludeKeywords |
array | [] |
Title substrings to exclude (case-insensitive post-filter). |
easyApply |
boolean | false |
Restrict results to LinkedIn Easy Apply postings. |
removeAgency |
boolean | false |
Heuristic post-filter on company name ("recruitment", "staffing", etc.). |
distance |
integer | β | Search radius around location. LinkedIn auto-detects unit (miles in US/UK/CA/AU/NZ; km elsewhere). |
sortBy |
enum | "recent" |
Sort order. "recent" is recommended for incremental feeds. |
startUrls |
array | [] |
Paste LinkedIn job URLs from your browser. Two kinds work: a job SEARCH URL (e.g. .../jobs/search?keywords=β¦) reuses all of its filters as the query, or an individual JOB POSTING URL (e.g. .../jobs/view/4012345678) is scraped directly with full detail. Mix both freely. |
proxyConfiguration |
object | {"useApifyProxy":true} |
Network egress configuration. Use the default unless you need a custom proxy setup. |
linkedinHost |
string | "www" |
Subdomain (e.g. "www", "de"). Affects default geo-routing + UI labels. |
outputLanguage |
string | "en-US,en;q=0.9" |
HTTP Accept-Language header. Default en-US for parsing-cleanliness. |
incrementalMode |
boolean | false |
Persist seen-jobIds across runs; emit only NEW + UPDATED. Requires stateKey. |
stateKey |
string | β | Optional stable identifier for the tracked search universe. Leave empty to auto-derive a stable identifier from your search inputs β different keyword/location/filter combinations get isolated state automatically. |
allowNonIncrementalFallback |
boolean | false |
If incremental mode is requested but the state store is not accessible on this account, fall back to a non-incremental run instead of failing. Default: fail loudly so missing state is not silently ignored. |
outputMode |
enum | "all" |
Which items to emit when in incrementalMode. |
emitUnchanged |
boolean | false |
Include items that haven't changed since last run. |
emitExpired |
boolean | false |
Include items that disappeared from search results. |
skipReposts |
boolean | false |
Suppress jobs with the same content as a previously-seen but inactive listing. |
enrichDetails |
boolean | true |
Fetch each job's detail page to extract the salary / pay range plus full description, seniorityLevel, employmentType, jobFunction, industry, and applicantCount. On by default β this is where salary data comes from. Adds 1 HTTP request per job. |
scrapeCompany |
boolean | false |
For each job, fetch the employer's public LinkedIn company page and add company description, website, employee count, logo, and address. Fetched once per unique company. |
discoverRelated |
boolean | false |
After the main search, fetch LinkedIn's related-jobs feed for the first N results to discover roles that don't surface on the keyword search. Useful for thin markets. |
relatedSeedCount |
integer | 5 |
How many of the first search results are used as seeds for related-jobs expansion. Each seed yields up to 10 candidates. |
telegramToken |
string | β | Bot token from @BotFather. Leave empty to disable Telegram notifications. |
telegramChatId |
string | β | Numeric chat or channel ID where notifications should be sent. |
discordWebhookUrl |
string | β | Channel webhook URL. Leave empty to disable Discord notifications. |
slackWebhookUrl |
string | β | Incoming webhook URL. Leave empty to disable Slack notifications. |
whatsappAccessToken |
string | β | Permanent System User token from Meta Business. |
whatsappPhoneNumberId |
string | β | Numeric phone-number ID from the Meta dashboard. |
whatsappTo |
string | β | Recipient phone number in E.164 format (e.g. "4561234567"). |
webhookUrl |
string | β | Receives a JSON POST of {metadata, items} for each batch. |
webhookHeaders |
object | β | Additional HTTP headers to include with the generic webhook (e.g. Authorization). |
notificationLimit |
integer | 5 |
Cap on items included in each notification message. |
notifyOnlyChanges |
boolean | false |
When in incrementalMode, suppress notifications for UNCHANGED items. |
compact |
boolean | false |
Emit only core fields (keeps cost the same; reduces dataset size). |
descriptionMaxLength |
integer | 0 |
Truncate description (0 = no truncation). Only relevant when enrichDetails=true. |
phoneExtractionMode |
enum | "strict" |
"strict" requires Tel:/+CC prefix; "lenient" also picks up bare local-format numbers. |
maxResults |
integer | 100 |
Cap on emitted items (0 = unlimited). |
descriptionFormat |
enum | "all" |
Pick a single description representation. all keeps every variant; text / html / markdown drop the others. |
excludeEmptyFields |
boolean | true |
Drop null, empty-string, and empty-array fields from each record before push. Smaller, cleaner payloads for AI agents and dashboards. On by default; turn off to always emit every field (including empty ones). |
appConnector |
string | β | Optional. Pick a connected app under Settings β API & Integrations to receive your results. Notion is supported today (a run-summary page); other MCP connectors are best-effort as Apify expands its catalog. |
mcpIssueTeam |
string | β | Only when the connected app is an issue tracker: the team (name or ID) the summary issue is created under, if that app requires one. |
Every listing returns the same 56-field schema. Missing values are null β never omitted.
scrapedAtportalUrlsourcejobIdlinkedinJobIdjobUrltitlecompanycompanyUrlcompanyIdlocationcountrypostedAtapplyUrlapplyTypedescriptiondescriptionHtmldescriptionMarkdownseniorityLevelemploymentTypeindustryjobFunctionworkplaceTypeapplicantCounteasyApplysalaryMinsalaryMaxsalaryCurrencysalaryPeriodsalarySourcesalaryIsPredictedcompanyLogocompanyDescriptioncompanyEmployeeCountcompanyWebsitecompanyAddressrecruiterNamerecruiterUrlrecruiterTitleextractedEmailsextractedPhonesextractedUrlssocialProfileschangeTypefirstSeenAtlastSeenAtpreviousSeenAtexpiredAtisRepostrepostOfIdrepostDetectedAtlanguagecontentHashisPromotedpostingBenefitstrackingId
One object per listing. Here is a real example from a production run:
{
"scrapedAt": "2026-04-27T19:02:37.769Z",
"portalUrl": "https://www.linkedin.com",
"source": "linkedin",
"jobId": "1705fc4ee704bf3584cf2654b20e8f95383167563ff7ecd0184b58d2c7d66236",
"linkedinJobId": "4406118990",
"jobUrl": "https://www.linkedin.com/jobs/view/software-engineer-new-grad-at-notion-4406118990",
"title": "Software Engineer, New Grad",
"company": "Notion",
"companyUrl": "https://www.linkedin.com/company/notionhq",
"companyId": "notionhq",
"location": "San Francisco, CA",
"country": "CA"
}Truncated β full records contain 56 fields. See Output fields for the complete schema.
Try π° LinkedIn Salary Scraper now β $5 free credit, no credit card β
Pay only for what you extract. No subscription required β Apify's free $5 credit covers thousands of results.
| Event | Price (USD) |
|---|---|
| Actor Start | $0.0005 |
| Result | $0.00027 |
See the actor on Apify for current pricing.
How do I scrape 0.27? Use this actor on Apify to extract structured data from 0.27. Configure your search query and filters in the input, then click Start β no coding required.
How do I get 0.27 data as JSON, CSV, or Excel? The actor writes each listing to Apify's dataset. Download as JSON, CSV, or Excel from the Console, stream via the API, or push to Make, Zapier, Airbyte, or Keboola.
Is it legal to scrape 0.27? Web scraping of publicly available data is generally legal. This actor only accesses publicly visible information. Always check 0.27's terms of service for your specific use case.
How much does it cost? Pay-per-event pricing β you only pay for listings extracted. Apify's free $5 credit is enough to run thousands of results before you pay anything.
How does incremental mode work? Each listing gets a content hash. On subsequent runs, only new or changed listings are emitted β saving time, compute, and storage. Expired listings can be tracked separately.
Do I need an API key or credentials? No. Just sign up for Apify, paste your input, and click Start. No credit card required.
- Djinni Scraper β Ukraine & CEE tech jobs with salary and English level
- Work.ua Scraper β Ukraine's work.ua job listings
- NoFluffJobs Scraper β Poland & CEE IT jobs with transparent salary ranges
- OLX Jobs Scraper β OLX job listings across 7 CEE countries
- Prace.cz Scraper β Czech Republic's prace.cz job board
- Profession.hu Scraper β Hungary's profession.hu job board
Browse all Black Falcon Data actors β
New to Apify? Create a free account with $5 credit β no credit card required.
- Sign up β $5 platform credit included
- Open π° LinkedIn Salary Scraper and configure your input
- Click Start β export results as JSON, CSV, or Excel
Need more later? See Apify pricing.
Black Falcon Data builds production-grade web scrapers for job boards and marketplace data. Browse our full actor catalog at www.blackfalcondata.com.
Last updated: 2026 07