Job Postings Scraper & API - Greenhouse, Lever, Ashby + more
Pricing
from $3.00 / 1,000 job postings
Job Postings Scraper & API - Greenhouse, Lever, Ashby + more
Scrape job postings from any company career page running Greenhouse, Lever, Ashby, Workable or SmartRecruiters. One unified JSON schema, keyword, location and remote filters, full descriptions. Monitor mode turns it into hiring alerts: only new and closed roles. Official ATS APIs, no login.
Pricing
from $3.00 / 1,000 job postings
Rating
0.0
(0)
Developer
Pasquale Nirta
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Job Postings API: Greenhouse, Lever, Ashby, Workable and SmartRecruiters scraper
Give this Actor a list of companies and it returns every open role from their career boards in one consistent JSON format. It covers the five most common applicant tracking systems (Greenhouse, Lever, Ashby, Workable and SmartRecruiters), works out which one each company uses, and reads the ATS's official public job board API rather than scraping HTML. No headless browser, no login, and results don't break when a careers page gets redesigned.
What people use it for
- Recruiting and talent research: track who is hiring for what, where, week over week.
- Lead generation: a company hiring a "Head of RevOps" or a "Salesforce Administrator" is a buying signal.
- Job boards and aggregators: structured postings, deduplicated and normalized across five ATSs.
- Market research: headcount direction, new teams forming, expansion into new cities.
- AI agents: the schema is easy for LLMs to consume, and the Actor can be called through Apify's MCP server from Claude, Cursor and similar tools.
Input
{"companies": ["greenhouse:stripe", "lever:palantir", "ashby:ramp", "gitlab"],"keywords": ["engineer", "data"],"locations": ["london", "remote"],"remoteOnly": false,"includeDescription": true,"maxJobsPerCompany": 500}
companies entries can be:
| Format | Example |
|---|---|
| Bare slug (ATS detected automatically) | stripe |
Explicit ats:slug | greenhouse:stripe, lever:palantir, ashby:ramp, workable:blueground, smartrecruiters:boschgroup |
| Full board URL | https://boards.greenhouse.io/stripe, https://jobs.lever.co/palantir |
The filters are optional. keywords match against the job title (any match keeps the job), locations match against all of the job's locations, and remoteOnly keeps only remote roles.
Output
One dataset row per job, same shape whatever the source ATS:
{"id": "greenhouse:stripe:6912385","ats": "greenhouse","company": "Stripe","companySlug": "stripe","title": "Backend Engineer, Payments","department": "Engineering","team": null,"location": "London, UK","allLocations": ["London, UK", "Dublin, Ireland"],"remote": false,"workplaceType": "hybrid","employmentType": "Full-time","url": "https://stripe.com/jobs/listing/...","applyUrl": "https://stripe.com/jobs/listing/.../apply","publishedAt": "2026-06-02T09:14:00.000Z","updatedAt": "2026-07-15T11:30:00.000Z","compensation": "£85K – £120K","descriptionHtml": "<p>…</p>","descriptionText": "…"}
Export as JSON, CSV, Excel or RSS, or read the dataset through the Apify API from your own code.
Monitor mode: only what changed
Turn on monitorMode and the Actor remembers the previous run, then outputs only the difference:
changeType: "new"for postings that appeared since last run (withfirstSeenAt)changeType: "closed"for postings that disappeared (withclosedAt)
Put it on a daily Schedule and wire the dataset to Slack, email or a webhook through Apify integrations, and you have hiring alerts for any list of companies: "tell me when any of these 50 companies posts a sales engineer role" or "alert me when a competitor closes a position". The first run reports all current jobs as new to set the baseline. Use a different monitorId per Schedule if you monitor several company sets. You pay only for changed rows, and a temporary ATS outage never gets misreported as closed jobs.
Use from AI agents
This Actor works out of the box with AI agents through Apify's MCP server. Connect an agent (Claude, Cursor, or anything MCP-compatible) to Apify and it can call apeye/job-postings-api directly: ask "which of these companies are hiring backend engineers in Europe right now?" and the agent picks the input, runs the Actor and reads the dataset. The unified schema and stable IDs are designed to be easy for models to consume.
Pricing
You pay per event: a small fee when a run starts, then a fee per job in your results. Jobs removed by your filters are not charged.
| Event | When it's charged |
|---|---|
| Actor start | Once per run |
| Job scraped | Per job row in your results, after filters |
FAQ
Is this legal? Yes. The Actor reads official, publicly documented job board APIs, the same endpoints that power each company's own careers page. Companies publish these precisely so their jobs can be listed elsewhere. No personal data is collected, only public job postings.
How do I find a company's board slug? Open the company's careers page and look at a job listing's URL: boards.greenhouse.io/<slug>, jobs.lever.co/<slug>, jobs.ashbyhq.com/<slug>, apply.workable.com/<slug> or careers.smartrecruiters.com/<Company>. You can paste that URL straight in as the company entry, or just pass the company name and let detection try all five ATSs.
What if a company isn't on any of these five ATSs? The run logs a warning for that entry and carries on with the rest. You aren't charged for boards that can't be found.
Why are descriptions slower for some companies? Greenhouse, Lever and Ashby return descriptions in bulk. Workable and SmartRecruiters need one extra request per job, so those boards take longer when includeDescription is on (capped at 300 description fetches per company).
Support
If you hit a bug or want another ATS added (Recruitee, Personio, BambooHR), open an issue on the Issues tab. I check most days and usually reply within a day or two.