How to find which ATS a company uses (and when it switched)
The fastest tell is the hostname of the apply link: boards.greenhouse.io, jobs.lever.co, jobs.ashbyhq.com, *.myworkdayjobs.com and a dozen others identify the system without any scraping of the page body. Source: Arcadium Data, data as of .
Sales teams selling to recruiters, vendors defending a base, investors sizing a market and job seekers wondering how their CV is parsed all ask the same question: which ATS does this company use? Search engines answer it with resume-advice pages that are often wrong; the real signal is in the company's own job links.
A company can also use more than one system: a parent on Workday, a subsidiary on Greenhouse, an old Lever board that was never deleted. Treat the answer as "the board that carries the open jobs today" and keep the date.
The manual and scripted routes
1. Read the apply link
Open a live job ad on the company's careers page and look at where "Apply" goes. This works for all hosted boards because the vendor serves the form:
| Host pattern | ATS |
|---|---|
boards.greenhouse.io/{token}, job-boards.greenhouse.io/{token} | Greenhouse |
jobs.lever.co/{token}, jobs.eu.lever.co/{token} | Lever |
jobs.ashbyhq.com/{org} | Ashby |
{tenant}.wd{n}.myworkdayjobs.com/{site} | Workday |
jobs.smartrecruiters.com/{id}, careers.smartrecruiters.com/{id} | SmartRecruiters |
apply.workable.com/{token} | Workable |
{token}.recruitee.com | Recruitee |
{token}.jobs.personio.de, .personio.com | Personio |
{token}.teamtailor.com | Teamtailor |
{host}.fa.{dc}.oraclecloud.com/hcmUI/CandidateExperience | Oracle Recruiting Cloud |
2. Look for an embed on the company's own careers page
Many companies keep a branded careers page and embed the board: an iframe or script from the vendor host (Greenhouse: boards.greenhouse.io/embed/job_board/js?for={token}), a ?gh_jid= parameter on job URLs, or JSON-LD JobPosting blocks whose url points at the vendor. A custom domain that is a CNAME to the vendor (Teamtailor and Recruitee support it) shows up in a DNS lookup.
3. Probe the vendor API with a guessed token
If the token is likely the company name, a request to the public endpoint answers yes or no: HTTP 200 with jobs means a board exists. This is the cheapest check, and the least safe: a token proves that a company with that slug has a board, not that it is yours.
curl
# Does a Greenhouse board called "stripe" exist? (200 = yes, 404 = no)
curl -s -o /dev/null -w "%{http_code}\n" "https://boards-api.greenhouse.io/v1/boards/stripe"
# Which host does the apply link of a job ad point to?
curl -sI "https://careers.example.com/jobs/123/apply" | grep -i '^location'
Python
import re
from urllib.parse import urlparse
import requests
PATTERNS = [
(r"(?:job-)?boards\.greenhouse\.io|boards-api\.greenhouse\.io", "greenhouse"),
(r"jobs(?:\.eu)?\.lever\.co|api\.lever\.co", "lever"),
(r"jobs\.ashbyhq\.com", "ashby"),
(r"\.myworkdayjobs\.com$", "workday"),
(r"(?:jobs|careers)\.smartrecruiters\.com", "smartrecruiters"),
(r"apply\.workable\.com", "workable"),
(r"\.recruitee\.com$", "recruitee"),
(r"\.jobs\.personio\.(?:de|com)$", "personio"),
(r"\.teamtailor\.com$", "teamtailor"),
(r"\.oraclecloud\.com$", "oracle"),
]
def ats_of(url: str):
host = urlparse(url).hostname or ""
for pattern, name in PATTERNS:
if re.search(pattern, host):
return name
return None
def ats_of_page(careers_url: str):
html = requests.get(careers_url, timeout=30).text
found = {ats_of(u) for u in re.findall(r'https?://[^\s"\'<>]+', html)}
return sorted(x for x in found if x)
print(ats_of("https://boards.greenhouse.io/stripe/jobs/123"))
TypeScript
const PATTERNS: [RegExp, string][] = [
[/(job-)?boards\.greenhouse\.io|boards-api\.greenhouse\.io/, 'greenhouse'],
[/jobs(\.eu)?\.lever\.co|api\.lever\.co/, 'lever'],
[/jobs\.ashbyhq\.com/, 'ashby'],
[/\.myworkdayjobs\.com$/, 'workday'],
[/(jobs|careers)\.smartrecruiters\.com/, 'smartrecruiters'],
[/apply\.workable\.com/, 'workable'],
[/\.recruitee\.com$/, 'recruitee'],
[/\.jobs\.personio\.(de|com)$/, 'personio'],
[/\.teamtailor\.com$/, 'teamtailor'],
];
export const atsOf = (url: string): string | null => {
const host = new URL(url).hostname;
return PATTERNS.find(([re]) => re.test(host))?.[1] ?? null;
};
4. Use archives for history
To learn which ATS a company used in the past, the Internet Archive and Common Crawl hold old career pages. Common Crawl's index lets you query a hostname prefix such as boards.greenhouse.io/* per crawl, which is also how you discover boards at scale.
A decision order for scripts
When you automate this for many companies, run the checks from cheap and strong to expensive and weak, and stop at the first confident answer: first the apply link or embed host from the careers page, then JSON-LD JobPosting blocks on a job page, then a vendor API call with a token taken from a link you saw (not guessed), and only last a guessed token with a name check. Record for each answer which step produced it, the date, and the URL you saw. Re-check on a schedule, quarterly is enough for most uses, since migrations are rare but do happen; a changed apply host is the first sign.
Traps
- Parent and brands. The board of a subsidiary does not make the group "a Workday company". Say which entity the board belongs to.
- Token collisions. The same slug exists for unrelated companies in different countries. Check the company name on the board page.
- Dead boards. A company that moved from Lever to Ashby may keep an empty Lever board. Count only boards with open jobs, and note the last capture date.
- Own career sites. Some large employers (Shopify is one) run a custom careers system with no public vendor feed. "Not found" is a valid result.
- Resume-checker sites publish "which ATS does X use" pages from guesses. A job ad's apply link is better evidence.
The fast route: the ATS and its history by domain
For companies whose board we track, GET /v1/companies/{domain} returns the primary board (hiring.ats, hiring.boardUrl, hiring.openJobs, hiring.lastSeen), how sure the match is (hiring.matchConfidence) and every board (boards[] with ATS, token and open jobs).
Calls on this page work without a key from one IP (10 requests a minute, 100 a day, short answers, point lookups). A free key lifts the limits: sign up. Routes, parameters and fields: OpenAPI.
curl
curl -s "https://api.arcadiumdata.io/v1/companies/stripe.com"
Response (abridged)
{
"domain": "stripe.com",
"name": "Stripe",
"hiring": {
"ats": "greenhouse",
"boardUrl": "https://job-boards.greenhouse.io/stripe",
"openJobs": 725,
"matchConfidence": "high",
"lastSeen": "2026-10-22T18:39:18.699Z"
},
"boards": [ ... ]
}
To see whether a company changed system, ask for its dated switches. The anonymous tier answers this per domain (up to five rows):
curl
curl -s "https://api.arcadiumdata.io/v1/ats/switches?domain=stripe.com"
Each row of data has fromAts, toAts, switchMonth, the last capture of the old board (fromLastSeen), the first capture of the new one (toFirstSeen), how the boards were tied to the domain (evidence) and a confidence. An empty list means no switch was detected, which is the normal case. With a key, filter all switches by fromAts, toAts, country and since (for example Lever to Ashby).
Python
import requests
def current_ats(domain: str):
r = requests.get("https://api.arcadiumdata.io/v1/companies/" + domain, timeout=30)
if r.status_code == 404:
return None # no board we know of: the company may use its own career site
r.raise_for_status()
hiring = r.json().get("hiring")
return hiring and (hiring["ats"], hiring["matchConfidence"], hiring["lastSeen"])
def switches(domain: str):
r = requests.get("https://api.arcadiumdata.io/v1/ats/switches?domain=" + domain, timeout=30)
r.raise_for_status()
return [(s["fromAts"], s["toAts"], s["switchMonth"], s["confidence"]) for s in r.json()["data"]]
print(current_ats("stripe.com"), switches("stripe.com"))
TypeScript
const res = await fetch('https://api.arcadiumdata.io/v1/ats/switches?domain=stripe.com');
const { data, note } = (await res.json()) as {
data: { fromAts: string; toAts: string; switchMonth: string; confidence: string }[];
note: string;
};
console.log(data.length ? data : 'no switch detected', note);
Point-in-time history since February 2023 (open jobs per capture of the public web archive) comes from GET /v1/companies/{domain}/history. The free which-ATS tool runs the lookup in the browser, and company pages show the answer at /company/{domain}/. To test a list, POST /v1/coverage checks up to 50 domains for a known public board.
Limits: we only know boards we have found and tied to a domain. A company on a custom career system answers not_found. The match confidence reflects how the board was tied to the domain; treat low as a lead, not a fact. Switch dates are month-level and come from archive captures, so recent switches appear after the old board has been absent for a few captures.
Comparison
| Apply-link / page analysis | Vendor API probe | Arcadium Data | |
|---|---|---|---|
| Evidence | Strong (the vendor serves the form) | Weak (a slug exists) | Board tied to the domain, with confidence |
| Effort | One request per company plus parsing | One request per vendor per guess | One call |
| History | None | None | Dated switches and monthly history since 2023 |
| Scale | Scripting, careful pacing | Scripting, collision checks | Domain list through the API |
| Own career sites | Detected as "none" | Not found | Not found |
| Cost | Your time | Your time | Anonymous tier free; free key |
Get the data without the plumbing
Arcadium Data serves these datasets from one REST API and one MCP server, with sources, licences and dates on every answer. No key is needed to try the routes in this guide.
Related
- Which ATS tool
- ATS vendors
- Job board APIs: Greenhouse, Lever, Ashby
- Companies using an ATS
- Workday career site JSON
- SmartRecruiters and Personio endpoints
- ATS market share
Sources
Last updated 2026-10-25. This guide is ours and independent of the organisations it describes. Found a mistake? Tell us and we correct it.
Questions
How can I tell which ATS a company uses?
Open a live job ad and look at where Apply leads. Hosts such as boards.greenhouse.io, jobs.lever.co, jobs.ashbyhq.com and *.myworkdayjobs.com identify the system. Embedded boards show the vendor host in an iframe or script.
Can a company use more than one ATS?
Yes. Groups often run different systems per brand or country, and old boards stay online after a migration. Report the board that carries open jobs today and keep the date.
How do I find out when a company switched ATS?
Compare dated captures of its boards. The ATS switches route of our API does this: it gives the old and new system, the month and the evidence for a domain.
Why does a famous company show no ATS?
It may run a custom careers system with no public vendor feed. The absence of a public board is a result, not a gap in the search.
Is guessing the board token reliable?
No. A guessed slug can belong to a different company with the same name. Confirm the company name on the board and use the apply link host as the stronger evidence.
Cite as: Arcadium Data, "How to find which ATS a company uses (and when it switched)", https://arcadiumdata.io/guides/which-ats-does-a-company-use/, data as of 2026-10-25.