Job Board & ATS Finder by Company (Greenhouse, Lever, Ashby)
Pricing
from $5.00 / 1,000 job board founds
Job Board & ATS Finder by Company (Greenhouse, Lever, Ashby)
Turn company names or websites into their public job board: ATS (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio), slug, URL, open jobs, confidence. Watch mode: scheduled runs return only companies that switched ATS, started hiring or closed their board.
Pricing
from $5.00 / 1,000 job board founds
Rating
0.0
(0)
Developer
Vellum Kasane
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
8 hours ago
Last modified
Categories
Security
Limited permissionsShare
Job Board & ATS Finder by Company (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio)
Find which ATS a company uses and where its public job board lives. Give it company names or websites ("Notion", "blueground.com") and get one record per company: the ATS vendor (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee or Personio), the board slug, board URL and API URL, the number of open jobs, sample titles and a confidence level. Every answer is verified against the vendor's public job-board API, so found: true means a live board you can pull jobs from right away. Turn on watch mode and a scheduled run returns only the companies that switched ATS, started hiring or closed their board.
| Input | Company names, domains or careers-page URLs, mixed freely. Optional hints per company: website, slug, ATS |
| Output | ATS vendor, board slug, board and API URL, open jobs, confidence, evidence, other live boards, unsupported ATS seen on the site (Workday, iCIMS, ...) |
| Price | $0.005 per company with a board, $0.001 per company without one (or unchanged in watch mode), $0.01 per run |
| Speed | 8 companies in about 10 seconds. Workable lookups are paced (about 1.5 per second) to stay under its rate limit, so long lists run at about 2-3 s per company: 100 companies in about 5 minutes. No browser, no proxy |
{"query": "Notion","found": true,"ats": "ashby","slug": "notion","board_url": "https://jobs.ashbyhq.com/notion","api_url": "https://api.ashbyhq.com/posting-api/job-board/notion","open_jobs": 128,"confidence": "medium","evidence": ["api-probe:ashby:notion"],"sample_titles": ["Account Executive, Mid-Market", "Software Engineer, Infrastructure", "Product Designer"],"other_boards": [{ "ats": "workable", "slug": "notion", "open_jobs": 0, "confidence": "medium" }],"other_ats": [],"feed_input": { "ats": "ashby", "slug": "notion" },"watch_change": null}
Jump to the task you have:
- Find which ATS a company uses and its job board slug
- Map a CRM list of domains to job boards in bulk
- Get alerted when target accounts switch ATS, start hiring or close their board
- Turn the boards into a job feed (new / closed jobs)
- Find out which accounts use Workday, iCIMS, Taleo or SuccessFactors
- What this Actor cannot do
1. Find which ATS a company uses and its job board slug
Paste names or websites into Companies and click Start:
{"companies": ["PostHog","https://stripe.com","blueground.com",{ "name": "GitLab", "website": "about.gitlab.com" }]}
For every company the Actor:
- reads up to 5 pages of the company's own website when you gave one (home,
/careers,/jobs, plus careers links found on the home page), respectingrobots.txt, and extracts links to the seven vendors' hosted boards; - derives board-slug guesses from the name and domain (
Hugging Face->huggingface,hugging-face,hugging;about.gitlab.com->gitlab) and asks each vendor's public job-board API whether the board exists; - keeps the boards the vendors confirm, grades the confidence, and picks the best one (boards with open jobs first, then confidence, then size).
Read ats, slug and confidence. high means the company's own site links to the board or the vendor's board name matches the company; low means a live board on a guessed slug and nothing else, so check sample_titles before you rely on it. SUMMARY.json in the key-value store lists every company with its result and number of probes.
2. Map a CRM list of domains to job boards in bulk
Export the domain column from your CRM and paste it as strings. A domain beats a name: the careers page is read first, which finds boards with slugs unrelated to the name and settles namesakes.
{ "companies": ["linear.app", "posthog.com", "channable.com", "bunq.com"], "maxCompanies": 500 }
- Already know the vendor? Set
atsList(e.g.["greenhouse", "lever"]) to cut the probes. - Long or unusual company names: raise
maxSlugGuessesto 6-8. - Known slug for some rows: pass
{ "name": "GitLab", "slugs": ["gitlab-inc"], "ats": "greenhouse" }. - Cost example: 200 companies of which 150 resolve = 150 x $0.005 + 50 x $0.001 + $0.01 = about $0.81.
3. Get alerted when target accounts switch ATS, start hiring or close their board
Set Watch mode: state key (stateKey) and schedule the Actor (daily or weekly) with the same company list:
{ "companies": ["Notion", "linear.app", "blueground.com"], "stateKey": "my-target-accounts", "minJobChange": 10 }
- The first run is a baseline: every company is returned and billed as usual, each with
watch_change: "new". - Every later run returns only the companies whose board changed since the previous run, with
watch_changeand the board as it was before (previous):
watch_change | Meaning | Typical use |
|---|---|---|
board-found | No supported board before, a live one now. | The account started hiring or moved to a readable ATS. |
ats-changed | Best board moved to another vendor (e.g. Lever -> Ashby). | ATS migration = a sales trigger for recruiting tools and agencies. |
slug-changed | Same vendor, different board slug or region. | Update the slug you feed into ATS Jobs Feed. |
board-lost | The board was missing on 2 runs in a row. | Hiring freeze, acquisition, or a move to an unsupported ATS (see other_ats). |
jobs-changed | Only with minJobChange > 0: open jobs moved by at least that many since the company was last returned. | Hiring surge / freeze signal. |
Unchanged companies are not written to the dataset and are billed as company-checked ($0.001): watching 200 accounts weekly costs about $0.21 per run when nothing changed, plus $0.004 for each company that did. The state lives in a named key-value store in your account, so it survives between runs; use a different state key per company list. Connect the dataset to Slack, e-mail or a webhook with an Apify integration to get the changes as alerts.
4. Turn the boards into a job feed (new / closed jobs)
Each record carries feed_input ({ "ats": "ashby", "slug": "notion" }), the exact entry the ATS Jobs Feed Actor takes in its companies input. Two ways to chain them:
- Once, no copy-paste (ATS Jobs Feed 0.9+): start ATS Jobs Feed with
"companiesDatasetId": "<this run's dataset ID>"and diff mode on, or connect it under Integrations with{{resource.defaultDatasetId}}. It reads everyfeed_inputand skips the companies not found. Each scheduled run then returns every new, updated and closed job as Markdown. - Kept up to date: schedule this Actor in watch mode on the full account list, and ATS Jobs Feed in diff mode on the boards. Only
board-found,ats-changedandslug-changedrecords need action: add or replace that company's entry in the feed list with the newfeed_input. A company that moves vendor gets new job ids, so the feed reports one wave of closed + new jobs for it.
ATS Jobs Feed can also take company names directly, but it then re-resolves them every run and caps lookups at 100 per run. Resolving here once and passing { ats, slug } pairs is faster and works for thousands of boards.
5. Find out which accounts use Workday, iCIMS, Taleo or SuccessFactors
Keep probeWebsite: true and give websites. When a company's careers page links to a vendor without a public job-board API, the record is found: false and the vendor is listed in other_ats (Workday, iCIMS, Taleo, SuccessFactors, BambooHR, Teamtailor, Jobvite, Breezy, Rippling, JazzHR, JOIN, Welcome to the Jungle, Pinpoint, Dover, HiBob, Freshteam). Filter the dataset on other_ats to segment your list by ATS. These companies are billed as company-checked ($0.001).
What this Actor cannot do
Read this before your first run. None of these fail the run: a company that errors is reported with errors (or in SUMMARY.json) and the others continue.
| Limit | What happens | What to do |
|---|---|---|
| Other ATS vendors (Workday, iCIMS, Taleo, SuccessFactors, BambooHR, ...) | found: false; the vendor is named in other_ats when the website reveals it. There is no public job-board API to verify those | None in this Actor. It only reports vendors it can verify |
Board slug unrelated to the name (acme-corp-2019) | The name-based guess misses it; found only through a link on the company's website | Give the website, or pass the slug in slugs |
| Namesakes | A live board on a guessed slug can belong to another company with the same name | Check confidence, board_name and sample_titles; prefer high |
Namesakes when the domain is not the name (Jump with jumpscientific.com) | A board found only by guessing the short name is at most medium, because another company with that name may own it | Pass the slug, or give the careers-page URL as the website |
| Example board links on product pages | Only pages whose path is a careers segment (/careers, /jobs, careers.example.com) are followed. A linked board of Lever / Ashby / Personio whose slug does not look like the company is medium, not high | Check sample_titles |
Boards with a suffix (sumble-inc, valis-insights-1) | Not guessed | Give the website (the careers page usually links the board) or pass slugs |
| Careers pages rendered by JavaScript | No browser is used, so the website step finds no link; the slug guesses still run | Give the board URL as the website, or the slug |
Custom careers domains on Recruitee or Personio (careers.example.com) | Not recognised as a Recruitee / Personio link | The slug guess from the name usually finds it; otherwise pass slugs and ats |
| Dormant accounts (an old Workable account with 0 jobs) | A board with 0 open jobs counts as found only when the company's own site links to it; otherwise it goes to other_boards and the record is found: false | Check other_boards |
| SmartRecruiters boards with zero postings | SmartRecruiters answers every company id with an empty list, so an empty board cannot be told from a wrong id and is reported as not found | Check careers.smartrecruiters.com/<id> by hand |
board_name | Only Greenhouse, Workable and SmartRecruiters publish it; Lever and Ashby return null | Use sample_titles to confirm |
robots.txt disallows the careers page | The page is skipped and listed in pages_skipped_by_robots; API probes still run | — |
| Rate limits | The vendors do not publish limits. Workable answers HTTP 429 after about 50 lookups in 15 s from one IP and can then refuse the IP for several minutes (measured 2026-11-07). So Workable gets only the first slug guess (all guesses when the website mentions Workable or you set ats: "workable"), its lookups are spaced 650 ms apart, and 429 is retried after 2-4-8-16 s. A company still not found while a vendor kept failing gets incomplete: true: not charged, and watch mode keeps its previous state | Re-run the incomplete: true companies later; for Workable-heavy lists pass { "name": ..., "ats": "workable" } |
| Watch mode: two boards of similar size | The best-board pick can flip between runs and show as slug-changed / ats-changed | Check previous and other_boards |
| Watch mode: a board emptied for one run | Held, not reported; board-lost only on the second miss in a row | — |
Watch mode: changing atsList or maxSlugGuesses under the same key | Can look like changes | Use a new stateKey |
Budget cap (Max total charge per run or maxCompanies) | The run stops cleanly before exceeding it. In watch mode the companies not checked keep their old state and are compared next run | Raise the cap |
| Run aborted or migrated | Watch mode saves the companies already processed, so the next run never reports (or bills) the same change twice | — |
| No logins, no proxies, no personal data | Only public job-board endpoints and public web pages are read. No candidate or employee data | — |
Input
All fields are on the Input tab; only companies is required.
| Field | Type | Default | Notes |
|---|---|---|---|
companies | array | required | Strings ("Acme", "acme.com", "https://acme.com/careers") and/or objects { name, website, slugs, ats }. Duplicates (same name + host) are checked once. |
atsList | array | all seven | Restrict to some vendors, e.g. ["greenhouse", "lever"]. |
probeWebsite | boolean | true | Read the company site for board links (only when a website is given). |
maxSlugGuesses | integer | 4 | Slug variants tried per vendor. Raise to 6-8 for companies with long or unusual names. |
includeSampleTitles | boolean | true | Include up to 5 job titles per board, useful to confirm it is the right company when the slug is generic. |
maxCompanies | integer | 100 | Hard cap per run (also caps your cost). |
stateKey | string | empty | Watch mode: name of the key-value store that remembers each company's board. Empty = one-off lookup. |
minJobChange | integer | 0 | Watch mode: also return a company when its open-job count moved by at least this many. 0 = board changes only. |
Output fields
| Field | Meaning |
|---|---|
found | true when a live board with open jobs was verified on a vendor API, or the company's site links to a (possibly empty) board. |
ats, slug, region | Best board. region is eu for Lever EU boards (jobs.eu.lever.co). |
board_url / api_url | The vendor-hosted careers page and the public JSON endpoint that verified it. |
board_name | Company name as the vendor publishes it. Only Greenhouse, Workable and SmartRecruiters expose it; Lever and Ashby return null. |
open_jobs | Listed jobs on the board at fetch time (Ashby: listed only; SmartRecruiters: totalFound). |
confidence | high: linked from the company's own site, or the vendor's board name matches the company name. medium: slug equals the normalised name or domain, or the site references the vendor. low: a live board on a guessed slug with nothing else. Boards with 0 open jobs are capped at medium. |
evidence | website-link:<page>, api-probe:<ats>:<slug>, website-hint:<ats>. |
other_boards | Other live boards for the company (a dormant Workable account, a second Greenhouse board, ...), same fields. |
ats_hints | Vendors referenced on the website without a resolvable slug (e.g. an embedded Greenhouse widget on a custom domain). |
other_ats | Unsupported vendors detected on the website: workday, icims, taleo, successfactors, bamboohr, teamtailor, jobvite, breezy, rippling, jazzhr, join, welcometothejungle, pinpoint, dover, hibob, freshteam. |
watch_change / previous | Watch mode only: why the company is in the output and the board as last returned (see above). null without a state key. |
feed_input | { ats, slug[, region] } for the ATS Jobs Feed Actor. |
pages_read / pages_skipped_by_robots / slugs_tried / probes / errors | What the Actor did for this company, for auditing. A company with errors may still be found. |
Pricing
Pay-per-event. You pay per company, never per request the Actor makes on your behalf:
| Event | Price | When |
|---|---|---|
board-found | $0.005 per company | The company resolved to a live board (verified on the vendor API) with open jobs, or linked from its own site. In watch mode: only when the board changed. |
company-checked | $0.001 per company | No board was found (the record is still written, with ats_hints and other_ats). In watch mode also: a company whose board did not change (no record). |
| Actor start | $0.01 per run | Apify's standard start event. |
Use Max total charge per run to hard-cap spend; the Actor stops gracefully before exceeding it.
Data sources
| Vendor | Endpoint probed | Documentation | Notes |
|---|---|---|---|
| Greenhouse | GET https://boards-api.greenhouse.io/v1/boards/{slug}/jobs and /v1/boards/{slug} | https://docs.greenhouse.io/job-board.html | — |
| Lever | GET https://api.lever.co/v0/postings/{slug}?mode=json (EU: api.eu.lever.co) | https://github.com/lever/postings-api | — |
| Ashby | GET https://api.ashbyhq.com/posting-api/job-board/{slug} | https://developers.ashbyhq.com/docs/public-job-posting-api | — |
| Workable | GET https://apply.workable.com/api/v1/widget/accounts/{slug} | https://workable.readme.io/reference/jobs-1 | — |
| SmartRecruiters | GET https://api.smartrecruiters.com/v1/companies/{slug}/postings?limit=5 | https://developers.smartrecruiters.com/docs/endpoints | — |
| Recruitee | GET https://{slug}.recruitee.com/api/offers/ | https://docs.recruitee.com/reference/offers | Careers Site API, no key. 404 for unknown companies. Custom careers domains (careers.example.com) are not recognised as Recruitee links; the slug guess still finds them. |
| Personio | GET https://{slug}.jobs.personio.de/xml (or .jobs.personio.com) | https://developer.personio.de/docs/retrieving-open-job-positions | Public XML feed, no key. Unknown companies answer 404 (since 2026-10-15) or redirect to personio.com; both count as "no board" and redirects are not followed. |
All endpoints are public and documented by the vendors; no API keys are needed or accepted.
Verified
Version 0.2 (2026-10-02): Recruitee and Personio added to the probes and the careers-page link patterns (shared code with ATS Jobs Feed 0.4). Local run with the prefill input plus { "name": "Channable", "website": "channable.com" } and { "name": "Personio", "website": "personio.com" } and "bunq" (11 companies): 11 found, 0 not found in about 10 seconds; Channable -> recruitee:channable (10 open jobs, high, link found on channable.com), bunq -> recruitee:bunq (14, high), Personio -> personio:personio (1, medium). The eight original companies resolved exactly as in 0.1. Unit tests: 12.
Local run on 2026-09-28 with apify run --purge (Apify CLI 1.10, SDK 3.7.2, Node 24), prefill input (8 companies): all 8 resolved in about 5 seconds - PostHog -> ashby (8 jobs), Linear -> ashby (30), https://stripe.com -> greenhouse (699, high), blueground.com -> workable (10, high), SmartRecruiters -> smartrecruiters (1), GitLab -> greenhouse (200, high), Spotify -> lever (80), Notion -> ashby (128). Dormant Workable accounts with 0 jobs existed for six of the eight names and were correctly ranked into other_boards. Unit tests: npm test (11 tests: website parsing, slug candidates, careers-page link extraction, robots.txt rules, confidence and ranking).
Changelog
- 0.3.4 (2026-10-14): README: ATS Jobs Feed 0.9 reads this Actor's dataset directly (
companiesDatasetId). No code change. - 0.3.2 (2026-10-12): README rewritten by task (find the ATS, bulk mapping, watch alerts, chaining into ATS Jobs Feed, unsupported vendors) with a limits table. Platform run
wCBux8QiLe6Z4ead7on the prefill input: 8 companies in 3.7 s, 7 found (Stripe 726 jobs and GitLab 221high);SmartRecruitersitself is nowfound: falsebecause its own board has 0 postings, the limit described above. - 0.3 (2026-10-11): watch mode (
stateKey,minJobChange): scheduled runs return only companies whose board changed. Platform check: baseline run 3 companies / 3board-found, second run 0 records / 3company-checked. - 0.2 (2026-10-02): Recruitee and Personio.
- 0.1 (2026-09-28): Greenhouse, Lever, Ashby, Workable, SmartRecruiters.
Support
Open an issue on the Actor's Issues tab. Issues are answered within one business day; fixes ship as new builds without changing the input schema.
Made by Vellum Labs. Part of the same family as ATS Jobs Feed (jobs from the boards this Actor finds) and HN Threads & Hiring.