Career Page Jobs API (Workday, Personio, Greenhouse +5) avatar

Career Page Jobs API (Workday, Personio, Greenhouse +5)

Pricing

$1.50 / 1,000 job results

Go to Apify Store
Career Page Jobs API (Workday, Personio, Greenhouse +5)

Career Page Jobs API (Workday, Personio, Greenhouse +5)

Get all open jobs from company career pages as clean JSON. Paste websites or job board URLs; Workday, Personio, Recruitee, Greenhouse, Lever, Ashby, Workable and SmartRecruiters are auto-detected. Filter by keyword, location, remote, date, or get only new jobs.

Pricing

$1.50 / 1,000 job results

Rating

0.0

(0)

Developer

LatentLark

LatentLark

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 hours ago

Last modified

Share

Career Page Jobs API: Workday, Personio, Greenhouse, Lever, Ashby, Recruitee, Workable, SmartRecruiters

Get every open job from any company's career page as clean, normalized JSON. Give it a company website (celonis.com), a job board URL (https://jobs.lever.co/spotify, https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite) or ats:slug (personio:ottonova). The actor finds which applicant tracking system (ATS) the company uses and pulls the jobs from that ATS's official public job-board feed. It doesn't use a browser or proxies, and it doesn't break when a page layout changes.

One actor covers the enterprise ATS Workday (used by most Fortune 500 companies), the DACH/EU systems Personio and Recruitee, and the startup favourites Greenhouse, Lever, Ashby, Workable and SmartRecruiters.

Career Page Jobs API results: one table of jobs from Workday, Personio, Greenhouse, Lever, Ashby, Recruitee, Workable and SmartRecruiters

Real output from our test runs: 8 different ATS, one schema. Want it in a spreadsheet? Send every run to Google Sheets with Google Sheets Export & Import (No OAuth) — see Export jobs to Google Sheets.

Use cases

  • Hiring-signal lead lists (sales, agencies, investors): a company opening 10 data roles is likely shopping for data tools. Feed your target accounts in, filter by keywords (e.g. data, security, sales), and turn new openings into warm leads for your CRM.
  • Job aggregators and niche job boards: pull hundreds of company boards into one normalized feed every day, e.g. all AI jobs in Berlin, all remote Rust roles, all climate-tech companies.
  • Recruiter and agency monitoring: watch your client and target companies and see new roles as soon as they appear on the company's own career page.
  • Competitor hiring tracking: see which teams, locations and seniority levels your competitors are hiring for. Run it weekly and compare.
  • German & EU career pages: Personio and Recruitee power a large share of DACH and EU companies (Mittelstand, startups, scale-ups) that most US-focused scrapers ignore. German titles like (m/w/d) and Werkstudent come through as-is, and excludeKeywords can drop them.
  • Scheduled runs with "only new jobs": set onlyNewSinceLastRunKey, schedule the actor daily, and each run returns (and bills) only jobs that weren't there yesterday. Connect it to Google Sheets, Slack, email, Make, Zapier or n8n.
  • AI agents and LLM pipelines: structured job data with plain-text descriptions, ready for RAG, matching or classification.
  • Market research: salary ranges where boards publish them (Ashby, some Greenhouse and Lever boards), remote share, team growth.

Why this instead of a single-ATS scraper

  • 8 systems in one actor: Workday, Personio, Recruitee, Greenhouse, Lever, Ashby, Workable and SmartRecruiters. A company list usually mixes them; with single-ATS scrapers you need one actor, one input format and one output format per system.
  • Auto-detection from the company domain: paste celonis.com and the actor finds the board for you. No need to look up which ATS a company uses or what its board slug is.
  • One output schema: the same fields (company, title, location, workplaceType, postedAt, url, salary, ...) for every ATS, so you can merge, filter and export without per-source mapping.
  • Pay per result: you pay only for jobs saved to the dataset. Companies where no board is found cost nothing, and monitor mode only bills new jobs.
  • Workday without the 2,000-job cap: large Workday boards are split and merged automatically.

Supported ATS

ATSTypical URLNotes
Personiocompany.jobs.personio.deXML feed, DE/EN
Recruiteecompany.recruitee.comIncludes salary when published
Greenhouseboards.greenhouse.io/companyUS and EU instances
Leverjobs.lever.co/companyUS and EU instances, salary range
Ashbyjobs.ashbyhq.com/companyCompensation included
Workableapply.workable.com/company
SmartRecruitersjobs.smartrecruiters.com/CompanyFull descriptions
Workdaycompany.wd5.myworkdayjobs.com/Site or wd5.myworkdaysite.com/recruiting/company/SiteExact posting date, country code, all locations. Boards over 2,000 jobs are split automatically

Input

FieldWhat it does
companies (required)A list of websites, job board URLs, ats:slug values or bare slugs
keywords / excludeKeywordsMatch against the title (and the description if searchInDescription is on)
locations, includeRemoteForLocations, remoteOnlyLocation filters
postedWithinDaysKeep only recent postings
includeDescription, descriptionFormattext or html
onlyNewSinceLastRunKeyMonitor mode: output only jobs not seen in earlier runs that used the same key
maxJobsPerCompany, maxResults, maxConcurrencyLimits

Example:

{
"companies": ["celonis.com", "https://jobs.lever.co/spotify", "personio:ottonova", "greenhouse:gitlab", "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
"keywords": ["engineer", "data"],
"locations": ["Berlin", "Munich", "Germany"],
"includeRemoteForLocations": true,
"onlyNewSinceLastRunKey": "my-watchlist"
}

Output

Each dataset item is one job:

{
"ats": "greenhouse",
"boardSlug": "celonis",
"company": "Celonis",
"jobId": "7012345",
"title": "Senior Backend Engineer",
"department": "Engineering",
"location": "Munich, Germany",
"locations": ["Munich, Germany"],
"country": "Germany",
"workplaceType": "hybrid",
"employmentType": "full-time",
"postedAt": "2026-10-20T09:12:00+00:00",
"url": "https://job-boards.greenhouse.io/celonis/jobs/7012345",
"applyUrl": "https://job-boards.greenhouse.io/celonis/jobs/7012345",
"salary": {"min": null, "max": null, "currency": null, "interval": null, "text": null},
"description": "About the role ...",
"sourceInput": "celonis.com",
"detectedVia": "website",
"scrapedAt": "2026-10-24T10:00:00+00:00"
}

A run summary showing each input, the board it was detected as, its job count and any errors is saved in the key-value store under SUMMARY.

How detection works

  1. ats:slug values and job board URLs are used directly.
  2. For a website, the actor loads the homepage and common career paths (/careers, /jobs, /karriere, ...) and looks for embedded ATS links or widgets.
  3. If nothing is found, it tries the domain name as a slug on each ATS (except Workday, whose board address can't be guessed: give the Workday URL or the company website that links to it).
  4. For a Workday URL without a site path (e.g. https://adobe.wd5.myworkdayjobs.com/), the public career site is read from the tenant's robots.txt.

If no board is found, the input is logged and listed in SUMMARY. Bad inputs never fail the whole run.

Export jobs to Google Sheets

Get a job sheet that fills itself every morning with Google Sheets Export & Import (No OAuth). No "Sign in with Google" and no OAuth token that expires and silently stops your schedule:

Jobs from Career Page Jobs API in a Google Sheet, added by Google Sheets Export & Import

  1. Share your sheet with sheets-export@latentlark.iam.gserviceaccount.com as Editor.
  2. On this Actor (or your saved task), open Integrations → Add integration → Actor, pick Google Sheets Export & Import (No OAuth) and set the trigger to Run succeeded.
  3. Use this input: {"spreadsheet": "YOUR_SHEET_URL", "datasetId": "{{resource.defaultDatasetId}}", "mode": "append", "dedupeBy": ["url"]}

Schedule this Actor daily (with onlyNewSinceLastRunKey set) and your sheet only gets the new jobs. Rows already in the sheet are skipped by url, and skipped rows aren't billed.

Pricing

Pay per result: $1.50 per 1,000 jobs ($0.0015 per job). You only pay for jobs saved to the dataset. Inputs with no board found cost nothing. Use maxResults, keywords and location filters to control spend, and monitor mode so scheduled runs only pay for new jobs.

Speed

It uses plain HTTP API calls with no browser or proxies. In tests on Apify, 20 companies (2,035 jobs) took 55 seconds and 5 companies (326 jobs) took 19 seconds.

FAQ

Does it need proxies? No. The ATS feeds are public APIs. How do I find a company's board? Just give its website. The actor checks the homepage and common career paths. If you already know the board, greenhouse:stripe or the board URL is fastest. Can I get only new jobs every day? Yes. Set onlyNewSinceLastRunKey (for example my-watchlist) and schedule the actor. Seen job IDs are stored in a named key-value store in your account. How do I add a Workday company? Paste any URL from its Workday career site, e.g. a job link like https://mastercard.wd1.myworkdayjobs.com/CorporateCareers/job/..., or use workday:mastercard.wd1/CorporateCareers. The company website also works if it links to Workday. Workday shows max 2,000 jobs per search. Do I get them all? Yes. Above 2,000 the actor splits the search by Workday's own filters (job category, location) and merges the results without duplicates. In tests, NVIDIA's 2,743 jobs were all returned. Which country is covered? All of them. DACH/EU coverage is strong because of Personio and Recruitee.

The actor reads only the public job-board APIs that ATS vendors provide so that job postings can be syndicated. It doesn't collect applicant data or personal profiles. Recruiter contact emails that some feeds expose are dropped on purpose. You are responsible for how you use the data.

Limitations

  • It only covers companies whose career page runs on one of the supported ATS. Custom in-house career sites aren't supported.
  • Salary appears only where the company publishes it.
  • Workday: with includeDescription off, postedAt is derived from Workday's relative "Posted N Days Ago" text and is empty for "30+ Days Ago". With descriptions on (the default), the exact posting date is used. Workday has no department field.
  • Some field names vary between ATS, and extra keeps ATS-specific fields.

More from LatentLark

  • Competitor Ads Monitor: track competitor ads from Google Ads Transparency Center and LinkedIn Ad Library, with new-ad alerts.