Career Site Jobs API: Greenhouse, Lever, Ashby, Workday
Pricing
$2.00 / 1,000 jobs
Career Site Jobs API: Greenhouse, Lever, Ashby, Workday
Jobs straight from company career sites: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Personio, Teamtailor, Workable, BambooHR. Search 30,000 companies or fetch your own list. Normalized location, salary, remote, dates, apply link. $2 per 1,000 jobs.
Pricing
$2.00 / 1,000 jobs
Rating
0.0
(0)
Developer
Prague Data Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Jobs straight from company career sites (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Personio, Teamtailor, Workable, BambooHR), one normalized row per job: title, company, locations with country codes, remote/hybrid, employment type, salary, posting date, apply link and full description. Same data as career-site listing APIs, from $2 per 1,000 jobs.
{ "companies": ["airbnb", "spotify", "ramp", "BoschGroup", "bunq"], "maxItems": 100 }
Or search about 30,000 companies at once, without listing them:
{ "titleSearch": ["Data Engineer"], "locationSearch": ["Germany"], "timeRange": "7d", "limit": 200 }
One output row:
{"jobId": "8184174","ats": "greenhouse","company": "Airbnb","companySlug": "airbnb","title": "Account Manager","department": "Business Development","team": null,"employmentType": null,"employmentTypeRaw": null,"workplaceType": "HYBRID","locations": ["London, United Kingdom"],"city": "London","region": "England","country": "GB","countries": ["GB"],"salaryMin": 46000,"salaryMax": 54000,"salaryCurrency": "GBP","salaryPeriod": "YEAR","salaryText": null,"postedAt": "2026-09-09T08:35:19.000Z","updatedAt": "2026-09-30T00:00:54.000Z","applyUrl": "https://careers.airbnb.com/positions/8184174?gh_jid=8184174","jobUrl": "https://careers.airbnb.com/positions/8184174?gh_jid=8184174","careerSiteUrl": "https://job-boards.greenhouse.io/airbnb","companyDomain": null,"descriptionText": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, and has since grown to over 5 …","descriptionHtml": null,"scrapedAt": "2026-10-19T13:42:18.874Z"}
Compatible with the input of fantastic-jobs/career-site-job-listing-api
Switching takes one change: the Actor ID. This Actor accepts the same input fields with the same values: timeRange (1h, 24h, 7d, 6m), limit, titleSearch, titleExclusionSearch, locationSearch, locationExclusionSearch, descriptionSearch, descriptionExclusionSearch, organizationSearch, organizationExclusionSearch, domainFilter, domainExclusionFilter, descriptionType, ats, atsExclusionFilter, aiEmploymentTypeFilter, aiWorkArrangementFilter, hasSalary, aiHasSalary, datePostedAfter, hasNoLocation and remote only (legacy). Search terms work the same way: phrases on word boundaries, :* for a prefix (Soft:*), locations as City, Region, Country in English (London, England, United Kingdom, New York, New York, United States) or just a country or a city.
When the input uses those field names, the defaults are theirs too (limit 10, timeRange 7d) and each row also carries their output field names: id, date_posted, date_created, organization, organization_url, locations_alt, locations_derived, cities_derived, regions_derived, countries_derived, location_type, remote_derived, salary, employment_type, url, source (lever.co for Lever), source_type, source_domain, domain_derived, description_text, description_html, ai_salary_currency, ai_salary_min_value, ai_salary_max_value, ai_salary_unit_text, ai_employment_type, ai_work_arrangement. Set leaderFields to true or false to force them on or off.
Differences to know:
- 10 ATS, not 58.
atsvalues other than ours (for exampleicims,taleo) are accepted with a warning and match nothing. - AI and LinkedIn enrichment is not included.
aiExperienceLevelFilter,aiVisaSponsorshipFilter,aiTaxonomiesFilter,aiLanguageFilter,li*filters,includeCompanyDetails,includeLinkedInandremoveAgencyare accepted (the run does not fail) and ignored with a warning.ai_employment_type,ai_work_arrangementandai_salary_*come from the career site's own fields, not from a language model. timeRangecounts from the posting date (6m= 183 days), not from the date a job entered a database.locationsis a list of strings as the career site writes them (["London, United Kingdom"]), not schema.org Place objects. The normalized form is inlocations_derived.idis a string ("greenhouse-8184174"), unique per ATS and job.
What you get
| ATS | Companies in the built-in list | Typical career site |
|---|---|---|
| Greenhouse | 5,553 | job-boards.greenhouse.io/<company> |
| BambooHR | 7,568 | <company>.bamboohr.com/careers |
| Workday | 5,420 | <tenant>.wd5.myworkdayjobs.com/<site> |
| Workable | 2,555 | apply.workable.com/<company> |
| Ashby | 2,167 | jobs.ashbyhq.com/<company> |
| Lever | 1,998 | jobs.lever.co/<company> |
| SmartRecruiters | 1,550 | careers.smartrecruiters.com/<company> |
| Personio | 1,125 | <company>.jobs.personio.de |
| Teamtailor | 1,094 | <company>.teamtailor.com |
| Recruitee | 924 | <company>.recruitee.com |
Every company in the list was checked against the live ATS API and had at least one open job (October 2026): about 1.6 million open jobs in total. Any other company on these 10 ATS works too: give its name, its career-page URL or ats:slug.
All data comes from the public job-board APIs that the career sites themselves use. No login, no browser, no proxy. Recruiter names and contact details are never output.
Use cases
- Job boards and aggregators: fill a niche board (by country, remote, function or industry) with fresh jobs that link straight to the employer's application page.
- Sales and recruiting agencies: spot companies that are hiring for a role you serve (
titleSearch: ["Account Executive"],locationSearch: ["France"]), with the job page as the reason to reach out. - Market and salary research: collect published salary ranges (US pay-transparency states, UK, EU) by title, city and company.
- Job seekers and career coaches: watch your target companies every day and get only the new jobs (
postedWithinDays: 1). - AI agents: one call returns structured, deduplicated jobs with descriptions, ready for matching or summarizing.
Two ways to use it
Your own companies (live)
{"companies": ["Airbnb", "https://jobs.lever.co/spotify", "greenhouse:stripe", "workday:nvidia|wd5|NVIDIAExternalCareerSite"],"keywords": ["engineer"],"locations": ["Berlin", "Remote"],"postedWithinDays": 30,"maxItems": 500}
Each value can be a company name, an ATS slug (ats:slug), an ATS URL, or the company's own careers page (the Actor finds the embedded Greenhouse, Lever, Ashby... board). Names are matched against the built-in list first, then probed on every ATS. The DETECTION record of the run's key-value store shows which board was found for each value. Jobs are read live from the career site at run time, and maxItems is shared fairly between companies.
Search everything (job index)
Leave companies empty. The Actor searches its job index of every company in the list, refreshed daily, with your filters: titleSearch, locationSearch, organizationSearch, domainFilter, ats, employmentTypes, workplaceTypes, postedWithinDays or timeRange, hasSalary. Results come newest first. Workday, SmartRecruiters and BambooHR jobs are completed with a live call to the career site before they are saved, so their descriptions are current. If the index is not reachable, the Actor searches the built-in list live instead, largest companies first, for up to 210 seconds (maxRunSeconds).
Input
| Field | Type | Description |
|---|---|---|
companies | string[] | Company names, ats:slug, ATS URLs or career-page URLs. Empty = search the index. |
keywords | string[] | Any of these words or phrases in the title or description (:* for a prefix). |
locations | string[] | City, country or City, Region, Country, English or local names; Remote matches remote jobs. |
remoteOnly | boolean | Remote jobs only. |
workplaceTypes | string[] | ONSITE, HYBRID, REMOTE. |
employmentTypes | string[] | FULL_TIME, PART_TIME, CONTRACT, INTERNSHIP, TEMPORARY, OTHER. |
postedWithinDays | integer | Jobs posted in the last N days. |
ats | string[] | Only these ATS (greenhouse, lever or lever.co, ashby, smartrecruiters, workday, recruitee, personio, teamtailor, workable, bamboohr). |
includeDescription | boolean | Plain-text description (default true). |
includeDescriptionHtml | boolean | HTML description (default false). |
maxItems | integer | Maximum jobs (default 500; 10 for inputs written for the other API). |
maxJobsPerCompany | integer | Cap per career board. |
mode | string | auto (default), companies, search; indexer is reserved for the Actor owner. |
leaderFields | boolean | Force the compatibility output fields on or off. |
maxRunSeconds | integer | Stop fetching after this many seconds and keep what was found. |
indexStoreId | string | Use another job index (key-value store ID). |
Plus the compatibility fields listed above.
Output
| Field | Description |
|---|---|
jobId, ats, companySlug | Job ID in the ATS, the ATS, and the board ID (Workday: tenant|wdN|site). One row per ATS + board + job ID. |
company, title, department, team | As published by the career site. |
employmentType | FULL_TIME, PART_TIME, CONTRACT, INTERNSHIP, TEMPORARY or OTHER (intern and working-student titles override a generic "Full-time"). employmentTypeRaw keeps the original label. |
workplaceType | ONSITE, HYBRID, REMOTE, or null when the career site does not say. |
locations | Locations as written by the career site. |
city, region, country, countries | First location parsed, ISO-2 country codes of all locations. |
salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryText | Published salary (HOUR, DAY, WEEK, MONTH, YEAR). |
postedAt, updatedAt | ISO 8601 UTC (Workday: day precision). |
applyUrl, jobUrl, careerSiteUrl | Application link, job page, company career site. |
companyDomain | Company website domain, when the ATS publishes it. |
descriptionText, descriptionHtml | Full description. |
scrapedAt | When the job was read (the index build time in search mode). |
Compatibility fields (id, date_posted, organization, locations_derived, ...) are added as described above. The run's key-value store also holds SUMMARY (jobs per ATS and per company, failed boards, warnings).
Pricing
$0.002 per job ($2 per 1,000), charged only for jobs saved to the dataset, after deduplication. No platform usage on top. Set a maximum cost per run in the run options and the Actor stops cleanly when it is reached.
FAQ
How fresh is the data? In companies mode the jobs are read live at run time. In search mode they come from an index refreshed every day; jobs posted after the last refresh appear the next day, so use companies mode when you need the last hour.
Why is a description search slower? descriptionSearch, descriptionExclusionSearch and keywords read the full text of every job that passes the other filters, and SmartRecruiters and Workday give the text only job by job. Combine them with titleSearch, a location or a time range, as with other career-site APIs.
Why do some jobs have no salary or employment type? The Actor only outputs what the career site publishes. Greenhouse, Ashby, Lever, Teamtailor and Recruitee often publish salaries, most of all for jobs in US pay-transparency states; Workday and SmartRecruiters rarely do.
A company is not found. Pass its career-page URL or ats:slug (for example greenhouse:airbnb, lever:spotify, workday:nvidia|wd5|NVIDIAExternalCareerSite). If the company uses an ATS that is not supported yet, open an issue and tell us which one.
Is this legal? The Actor reads public job postings that companies publish so that anyone can apply, through the same public APIs their career sites use. It does not log in and does not output personal data.