ATS Jobs Aggregator: Greenhouse, Lever, Ashby + 3 more avatar

ATS Jobs Aggregator: Greenhouse, Lever, Ashby + 3 more

Pricing

from $2.00 / 1,000 job postings

Go to Apify Store
ATS Jobs Aggregator: Greenhouse, Lever, Ashby + 3 more

ATS Jobs Aggregator: Greenhouse, Lever, Ashby + 3 more

Returns every open job from company career pages hosted on Greenhouse, Lever, Ashby, Recruitee, Personio or Workable as one clean, normalized dataset. Give it career-page URLs, get title, location, department, salary, dates and description per job. No browser, no login.

Pricing

from $2.00 / 1,000 job postings

Rating

0.0

(0)

Developer

Akshay Irudayaraj

Akshay Irudayaraj

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

ATS Jobs Aggregator

Pull every open job from company career pages hosted on Greenhouse, Lever, Ashby, Recruitee, Personio or Workable into one normalized dataset. Paste the career-page URLs, run, and get a clean table of jobs with title, location, department, employment type, salary (when the ATS exposes it), publish date and the full description.

It talks only to the public job-board APIs those ATS vendors publish for embedding career pages, so it is fast, cheap and does not break when a company restyles its careers site. No browser, no proxies, no login.

What you get

One dataset row per job:

{
"ats": "greenhouse",
"board": "stripe",
"companyName": "Stripe",
"jobId": "8172487",
"title": "Abuse Investigator",
"url": "https://stripe.com/jobs/search?gh_jid=8172487",
"applyUrl": "https://stripe.com/jobs/search?gh_jid=8172487",
"location": "Dublin",
"locations": ["Dublin"],
"remote": null,
"workplaceType": null,
"department": "8611 Security Analytics",
"team": null,
"employmentType": null,
"publishedAt": "2026-09-03T13:30:34-04:00",
"updatedAt": "2026-10-22T09:16:14-04:00",
"salary": null,
"descriptionText": "Who we are ...",
"descriptionHtml": "<div>...</div>",
"scrapedAt": "2026-10-22T19:04:11.512345+00:00"
}

Fields that an ATS does not expose are null rather than missing, so the columns are the same for every board.

Input

FieldTypeNotes
boardsarray of stringsCareer-page URLs or ats:slug. Recognised: boards.greenhouse.io/<slug>, job-boards.greenhouse.io/<slug>, jobs.lever.co/<slug>, jobs.ashbyhq.com/<slug>, <slug>.recruitee.com, <slug>.jobs.personio.de, apply.workable.com/<slug>. A bare slug such as stripe is probed against every ATS.
keywordsarray of stringsKeep jobs whose title contains any keyword (case-insensitive).
locationFilterstringKeep jobs whose location contains this text.
remoteOnlybooleanKeep remote jobs only.
postedAfterYYYY-MM-DDDrop jobs published before this date.
includeDescriptionbooleanInclude HTML and plain-text description (default on).
maxJobsPerBoardintegerCap per board after filters (default 500, 0 = unlimited).
maxJobsintegerCap for the whole run (0 = unlimited).

Example:

{
"boards": ["https://boards.greenhouse.io/stripe", "https://jobs.lever.co/palantir", "ashby:openai"],
"keywords": ["engineer", "developer"],
"remoteOnly": true,
"maxJobs": 200
}

Boards that cannot be read (wrong slug, board switched off) are listed in the ERRORS record of the run's key-value store and the run continues with the other boards. The run fails only if every board failed.

Pricing

Pay per event: $0.002 per job saved to the dataset ($2 per 1,000 jobs), plus Apify's standard Actor start fee. You pay only for jobs that match your filters and were written to the dataset. Boards that fail cost nothing. Set Maximum total charge on the run to cap spend; the Actor stops cleanly when it is reached.

Rough examples: three mid-size boards (~300 jobs) ≈ $0.60. A watch-list of 50 company boards checked daily with postedAfter set to yesterday usually costs a few cents per run.

Use cases

  • Recruiting / sourcing: watch competitors' career pages and get new roles the morning they appear (schedule the Actor, set postedAfter).
  • Job boards and aggregators: feed a niche job board without maintaining six scrapers.
  • Sales intelligence: hiring is a buying signal; filter titles by keywords such as SDR, Salesforce, Kubernetes.
  • Market research: salary bands (Ashby, Lever, Recruitee publish them), remote-vs-onsite mix, department growth.
  • AI agents: array input, flat output and PPE pricing make this a drop-in tool via the Apify MCP server.

How it works

For each board the Actor calls the vendor's public job-board endpoint (boards-api.greenhouse.io, api.lever.co/v0/postings, api.ashbyhq.com/posting-api, <slug>.recruitee.com/api/offers, <slug>.jobs.personio.de/xml, www.workable.com/api/accounts). These are the same endpoints the vendors document for embedding a company's jobs on its own website. Requests are rate-limited to one per second per host with retries and back-off.

Not supported on purpose: SmartRecruiters (its API host disallows crawlers in robots.txt), Workday and custom career sites (they require a browser). Jobs are company data, not personal data; no applicant or recruiter information is collected.

FAQ

A company's career page is on its own domain, how do I find the slug? Open a job and look at the apply link: boards.greenhouse.io/<slug>/jobs/..., jobs.lever.co/<slug>/..., jobs.ashbyhq.com/<slug>/..., <slug>.recruitee.com, <slug>.jobs.personio.de, apply.workable.com/<slug>/. Or just pass the bare slug and let the Actor probe.

Why is publishedAt missing for some boards? Workable and Greenhouse expose it; Personio exposes createdAt; Ashby, Lever and Recruitee expose it for most but not all jobs.

Can I run it on a schedule? Yes. Combine a daily schedule with postedAfter and a webhook or the Apify integrations (Slack, Google Sheets, Make, Zapier, n8n).

Something looks wrong. Open an issue on the Actor's Issues tab with the board URL; I usually answer within a day.