Developer guides

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

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 patternATS
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.comRecruitee
{token}.jobs.personio.de, .personio.comPersonio
{token}.teamtailor.comTeamtailor
{host}.fa.{dc}.oraclecloud.com/hcmUI/CandidateExperienceOracle 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

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 analysisVendor API probeArcadium Data
EvidenceStrong (the vendor serves the form)Weak (a slug exists)Board tied to the domain, with confidence
EffortOne request per company plus parsingOne request per vendor per guessOne call
HistoryNoneNoneDated switches and monthly history since 2023
ScaleScripting, careful pacingScripting, collision checksDomain list through the API
Own career sitesDetected as "none"Not foundNot found
CostYour timeYour timeAnonymous 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.

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.