Company Jobs API: Greenhouse, Lever, Ashby & more
Pricing
from $2.00 / 1,000 job results
Company Jobs API: Greenhouse, Lever, Ashby & more
Pull every open job from company career boards on Greenhouse, Lever, Ashby, SmartRecruiters, Workable and Workday in one normalized schema (salary, remote, location parts). Auto-detects the ATS from a careers URL or domain. Delta mode flags new and closed jobs. By Steadyline Data.
Pricing
from $2.00 / 1,000 job results
Rating
0.0
(0)
Developer
Steadyline Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Company Jobs API: Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Workday — one schema, delta mode
Get every open job from any company's career site as clean, normalized JSON — one schema across six applicant tracking systems, with a delta mode that tells you exactly what is new, changed, or closed since your last run.
Give it a list of companies (board URLs, careers-page URLs, domains or just slugs). The Actor detects which ATS each company uses, reads the employer's official public job-board API, and returns one consistent record per job: title, department, location split into city/region/country, remote flag, employment type, salary range, description, apply URL and dates. No browser, no login, no proxies needed — so runs are fast and cheap.
Built and maintained by Steadyline Data.
Why use it
- One schema for six ATSs. Stop writing six parsers. Greenhouse, Lever, Ashby, SmartRecruiters, Workable and Workday all come out in the same shape.
- Delta mode for scheduled runs. Run it daily; get only new and updated jobs plus closure notices. Unchanged jobs are billed at a quarter of the price and not repeated in your dataset.
- Salary where it exists. Structured pay ranges from Greenhouse pay transparency, Ashby compensation and Lever salary ranges; optional extraction from description text for the rest (
salarySourcetells you which). - Auto-detection. Paste
figma.comorhttps://www.notion.so/careersand the Actor finds the board for you. - Up to ~6× cheaper than per-job alternatives at $0.012/job: here it is $0.002 per job, $0.0005 per unchanged job.
Supported ATSs
| ATS | Input examples | Source endpoint (public) | Tested with |
|---|---|---|---|
| Greenhouse | https://boards.greenhouse.io/figma, greenhouse:discord | Job Board API (boards-api.greenhouse.io) | Figma, Discord, Stripe, Airbnb |
| Lever | https://jobs.lever.co/spotify, lever:palantir | Postings API (api.lever.co, EU fallback) | Spotify, Palantir |
| Ashby | https://jobs.ashbyhq.com/ramp, ashby:notion | Posting API (api.ashbyhq.com) | Ramp, Notion |
| SmartRecruiters | https://jobs.smartrecruiters.com/Canva, smartrecruiters:BoschGroup | Posting API (api.smartrecruiters.com) | Canva, Bosch |
| Workable | https://apply.workable.com/huggingface, workable:skroutz | Public widget API (apply.workable.com) | Hugging Face, Skroutz |
| Workday | https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite | Career-site JSON (/wday/cxs/…) | NVIDIA, Salesforce, Workday |
Each entry can be a board URL, a single job URL, a company careers page, a bare domain, ats:slug, or a plain slug (probed across the slug-based ATSs). Prefix a label with | to set the company name: Acme Inc | lever:acme. Workday short form: workday:tenant.wdN/SiteName.
Input example
{"companies": ["https://boards.greenhouse.io/figma","lever:spotify","ramp.com","https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],"keywords": ["engineer", "data scientist"],"locations": ["US", "Remote"],"postedWithinDays": 30,"maxJobs": 1000,"deltaMode": true}
Filters: keywords (title/department/team, whole word, plurals allowed), excludeKeywords, locations (text or 2-letter country code, or Remote), remoteOnly, postedWithinDays, employmentTypes. Limits: maxJobs (whole run) and maxJobsPerCompany. Output toggles: includeDescriptionText, includeDescriptionHtml, extractSalaryFromText, fetchDetails.
Output sample
A real record from a test run (description shortened):
{"id": "ashby:ramp:34413f8d-26bf-4bbc-8ade-eb309a0e2245","ats": "ashby","company": "Ramp","companySlug": "ramp","sourceJobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245","title": "Security Engineer, Cloud","department": "Engineering","team": "Backend","location": "New York, NY (HQ)","locationCity": "New York City","locationRegion": "NY","locationCountry": "US","allLocations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],"isRemote": false,"workplaceType": "hybrid","employmentType": "full-time","salaryMin": 211400,"salaryMax": 290600,"salaryCurrency": "USD","salaryPeriod": "year","salarySource": "structured","descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams, embedded in the transaction flow of every dollar a business spends. We automate how over $275B in annualized spend flows in and out of 85,000+ companies: authorizing p…","descriptionHtml": null,"applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application","jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245","postedAt": "2026-04-07T17:12:35.753Z","postedAtApproximate": false,"updatedAt": null,"changeType": null,"isNew": null,"closed": false,"firstSeenAt": null,"scrapedAt": "2026-10-29T22:29:27.674Z"}
changeType, isNew and firstSeenAt are filled when delta mode is on. postedAtApproximate is true when the ATS only says something like "Posted 3 Days Ago". A per-run RUN_SUMMARY (per-company status, counts and any errors) is saved in the run's key-value store.
Pricing — cost per 1,000 jobs
Pay per event, no subscription:
| Event | Price | Per 1,000 |
|---|---|---|
| Job result (new/updated job, or every job with delta off) | $0.002 | $2.00 |
| Unchanged job (delta mode) | $0.0005 | $0.50 |
| Actor start (Apify standard) | $0.00005 per run | — |
Example: tracking 50 companies with 5,000 open roles daily. The first run costs about $10. After that, a typical day with 250 new or changed jobs and 4,750 unchanged costs about $0.50 + $2.38 = ~$2.88. Closed-job notices are free. Failed requests are never charged, and the Actor stops cleanly when your maximum cost per run is reached.
How delta mode works
With deltaMode: true the Actor keeps a small state file in a named key-value store (steadyline-ats-jobs-delta), keyed by your company list and filters (or by your own deltaStateKey). Each job gets a fingerprint of its content (title, team, locations, pay, apply URL, description). On the next run:
- new — not seen before → emitted,
isNew: true - updated — content changed → emitted,
isNew: false - unchanged — not emitted (or emitted with
deltaOutput: "all"), billed at the unchanged rate - closed — gone from the board → emitted once with
closed: true(free; turn off withemitClosed: false)
Closures are only reported for companies that were read completely, so a timeout or a maxJobs cap never produces false "closed" jobs. For Workday and SmartRecruiters the Actor compares the cheap listing data first and skips detail requests for unchanged jobs, so delta runs are faster too.
FAQ
Do I need proxies or an account with the ATS? No. Every source is the employer's public job-board endpoint, the same data the careers page shows anonymously. Proxy settings are available but optional.
My company was not detected. Paste the job board URL itself (open any job on their site and copy the link) or use ats:slug. Custom career sites that don't use one of the six ATSs are not supported.
Why is a salary missing? Many employers don't publish pay. Structured fields are used first; with extractSalaryFromText (on by default) the Actor also reads pay ranges written in the description.
Can I get the HTML description? Yes, set includeDescriptionHtml: true.
How do I run it on a schedule? Create an Apify Schedule with delta mode on and connect a webhook or integration (Slack, Google Sheets, Make, Zapier) to the dataset.
Legal and data note
This Actor collects only publicly posted job advertisements from employers' official public job-board endpoints — information companies publish so that candidates can find and apply to their jobs. It does not log in, bypass access controls, or collect personal data: recruiter or hiring-manager names and contact details are never extracted, and e-mail addresses found in job descriptions are redacted. You are responsible for using the data in line with applicable laws and the terms of the respective sites. Job content remains the property of the posting employer.