Most companies publish their open roles through an applicant tracking system (ATS) such as Greenhouse, Lever or Ashby. Once you know which one and the company’s board name, its open jobs are one public request away. This page shows how to find both by hand, how to read the job count and posting dates yourself, and how to do it for a whole account list in one run.
A careers page tells you a company is hiring. The ATS behind it tells you how much: the job board has every open role with its department, location and the date it was published, usually in a public JSON feed. That’s what makes hiring usable as a signal:
Try /careers and /jobs on the company’s domain, or the Careers link in the footer. Then open any job or its Apply button and look at the address bar. Most ATSs host the board on their own domain, with the company’s board name (the “slug”) in the URL:
| The URL looks like | ATS |
boards.greenhouse.io/slug or job-boards.greenhouse.io/slug | Greenhouse |
|---|---|
jobs.lever.co/slug | Lever |
jobs.ashbyhq.com/slug | Ashby |
apply.workable.com/slug | Workable |
jobs.smartrecruiters.com/slug | SmartRecruiters |
slug.breezy.hr | Breezy HR |
slug.jobs.personio.de | Personio |
tenant.wdN.myworkdayjobs.com/site | Workday |
Enterprise systems such as iCIMS, Oracle Taleo and SAP SuccessFactors show up too, usually on their own vendor domains. Their boards have no simple public feed like the ones below, so this guide doesn’t cover them.
Many companies embed the board in their own site, so the address bar shows nothing useful. View the page source (Ctrl+U, or Cmd+Option+U on a Mac) and search for greenhouse, lever.co, ashbyhq, workable or myworkdayjobs. ramp.com/careers, for example, links each role to jobs.ashbyhq.com/ramp/…, so Ramp is on Ashby with the slug ramp.
Greenhouse, Lever and Ashby each publish a no-login JSON feed of a board’s open jobs, meant for companies to show jobs on their own sites. With the slug, one request tells you whether the company is hiring and how much:
# Greenhouse: total open jobs
curl -s https://boards-api.greenhouse.io/v1/boards/stripe/jobs | jq '.meta.total'
# Lever: the response is an array of postings
curl -s "https://api.lever.co/v0/postings/palantir?mode=json" | jq 'length'
# Ashby
curl -s https://api.ashbyhq.com/posting-api/job-board/ramp | jq '.jobs | length'
On 27 September 2026 those returned 702 (Stripe), 321 (Palantir) and 158 (Ramp). A slug that doesn’t exist returns HTTP 404 on all three. For “how fast”, each job carries a date: first_published on Greenhouse, createdAt on Lever (milliseconds since 1970) and publishedAt on Ashby. Count how many fall in the last 30 days and you have a posting rate.
Two traps. An empty board is not proof a company exists on that ATS: SmartRecruiters’ API answers any name, including made-up ones, with "totalFound":0. And a slug you guessed can belong to a different company with the same name; Greenhouse’s /v1/boards/slug (without /jobs) returns the board’s own company name, so check it.
By hand this is a few minutes per company. For a 300-account territory it’s a day, and most of that time goes on guessing slugs across ATSs. Hiring Signals does the steps above for every company in your list and returns one row per input. Put names, domains or explicit boards into Companies on the Apify Store page, or send JSON through the API:
{
"companies": ["stripe.com", "Ramp", "Palantir", "Hugging Face", "Apple"]
}
For each name or domain it tries likely slugs (Hugging Face becomes huggingface, hugging-face and hugging_face) on Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Breezy HR and Personio, keeps only boards with at least one open job, and compares the company name the board gives for itself with your input. Workday is never guessed: its URL has three parts that can’t be derived from a name, so pass it as workday:tenant:wdN:site from the careers URL. If you already know a board, pass it directly, e.g. greenhouse:stripe or lever:palantir.
| Input | ats | boardCompanyName | openJobs | postedLast30d | hiringScore | Top technologies |
| stripe.com | greenhouse | Stripe | 702 | 281 | 76 | SQL, Python, Java, Ruby, Salesforce |
|---|---|---|---|---|---|---|
| Ramp | ashby | Ramp | 158 | 60 | 68 | Python, Salesforce, NetSuite, SQL, LLMs |
| Palantir | lever | Palantir Technologies | 321 | 14 | 62 | Python, Java, JavaScript, C++, TypeScript |
| Hugging Face | workable | Hugging Face | 8 | 3 | 38 | Python, TypeScript, Rust, C++, AWS |
| Apple | found: false, not charged | |||||
All four matches came back with matchConfidence: "high". One row, trimmed (the full row also has departments, locations, seniority mix, up to 25 technologies and change tracking):
{
"company": "Ramp",
"found": true,
"ats": "ashby",
"slug": "ramp",
"boardUrl": "https://jobs.ashbyhq.com/ramp",
"boardCompanyName": "Ramp",
"matchConfidence": "high",
"openJobs": 158,
"postedLast7d": 19,
"postedLast30d": 60,
"postedLast90d": 115,
"hiringScore": 68,
"bulkRepublish": false,
"engineeringShare": 0.27,
"remoteShare": 0.09,
"topTechnologies": [
{ "name": "Python", "count": 29 },
{ "name": "Salesforce", "count": 26 },
{ "name": "NetSuite", "count": 24 }
]
}
And the Apple row (error text trimmed):
{
"company": "Apple",
"found": false,
"error": "No public job board with open jobs found on Greenhouse, Lever,
Ashby, Workable, SmartRecruiters, Breezy HR or Personio (Workday is
never guessed). ... Not charged."
}
The run cost $0.20: four company reports at $0.05, Apple free. Things worth noticing:
hiringScore (0–100) blends both: 60% volume, log-scaled so it tops out around 300 roles, and 40% the share of open roles posted in the last 30 days (a flagged bulk re-publish doesn’t count as fresh).Export as CSV, Excel or JSON, or pull the dataset from the API. ats and boardUrl answer the “which ATS” question for every company that was found.
ats, slug, boardUrl, boardCompanyName and matchConfidence (explicit, high, medium when the board gives no name to check, or low).openJobs, postedLast7d, postedLast30d, postedLast90d, hiringScore, and bulkRepublish, which flags a board where more than half of 20+ roles were published within one 24-hour window (a migration, not a hiring surge).departments, topLocations, seniorityMix, engineeringShare, remoteShare (roles the board lists as remote), and topTechnologies counted from job text against about 160 built-in technologies, plus any keywords you add.newSinceLastRun, closedSinceLastRun and newRoles with titles and links. Put it on a weekly schedule to monitor a list.Hiring Signals checks the companies you give it, live, at run time. It is not a database: it can’t answer “show me every company hiring a Snowflake engineer”. It reads only the public job boards of the eight ATSs above. It does not touch LinkedIn, Indeed or any other job site, and it doesn’t see roles a company only posts there.
If you need discovery across all companies, the job-data providers crawl and index postings for you:
| Tool | What it is | Price (official pricing page) |
| TheirStack | Searchable database of job postings and technographics | Free plan with 50 company credits and 200 API credits a month; API plans from $49/month for 1,500 API credits. The API uses 1 credit per job and 3 per company returned. |
|---|---|---|
| PredictLeads | Company datasets, job openings included, by API | 100 free API credits a month; then $0.04 per API credit with a $40 minimum monthly charge, falling with volume. One request for a company’s job openings is 1 credit. |
| Hiring Signals | Live check of a list you supply | $0.05 per company whose board is found; not found is free; no subscription |
A common pattern is to use a database to build the list and a live check to confirm who is hiring this week, since a database row can be days or weeks behind the board itself.
Competitor prices are from their public pricing pages, checked 27 September 2026: TheirStack pricing (credit usage from TheirStack’s credits docs), PredictLeads pricing.
| Company report | $0.05 ($50 per 1,000), no subscription |
|---|---|
| Job row | $0.002, only if you turn on individual jobs |
A company is charged when a job board with at least one open job is found for it. These come back as free rows:
matchConfidence: "low"); the row shows the board it found so you can pass it explicitly if it is the right onestripe.com, Stripe and greenhouse:stripe are one board, reported and charged onceSet a maximum total charge for the run and you’re never charged past it. Once it’s reached, every input left over still gets a row with skipped: true, uncharged.
Find its job board (steps 1 and 2 above) and count the open roles in the public feed. A board with roles published in the last few weeks is actively hiring; a board whose newest role is months old may just be keeping evergreen listings up. postedLast30d gives that number directly.
Search the page source for the ATS domains listed above. If none appear, the company may use an ATS that isn’t in the table or an in-house system, and Hiring Signals will return it as not found, free.
No. It reads only the job-board APIs and feeds that the ATSs publish for showing jobs on company websites. No login, no personal data; the output is job and company information only.
Check boardCompanyName and boardUrl. Two companies with the same name can both come out high, and a medium match was not checked because the board gave no name. For generic names, pass the board explicitly.
Yes: through Apify’s integrations (Clay, Make, Zapier) or the API. Using our tools in Clay has the steps.