Greenhouse, Lever & Ashby Jobs API with New-Job Alerts
Pricing
from $1.50 / 1,000 jobs
Greenhouse, Lever & Ashby Jobs API with New-Job Alerts
Job postings API for company career sites on Greenhouse, Lever, Ashby, Workable and SmartRecruiters. Give it a company name or domain. You get normalised location, country and salary, a country filter, and alerts for new and removed jobs between runs.
Pricing
from $1.50 / 1,000 jobs
Rating
0.0
(0)
Developer
fikri marhan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 hours ago
Last modified
Categories
Share
Get every open job straight from company career sites, plus alerts when jobs are added or removed. Give it company names, domains or job-board links. It finds the company's applicant tracking system (ATS) and returns clean, normalised job data from the platform's official public job-board API. No login, cookies or proxies are needed.
Supported platforms: Greenhouse, Lever, Ashby, Workable, SmartRecruiters.
Use cases
- Hiring signals and lead generation: see which companies are hiring, for which roles and in which countries.
- Job boards and aggregators: a fresh, structured feed from hundreds of company career pages.
- Recruiting and talent intelligence: track competitors' openings, departments and pay ranges.
- Job alerts: schedule it daily in "Only new jobs" mode and send the new postings to Slack, email or Google Sheets.
- Job market research by country: for example, all tech roles in Malaysia, Singapore or Indonesia from top employers.
One job postings API for five job board platforms
Greenhouse, Lever, Ashby, Workable and SmartRecruiters each have their own public job board API with different fields, pagination and URL schemes. This Actor calls each official public job board API (for example the Greenhouse Job Board API and the Lever Postings API) and returns one consistent schema. You don't need an API key, and it doesn't scrape HTML.
Features
- Auto-detection: give it
notion.soand it checks the company's careers page for its ATS. Or give it a slug likestripeand it probes each platform in turn. - Normalised locations: city, ISO country code, country name, all countries for multi-location jobs, regions (EMEA, APAC, LATAM…) and a remote flag.
- Normalised salary: min, max, currency and interval (year/month/hour). It uses the structured pay data from Ashby and Lever when present, and otherwise conservatively parses pay ranges from the description.
- Country filter:
MY,SG,United States… with optional "remote, no country". - Change monitoring: each job is marked
new,existingorremovedsince your last run (state is kept in a named key-value store). Modes: all jobs, only new jobs, or changes (new + removed). - Privacy-friendly: no recruiter or hiring-manager names are collected, and emails and phone numbers are removed from descriptions.
- Polite: requests to each host are spaced out, with retries and backoff that respect
Retry-After. When detecting from a domain it fetches at most three pages and respectsrobots.txt.
Input examples
Track all Singapore and Malaysia jobs at a few companies:
{ "companies": ["stripe", "openai", "smartrecruiters:BoschGroup"], "countries": ["SG", "MY"] }
Daily alert of new engineering jobs only:
{ "companies": ["notion.so", "lever:spotify", "huggingface"], "titleKeywords": ["engineer"], "outputMode": "newOnly", "baselineFirstRun": true, "monitorId": "eng-watch" }
Output example
{"platform": "ashby", "companySlug": "openai", "companyName": "Openai", "jobId": "b71906c2-...","title": "Quality Engineer, Rack Infrastructure & Site Operations", "department": "Scaling","workplaceType": "hybrid", "isRemote": false, "location": "Singapore", "city": "Singapore","countryCode": "SG", "countryName": "Singapore", "countryCodes": ["SG"],"salaryMin": 171000, "salaryMax": 345000, "salaryCurrency": "SGD", "salaryInterval": "YEAR", "salarySource": "structured","postedAt": "2026-09-09T18:22:22.536Z", "url": "https://jobs.ashbyhq.com/openai/...", "changeType": "new", "firstSeenAt": "2026-10-22T14:00:00.000Z"}
You can download results as JSON, CSV or Excel, or read them through the API. The RUN_SUMMARY record in the run's key-value store shows per-company counts, error counts by code, warnings and the events charged. Inputs that couldn't be read appear as error records in the dataset (see Troubleshooting).
Need it as a REST API instead?
The same data is available as the ATS Jobs API on RapidAPI: https://rapidapi.com/fikrimarhan/api/ats-jobs-api4 (Greenhouse, Lever, Ashby, SmartRecruiters). Use it when you want live job lists from your own code with one HTTP request, instead of scheduled runs and datasets.
Pricing
Pay per event, with no extra platform-usage charges:
- $1.50 per 1,000 jobs (
job, $0.0015 per job written to the dataset) - $0.005 per company looked up (
company-lookup, charged once per company whose job board was actually read; inputs where no board is found are free)
Jobs removed by your filters, or by "Only new jobs" mode, are free. A daily alert on 50 companies that yields 20 new jobs costs about $0.28 per run. If you set a maximum cost per run, the actor stops cleanly at the limit and doesn't advance the monitor state for a board it couldn't deliver in full, so nothing is lost. Error records are never charged.
How do I find a company's Greenhouse, Lever or Ashby slug?
Open the company's careers page and click a job. The slug is in the job board URL:
boards.greenhouse.io/airbnborjob-boards.greenhouse.io/airbnb→greenhouse:airbnbjobs.lever.co/spotify→lever:spotifyjobs.ashbyhq.com/ramp→ashby:rampapply.workable.com/huggingface→workable:huggingfacejobs.smartrecruiters.com/BoschGroup→smartrecruiters:BoschGroup
You can also paste the full board URL or just the company's domain, and the Actor will find the board itself.
Tips
- Explicit
platform:sluginputs are the fastest and most reliable. Domain detection works when the careers page links to the ATS. - Use one Monitor ID per schedule, so each watch list remembers its own jobs.
- SmartRecruiters boards can be huge. Use Max jobs per company to cap them.
Is this legal?
The actor reads the same public, unauthenticated job-board APIs that companies' own careers pages use to show their openings. It collects job postings, not personal data. You're responsible for how you use and republish the data; please link back to the original posting.
Troubleshooting
One bad company never stops the run. Each problem becomes an error record in the dataset with isError: true, an errorCode, a plain-English errorMessage and the offending input. The Errors view shows these columns. Error records are free. Counts per code are in RUN_SUMMARY.
| Code | Meaning | What to do |
|---|---|---|
INVALID_INPUT | The input isn't a slug, platform:slug, board URL or domain, or another input field is invalid. | Fix the value named in the message. |
BOARD_NOT_FOUND | No public Greenhouse/Lever/Ashby/Workable/SmartRecruiters board was found (or only empty boards with that name). | Use the exact board URL or platform:slug. The company may use another ATS (e.g. Workday, which isn't supported). |
BOARD_NOT_PUBLIC | The board API refused access (HTTP 401/403). | The board is private or disabled. |
RATE_LIMITED | The platform kept returning HTTP 429 after retries. | Try later, or raise Delay between requests. |
UPSTREAM_ERROR | The platform returned a server error after retries. | Usually temporary. Re-run later. |
TIMEOUT / NETWORK_ERROR | The platform didn't respond. | Re-run later. |
UPSTREAM_SCHEMA_CHANGED | The platform's API no longer returns the expected fields. Also logged as a warning when only some jobs are affected; those jobs are skipped. | Please report it, so the parser can be updated. |
BOARD_EMPTY (warning) | The board exists but has no open jobs. | None. |
MAX_CHARGE_REACHED (warning) | Your maximum cost per run was reached; the remaining companies were skipped. | Raise the limit. |
NO_BOARDS_READ | None of the inputs could be read, so the run is marked failed. | See the error records for each input. |
INTERNAL_ERROR / FETCH_FAILED | An unexpected bug. | Please report it (see below). |
Found a bug or a wrong result? Open an Issue on this Actor's page in Apify Store (the Issues tab) and describe what you expected. Please paste the run URL into the issue: Apify then shares that run (log, input, dataset and RUN_SUMMARY) with the developer automatically, and only that run. Alternatively, enable Settings → Login & Privacy → Share run data with developers for this Actor. The Actor sends no telemetry anywhere; everything stays in your own run storage.