Career Page Jobs Scraper: Greenhouse, Lever, Ashby & More avatar

Career Page Jobs Scraper: Greenhouse, Lever, Ashby & More

Pricing

from $1.05 / 1,000 jobs

Go to Apify Store
Career Page Jobs Scraper: Greenhouse, Lever, Ashby & More

Career Page Jobs Scraper: Greenhouse, Lever, Ashby & More

Collect open jobs from company job boards on Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee or Personio via public job-board APIs. Normalized rows: title, location, remote, department, salary when published. Filters and only-new-jobs monitoring.

Pricing

from $1.05 / 1,000 jobs

Rating

0.0

(0)

Developer

Charles Markette

Charles Markette

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Career Page Jobs Scraper returns the open jobs a company publishes through a supported applicant tracking system (ATS) board (up to 10,000 per board): Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio. Give it career page URLs, ATS board URLs or board names. It reads each vendor's public job-board API, the same endpoints these vendors publish so companies can list jobs on their own websites. You get one row per job with the same columns for every vendor: title, department, team, location, remote, employment type, salary range (when the employer publishes it), posted and updated dates, job and apply links, and optionally the full description. Turn on Only new jobs and each run returns just the roles that appeared since the last run.

Why this Actor

  • Official public APIs for the jobs. Each board is read through the vendor's documented public job-board endpoint (Greenhouse Job Board API, Lever Postings API, Ashby Job Postings API, Workable's public jobs widget API, SmartRecruiters Posting API, Recruitee's careers-site offers API, Personio's XML job feed). These endpoints need no login and return exactly what the company has chosen to publish. When you give a company's own careers page instead of a board URL, that one page is read once only to find which board it links to.
  • Works from a company's own careers page. If you give https://www.acme.com/careers instead of a board URL, the page is read once and the Actor looks for an embedded or linked board of a supported ATS: a Greenhouse embed script (boards.greenhouse.io/embed/job_board?for=acme), a Lever, Ashby, Workable, SmartRecruiters, Recruitee or Personio link, iframe or script. If the careers page redirects to a board, that works too.
  • One schema across vendors. remote follows the ATS's workplace type when it has one (true for remote, false for hybrid and on-site, even if the vendor also sets a "remote allowed" flag); otherwise its remote flag; otherwise true when the location text says "Remote" (a label, not a guarantee the role is fully remote); null when the ATS gives nothing. Timestamps are ISO 8601 UTC; where an ATS gives only a date (Workable), you get the date. Employment codes such as FullTime or fulltime_permanent become Full-time / Full-time, Permanent.
  • Salary only from the employer. salaryMin, salaryMax, salaryCurrency and salaryPeriod are filled only from the ATS's own compensation fields (Ashby compensation, Lever salary range, Recruitee salary, and Greenhouse pay-transparency ranges when its board API returns them). They are never guessed from the description text.
  • Monitoring built in. Only new jobs remembers up to 20,000 job IDs per board, so a scheduled run returns only new roles. Filters by title keywords, location, department and remote let you watch exactly the roles you care about.
  • Polite and safe. At most 2 requests at a time per ATS host, retries with backoff on 429 and 5xx (honouring Retry-After), timeouts, and a size cap on every response. The one careers page fetched per input is refused if it resolves to a private, local or cloud-metadata address, and every redirect hop is checked again.

Use cases

  • Sales signals: a company hiring its first "Head of Data" or five "Account Executives" is a buying signal. Run daily on your target accounts with Only new jobs and Title keywords head of, vp, director, and send new rows to Slack or your CRM.
  • Recruiting and talent intelligence: see which competitors are hiring which roles, in which cities, at which published pay ranges.
  • Job boards and newsletters: feed a niche job board (for example remote engineering roles at 300 startups) with Remote jobs only and Departments engineering.
  • Alerts for job seekers: get an email when any of your 50 favourite companies posts a "Product Designer" role in Berlin or remote.
  • Market research: count open roles by department over time to track a company's growth or hiring freeze.
  • Enrich a company list: point it at a dataset of companies with a careers URL column and get every open job next to each company's own fields.

How to use it

  1. Add Career page URLs (board URLs like https://boards.greenhouse.io/stripe, https://jobs.lever.co/palantir, https://jobs.ashbyhq.com/ramp, or a company's own careers page), and/or ATS boards written as ats:board (greenhouse:stripe, lever:netflix, ashby:ramp, workable:acme, smartrecruiters:Acme, recruitee:acme, personio:acme; greenhouse-eu: and lever-eu: for boards on the EU instances).
  2. Optional: set Title keywords, Exclude title keywords, Locations, Departments or Remote jobs only, and turn on Only new jobs for monitoring.
  3. Run it, or schedule it. Export as CSV, Excel or JSON, or chain it with an integration (see Related Actors).

Input example

{
"startUrls": ["https://boards.greenhouse.io/stripe", "https://jobs.lever.co/palantir", "https://www.example.com/careers"],
"boards": ["ashby:ramp", "personio:acme"],
"keywords": ["engineer", "account executive"],
"excludeKeywords": ["intern"],
"locations": ["New York", "Remote"],
"onlyNew": true,
"maxJobsPerCompany": 200
}

Output example

{
"company": "Gamma",
"ats": "ashby",
"board": "gamma",
"jobId": "1b2c3d4e-0000-4000-8000-000000000001",
"title": "Product Designer",
"department": "Design",
"team": "Core Product",
"location": "New York",
"locations": ["New York", "San Francisco"],
"remote": false,
"workplaceType": "hybrid",
"employmentType": "Full-time",
"salaryMin": 140000,
"salaryMax": 180000,
"salaryCurrency": "USD",
"salaryPeriod": "year",
"postedAt": "2026-10-14T16:20:11Z",
"updatedAt": null,
"jobUrl": "https://jobs.ashbyhq.com/gamma/1b2c3d4e-0000-4000-8000-000000000001",
"applyUrl": "https://jobs.ashbyhq.com/gamma/1b2c3d4e-0000-4000-8000-000000000001/application",
"input": "https://jobs.ashbyhq.com/gamma",
"discoveredFrom": null,
"scrapedAt": "2026-10-17T09:00:00Z",
"error": null
}
  • company is the company name when the ATS gives one (Greenhouse, Workable, SmartRecruiters, Recruitee, Personio), otherwise the board name.
  • locations lists every location of the job; location is the main one.
  • workplaceType is remote, hybrid or onsite when the ATS has that field.
  • applyUrl is set only when it differs from jobUrl.
  • discoveredFrom is the careers page a board was found on.
  • postedAt is a date without a time (2026-10-09) for Workable, which publishes only the day.
  • With Include job descriptions, rows also get descriptionText (HTML stripped, whitespace collapsed) and descriptionHtml.
  • An input that couldn't be read gives one row with input and error set and the job columns empty.
  • A run summary with a line per company (jobs on the board, matching, already seen, output) is saved as OUTPUT in the key-value store.

Supported and not supported

Supported (public job-board API)Board URL forms recognised
Greenhouse (US and EU)boards.greenhouse.io/{token}, job-boards.greenhouse.io/{token}, job-boards.eu.greenhouse.io/{token}, embed ?for={token}
Lever (US and EU)jobs.lever.co/{company}, jobs.eu.lever.co/{company}
Ashbyjobs.ashbyhq.com/{name}
Workableapply.workable.com/{account}, {account}.workable.com
SmartRecruitersjobs.smartrecruiters.com/{companyId}, careers.smartrecruiters.com/{companyId}
Recruitee{company}.recruitee.com
Personio{company}.jobs.personio.de, {company}.jobs.personio.com

Not supported: Workday, iCIMS, Taleo, SuccessFactors, LinkedIn, Indeed, Glassdoor, and company websites that don't use one of the boards above. The Actor doesn't log in, doesn't use undocumented internal APIs, and doesn't scrape HTML job pages. For those inputs you get a free error row saying "No supported ATS found on this page (supported: …)".

How "Only new jobs" works

  • The first run with Only new jobs outputs the board's current jobs (after your filters and Max jobs per company) and remembers them. Later runs output only jobs that weren't output before.
  • A job is remembered only once it has been output. Jobs left out because of Max jobs per company, Max output rows or your cost limit can come in a later run if they're still listed then. Memory holds up to 20,000 IDs per board and drops the oldest; resetting the memory or changing filters starts fresh, so previously collected jobs can appear (and be charged) again.
  • The memory lives in the key-value store career-page-jobs-state in your account: up to 20,000 job IDs per board (the oldest are dropped first).
  • Each saved task has its own memory, and changing the filters starts a fresh one. Set Memory name to choose it yourself: runs with the same memory name share it.

How much does it cost?

Pay per event: $1.50 per 1,000 jobs ($0.0015 per output job row), Apify platform usage included, plus $0.005 per run start. These are free: error rows (unknown ATS, board not found, page couldn't be read), jobs left out by your filters, and jobs you've already seen with Only new jobs.

Apify Store discounts: the price above is for Apify's Free plan. Paid plans pay less per 1,000 jobs: $1.35 on Starter, $1.20 on Scale, $1.05 on Business. The "from" price at the top of the Store page is the Business price.

Worked examples:

Examples use the Free-plan rate. Where an example doesn't add it, each run also has its run-start charge, counted per GB of Actor memory (minimum one; one at the default memory); Apify Proxy (where used) is billed separately.

  • 50 companies with about 40 open jobs each: 2,000 × $0.0015 + $0.005 = $3.005.
  • Recurring examples assume the initial matching jobs were already collected, 30 daily runs and one minimum start unit per run. A daily monitor of 100 companies with Only new jobs that finds about 30 new roles a day: $1.35 in job charges + $0.15 in start charges = $1.50 per 30 days. The first run also charges for the current matching jobs it outputs (for example 4,000 jobs = $6.00).
  • The same 100 companies, filtered to sales leadership titles, about 3 new roles a day: $0.135 in job charges + $0.15 in start charges = about $0.29 per 30 days.

If you set a maximum cost per run, the Actor stops cleanly at that limit, and with Only new jobs, jobs not yet output may appear in a later run if they are still listed and fit that run's filters and limits.

FAQ and limits

Why is the salary empty for most jobs?

Salary is filled only when the employer publishes a structured range in the ATS (common in US states with pay-transparency laws). The Actor never reads numbers out of the description text.

Why is remote null?

The ATS didn't say. Greenhouse and Personio have no remote field, so remote is true only when the location says "Remote", and null otherwise.

My company's careers page isn't recognised.

The board must be visible in the page's HTML: a link, an iframe, a script or an embed setting that points at one of the supported boards. Pages that load the board only after JavaScript runs, or that use an unsupported ATS (Workday, iCIMS, Taleo…), aren't recognised. Find the board URL (often the "View all jobs" link) and use it directly, or write it as ats:board. If a page links several boards, the one referenced most often is used.

Does the same board twice cost twice?

No. Each board is read once per run; repeats (for example the same company in two dataset items) are skipped.

Other limits

  • Up to 10,000 jobs are read per board.
  • Descriptions are cut at 200,000 characters.
  • SmartRecruiters needs one extra request per job for descriptions, which makes runs with Include job descriptions slower on big SmartRecruiters boards.
  • Rows within a board are newest first when the ATS gives a publish date.
  • Some vendors (Lever in particular) don't publish a company display name, so company is the board name there.
ActorUse it to
Send Email Report & Slack, Discord, Teams, Telegram AlertsGet the new jobs as an email or chat message after each run.
Google Sheets SyncAppend the jobs to a Google Sheet.
Merge & Deduplicate DatasetsMerge jobs from several runs or sources and remove duplicates.
Dataset Filter & TransformFilter jobs by any column, or rename and drop columns before export.
Website Contact Info ScraperFind the published emails, phones and social profiles of the hiring companies.
Domain WHOIS & DNS LookupAdd company domain age and email provider to your account list.