Job Postings Scraper & API - Greenhouse, Lever, Ashby + more avatar

Job Postings Scraper & API - Greenhouse, Lever, Ashby + more

Pricing

from $3.00 / 1,000 job postings

Go to Apify Store
Job Postings Scraper & API - Greenhouse, Lever, Ashby + more

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

Pasquale Nirta

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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:

FormatExample
Bare slug (ATS detected automatically)stripe
Explicit ats:sluggreenhouse:stripe, lever:palantir, ashby:ramp, workable:blueground, smartrecruiters:boschgroup
Full board URLhttps://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 (with firstSeenAt)
  • changeType: "closed" for postings that disappeared (with closedAt)

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.

EventWhen it's charged
Actor startOnce per run
Job scrapedPer 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.