Job Post Enricher: Salary, Seniority, Remote, Visa & Skills avatar

Job Post Enricher: Salary, Seniority, Remote, Visa & Skills

Pricing

from $2.10 / 1,000 job enricheds

Go to Apify Store
Job Post Enricher: Salary, Seniority, Remote, Visa & Skills

Job Post Enricher: Salary, Seniority, Remote, Visa & Skills

Adds AI fields to job posts from any LinkedIn, Indeed or career-site dataset, CSV or Google Sheet: yearly salary in one currency, seniority, remote or hybrid, visa sponsorship, skills, years of experience. Never invents pay. Charged per enriched job. Agent-ready: x402, MCP.

Pricing

from $2.10 / 1,000 job enricheds

Rating

0.0

(0)

Developer

Adam Pearce

Adam Pearce

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Share

Scraped 5,000 jobs from LinkedIn or Indeed and now need to know which ones pay over $120k, are remote, sponsor visas and want Python? Point this Actor at the scraper's dataset (or a CSV or Google Sheet) and every job comes back with clean, sortable fields added next to your original columns:

  • Salary as yearly min and max in one currency (USD, GBP, EUR or any ECB currency), plus the pay exactly as written, its period (hour, day, week, month, year), where it was found and a confidence flag. Never invented: if the job states no pay, the salary is empty, and every number is checked against the job's own text before it is kept.
  • Seniority: intern, entry, junior, mid, senior, lead, manager, director, executive
  • Work mode: remote, hybrid or onsite, plus remote scope ("US only", "3 days in office")
  • Visa sponsorship: yes, no or unknown, only when the job says so, with the sentence quoted
  • Contract type: full time, part time, contract, temporary, internship, apprenticeship, freelance
  • Job category: software engineering, data and AI, sales, healthcare, skilled trades and 20 more
  • Required and nice-to-have skills, years of experience (min and max) and a one-line summary
  • Optional, same price: stated benefits, minimum education and languages required

It reads the output of any jobs scraper without setup. Title, description, company, location and salary columns are detected automatically, including nested ones such as Indeed's description.text and baseSalary. Tested on LinkedIn Jobs, Indeed (US and UK) and Greenhouse career-site data.

Who uses it

  • Job boards and aggregators: add salary, remote and seniority filters to scraped listings without hand-tagging.
  • Recruiters and staffing agencies: find every senior, remote, visa-sponsoring role in a scrape in seconds.
  • Salary and labour-market research: yearly pay in one currency across hourly, daily and monthly postings.
  • Job seekers and career coaches: shortlist roles by pay, work mode and visa sponsorship.
  • Sales teams selling to hiring companies: see which companies hire for which skills and levels.
  • AI agents: a jobs scraper run in, a clean structured table out, in one call.

How to use it

  1. Run any jobs scraper on Apify (for example a LinkedIn Jobs or Indeed scraper), then pick its dataset in Dataset. Or paste a CSV, Excel, JSON or Google Sheet link into File or Google Sheet URL, or paste whole job posts into Job post texts.
  2. Choose the Salary currency for the yearly columns (default USD, or original to keep each job's own currency).
  3. Run. 100 jobs take about 2 minutes and 1,000 jobs about 20 to 25 minutes. Results stream into the dataset as they are ready; a summary (salary coverage, seniority and work mode counts, top skills) is saved as OUTPUT.

Chain it after a scraper with an Apify integration or webhook ("run this Actor when the scraper finishes, with its dataset ID") so every scrape arrives enriched.

Sample output

One job from the default example (a public Stripe posting), with its description column left out here:

{
"title": "Senior Software Engineer, Backend",
"companyName": "Stripe",
"location": "Seattle, WA",
"jobUrl": "https://stripe.com/jobs/search?gh_jid=8230952",
"enrichStatus": "ok",
"enrichDetail": null,
"jobSummary": "Senior Software Engineer, Backend available in Seattle, WA with 40 hours/week and 50% telecommuting option.",
"seniority": "senior",
"workMode": "hybrid",
"remoteScope": null,
"contractType": "unknown",
"jobCategory": "software_engineering",
"salaryMinYearly": 206090,
"salaryMaxYearly": 285600,
"salaryYearlyCurrency": "USD",
"salaryStatedText": "Salary: $206,086.00 - $285,600.00/yr.",
"salaryStatedMin": 206086,
"salaryStatedMax": 285600,
"salaryStatedCurrency": "USD",
"salaryStatedPeriod": "year",
"salarySource": "description",
"salaryConfidence": "high",
"visaSponsorship": "unknown",
"visaEvidence": null,
"yearsExperienceMin": 5,
"yearsExperienceMax": 5,
"requiredSkills": ["Java", "Scala", "Python", "Distributed systems", "Big Data", "Spark", "SQL", "Testing (JUnit, Mockito, TestNG)", "Leadership"],
"preferredSkills": []
}

An hourly UK electrician job reads salaryStatedText: "Pay: £17.00-£19.00 per hour", salaryStatedPeriod: "hour", and with salaryCurrency: "GBP" gives salaryMinYearly: 35360 (17 x 40 hours x 52 weeks). A part-time job that says "£12.60 an hour, 20 hours a week" uses its own 20 hours: salaryMinYearly: 13100.

Accuracy

Hand-checked on 30 real jobs (10 LinkedIn, 10 Indeed, 10 Greenhouse; 17 with a stated salary, 13 without), across repeated runs on 03-10-2026:

  • Salary: right on every job the AI answered, in every test run (correct amount, period and currency, or correctly empty), including a "From 45k a year" line, a weekly travel-nurse wage, a daily contractor rate, an Italian base-and-OTE posting and a job with two location-based ranges.
  • Seniority: 27 to 30 of 30 (90 to 100%) across six runs. Misses are close calls such as "Senior Engineering Manager" read as senior or lead instead of manager.
  • Work mode: nursing, electrician and trades jobs read as onsite 10 of 10 in five of six runs.
  • On 200 more real jobs (100 LinkedIn, 100 Indeed US and UK): in the final test run all 118 jobs with a visible pay line came back with their salary (97% before the last fixes), and no salary was invented: every returned amount appears in the job's own text.

It is an AI reading text, so spot-check a sample before relying on fields in bulk. salaryConfidence is low when the pay looks unusual (for example a job board labelling an hourly rate as weekly), when the currency had to be guessed or the AI's quote does not match the text, and enrichDetail says why.

Pricing

Pay per event, no subscription:

EventPrice
Job enriched (one job returned with the AI fields)$0.003 ($3 per 1,000 jobs), less on Bronze, Silver and Gold plans
CSV or Excel export file$0.01 each, only if requested
Webhook delivery$0.02, only on a 2xx response

Examples: enriching a 1,000-job LinkedIn scrape costs about $3. A daily job board refresh of 500 new jobs costs about $1.50 a day. Rows with no title or description, and jobs where the AI step fails, are never charged. Set the run's maximum charge to cap spend; the Actor stops cleanly at the limit.

Input

FieldWhat it does
datasetIdApify dataset of jobs (any scraper's output)
fileUrlCSV, TSV, Excel, JSON or JSON Lines link, or a Google Sheet shared as "anyone with the link"
jobTextsWhole job posts pasted as plain text
dataRows as inline JSON
salaryCurrencyCurrency for the yearly columns, default USD; original keeps each job's own
hoursPerWeekUsed for hourly pay, default 40
includeExtrasAdds statedBenefits, educationLevel, languagesRequired
titleField, descriptionField, companyField, locationField, salaryFieldOnly if auto-detection picks the wrong column; nested fields use a dot (description.text)
keep, keepOriginalFields, exportFormats, outputDatasetName, webhookUrlOutput options

FAQ

Does it guess salaries for jobs that do not list one? No. A salary is filled only when the job states an amount ("competitive salary" stays empty), and each number must appear in the job's own text. Bonuses, sign-on bonuses, referral fees and allowances are not counted as salary.

Which scrapers does it work with? Any that output a title or description column: LinkedIn Jobs, Indeed, Glassdoor, ZipRecruiter, Seek, Reed, Google Jobs and career-site scrapers for Greenhouse, Lever, Ashby, Workday and others. The run log names the columns it used.

What about jobs in other languages? The AI reads job posts in most languages; output fields and summaries are in English.

How is pay converted to yearly? Hourly x hours per week (default 40) x 52, daily x 260, weekly x 52, monthly x 12. Currency uses the European Central Bank reference rate of the day, recorded in the OUTPUT summary. The stated pay is always kept as written too.

Is my data stored? Only the job text is sent to the AI model (OpenAI) for the run; nothing is kept afterwards.

Is it agent-ready? Yes. Pay per event, works through Apify's MCP server and x402 payments, with typed fields and a summary record an agent can read.

If this saved you reading job posts by hand, a short review on the Apify Store helps a lot and is read personally. Questions or a scraper whose columns are not picked up? Open an issue on the Issues tab and it will be answered the same day.