Career Site Jobs API: Greenhouse, Lever & Ashby
Pricing
from $0.90 / 1,000 job results
Career Site Jobs API: Greenhouse, Lever & Ashby
Search over 200,000 open jobs from about 6,900 company career sites on Greenhouse, Ashby and Recruitee in one run, plus live Lever and Workable boards for companies you list. Fuzzy title match, salary, seniority and remote filters. $0.90 per 1,000 jobs; daily-feed repeats and closed jobs are free.
Pricing
from $0.90 / 1,000 job results
Rating
0.0
(0)
Developer
Plainsource
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 hours ago
Last modified
Categories
Share
Career Site Jobs API returns open jobs straight from the public job boards that companies use on their career sites: Greenhouse jobs, Lever jobs, Ashby, Workable and Recruitee. Search a daily snapshot of about 210,000 open Greenhouse, Ashby and Recruitee jobs on about 6,900 company boards in one run, or list companies and fetch their boards live, which is the only way to include Lever and Workable.
Each row is one job with its title, company, location, remote or hybrid flag, salary when the employer publishes it, seniority, posting date and apply link. It suits recruiters, sourcers, job-board and newsletter builders, and anyone who wants a jobs API for specific companies without visiting each careers page. Nothing is scraped from LinkedIn or Indeed, and there is no login or proxy involved.
What data can Career Site Jobs API extract?
| Field | Notes |
|---|---|
id | Stable id in the form ats:company:jobId. Use it to join runs. |
ats, company, companyId | The platform, the company name and its board id on that platform. |
title, department, team, employmentType | As published. Some fields are empty on some platforms. |
workplaceType | remote, hybrid, onsite, or null when the employer did not say. |
location, locations, countryCode | Primary location, plus every location after duplicate merging. |
salary | { min, max, currency, period, text } or null. Ashby and Lever often publish it, Greenhouse rarely. |
seniority | intern, entry, mid, senior, lead, manager, director or executive, worked out from the title. mid means no level word was found. |
postedAt, updatedAt | ISO dates from the platform. Lever and Workable do not publish update times. |
url, applyUrl, otherUrls | Job page, application page, and the URLs of merged duplicates. |
duplicateGroupId | The same value for the same company and title. |
changeStatus | new, updated or closed in daily feed mode, otherwise null. |
description | Plain text, only when Include full description is on. |
scrapedAt | When the run produced the row. |
How to use Career Site Jobs API
- Open the Actor on Apify and click Try for free.
- Under Job title keywords, enter the roles you want, for example
data engineer. Word order does not matter: "senior data engineer" matches "Data Engineer, Senior". - Add filters if you need them: Locations (a city,
remoteor a two-letter country code), Workplace type, Posted within (days), Seniority, Only jobs with salary info. - Leave Companies empty to search the whole snapshot, or paste career-site URLs,
ats:idpairs such asgreenhouse:stripe, or plain board ids to search only those companies live. - Set Max results and click Start. The newest jobs come first.
- For a daily feed, turn on Only new or changed jobs, keep the same State key, and put the run on a schedule.
How much does it cost to use the jobs API?
You pay per event.
| Event | Price |
|---|---|
| Actor start | $0.001 per GB of run memory (the default is 512 MB, so $0.001 per run) |
| Job result | $0.0009 per open job returned |
Closed-job rows are free, and in daily feed mode jobs you already received are not returned or charged again.
Worked examples, from the prices above:
- 1,000 jobs in one run: $0.001 + 1,000 x $0.0009 = $0.901.
- 200 remote data jobs posted this week: $0.001 + 200 x $0.0009 = $0.181.
- The prefilled example below returned 22 jobs: $0.001 + 22 x $0.0009 = $0.0208.
If you set a maximum cost per run, the run stops adding results when it is reached.
Input
Three searches you can paste into the JSON input tab. The first is the Actor's prefilled example (it returned 22 jobs on 2026-10-28):
{"keywords": ["software engineer"],"postedWithinDays": 30,"companies": ["https://boards.greenhouse.io/airbnb", "lever:palantir", "ashby:ramp"],"maxItems": 50}
Remote data and analytics engineering jobs posted this week:
{ "keywords": ["data engineer", "analytics engineer"], "workplaceTypes": ["remote"], "postedWithinDays": 7, "maxItems": 200 }
A daily feed of new roles at a fixed list of companies (repeat jobs are not charged):
{ "companies": ["greenhouse:airbnb", "lever:palantir", "ashby:ramp", "workable:huggingface"], "onlyNew": true, "reportClosed": true, "stateKey": "my-companies" }
A company can be given as a board URL, as ats:id (greenhouse:stripe), or as a bare id (stripe). Bare ids are looked up in the index and then tried on every platform. If nothing is found, the run log and the SUMMARY record say so.
Other filters: excludeKeywords, ats (limit to some platforms), exactMatch, dedupe (on by default), descriptionKeywords (the description must mention one of the phrases; this refetches the matching boards live, so keep the title keywords specific) and includeDescription.
Output
This is a real row from the prefilled run on 2026-10-28. The salary.text field (the salary as the employer wrote it) is left out here.
{"id": "ashby:ramp:29a5da77-37f0-402a-92bc-072778e77ed8","ats": "ashby","companyId": "ramp","company": "Ramp","title": "Software Engineer, Forward Deployed","department": "Engineering","team": "Engineering","employmentType": "FullTime","workplaceType": "hybrid","location": "New York, NY (HQ)","locations": ["New York, NY (HQ)","San Francisco, CA"],"countryCode": "US","salary": {"min": 168000,"max": 285000,"currency": "USD","period": "year"},"postedAt": "2026-10-22T19:20:16.077Z","updatedAt": null,"url": "https://jobs.ashbyhq.com/ramp/29a5da77-37f0-402a-92bc-072778e77ed8","applyUrl": "https://jobs.ashbyhq.com/ramp/29a5da77-37f0-402a-92bc-072778e77ed8/application","seniority": "mid","duplicateGroupId": "938d10d16b1a","changeStatus": null,"scrapedAt": "2026-10-28T21:59:11.886Z"}
Every run also writes a SUMMARY record to its key-value store with the source used (snapshot or live), the number of jobs scanned and matched, and warnings such as a board that was not found.
What people use a jobs API for
- Sourcing and hiring signals: which companies are hiring for a role right now, and where.
- A daily feed of new roles for a niche job board or newsletter.
- Salary research, using the
hasSalaryfilter to keep only postings that publish pay. - Tracking a list of target companies, including closed roles.
- Entry-level and intern searches, using the seniority filter.
FAQ
Which job boards are covered?
Greenhouse, Lever, Ashby, Workable and Recruitee. Companies on Workday, iCIMS, SmartRecruiters, Taleo, SuccessFactors or their own systems are not covered. SmartRecruiters is left out on purpose, because its API host's robots.txt only allows LinkedIn's crawler.
Why are Lever and Workable only searched when I list companies?
Their APIs are slow to sweep (Lever asks for one request per second, Workable answers bursts with errors), so they are not in the daily snapshot. Add the companies you want to Companies and they are fetched live. A list of 100 Lever or Workable companies takes a couple of minutes.
How fresh is the data?
With a company list, every board is fetched live during your run. Without one, the results come from a snapshot that a companion Actor rebuilds once a day at 06:00 UTC, so a job posted this morning may show up the next day. Descriptions are always fetched live, because the snapshot does not carry them.
What if a company is missing?
The index is the set of boards discovered so far, not every company. Add the company to Companies and it is fetched live.
How accurate is the seniority field?
It is a guess from the title. A title like "Engineer II" lands in mid.
How do I get only new jobs every day?
Turn on Only new or changed jobs, use the same State key every time, and schedule the Actor in Apify Console. Add Report closed jobs to also get rows marked closed. The Actor keeps its memory in a key-value store named ats-jobs-state in your account.
How do I use it with the API, Make, Zapier or n8n?
Call it with the Apify API or client, for example client.actor("fernandosord/career-site-jobs").call({ keywords: ["data engineer"], maxItems: 100 }). In Make, Zapier or n8n, use the Apify integration to run the Actor and read its dataset. A common setup is a daily schedule with Only new or changed jobs turned on, sending results to Google Sheets, Slack or a webhook.
Can an AI agent use it?
Yes. Add the Actor to the Apify MCP server (https://mcp.apify.com). The agent sees the input schema, so it can search jobs by title, location and salary.
Is it allowed?
The Actor reads job postings that employers publish for wide distribution, through documented public endpoints. It does not log in, use proxies or bypass anything. Lever is fetched at one request per second, as its robots.txt asks. If you are an employer and want your board removed from the index, open an issue on the Issues tab and it will be removed within 14 days.
Other Actors by this developer
- Website Change Monitor: watch a company's careers page and get the lines or links that changed.
- Open Places Business Leads: business lists by city or country from open data, with phone, website and email.
- SEC EDGAR API: filings, financials and insider trades for public companies you are researching.
- Website Tech Stack Detector: a BuiltWith alternative that lists the technologies a site uses.
- WHOIS & DNS Lookup: domain age, SSL and email security for a list of domains.