Company Jobs API - universal ATS careers scraper avatar

Company Jobs API - universal ATS careers scraper

Pricing

from $0.80 / 1,000 job postings

Go to Apify Store
Company Jobs API - universal ATS careers scraper

Company Jobs API - universal ATS careers scraper

Company domain or careers URL -> normalized open job postings JSON. Auto-detects Greenhouse, Lever, Ashby, SmartRecruiters, Workday, Teamtailor, Personio, Recruitee, Workable and BambooHR boards. HTTP-only, no login, no personal data. Pay per job.

Pricing

from $0.80 / 1,000 job postings

Rating

0.0

(0)

Developer

Alex Lin

Alex Lin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

Share

Turn any company's job board into clean JSON. Give it a domain (stripe.com), a careers page, or a direct board URL, and it auto-detects the applicant tracking system (ATS) behind it — Greenhouse, Lever, Ashby, SmartRecruiters, Workday, Teamtailor, Personio, Recruitee, Workable, or BambooHR — and returns every open role as one normalized schema. No login, no browser, no anti-bot workarounds: every one of these is a public JSON (or XML) API. Built for recruiting/sourcing pipelines, sales and investor prospecting ("who is Figma hiring for?"), labor-market research, and AI agents that need a list_open_roles(company) tool.

Sample output

One item per job, always the same shape regardless of which ATS it came from:

{
"company": "linear",
"ats": "ashby",
"board_url": "https://jobs.ashbyhq.com/linear",
"job_id": "cd5ae036-0223-427a-b038-ba16ef9dcb32",
"title": "Senior / Staff Fullstack Engineer",
"url": "https://jobs.ashbyhq.com/linear/cd5ae036-0223-427a-b038-ba16ef9dcb32",
"location": "North America",
"locations": ["North America"],
"remote": true,
"department": "Product",
"team": "Engineering",
"employment_type": "FullTime",
"posted_at": "2021-08-18T20:48:26.891Z",
"updated_at": null,
"salary_min": null,
"salary_max": null,
"salary_currency": null,
"scraped_at": "2026-09-13T19:46:20.424Z"
}

Set include_description: true to add description_text/description_html, and include_raw: true to attach the original ATS record (with recruiter names/emails stripped) as raw. Download the dataset as JSON, CSV, Excel, or query it over the API.

Why this one

The Store has a dozen single-ATS "Greenhouse jobs" / "Lever jobs" / "Workday jobs" actors, each covering one system. This one covers all ten from a single input, so you don't need to know in advance what a company runs — useful for sourcing lists that span hundreds of companies. It's plain fetch against public JSON/XML endpoints: no browser, no proxy required, no personal data (contact emails and recruiter names are stripped from every output field, including raw).

How it works

  1. Add company domains, careers-page URLs, and/or (if you already know them) direct board URLs to the input.
  2. For each companies entry, the Actor tries, in order: (a) does the string already look like one of the 10 ATS's own URLs, (b) guess the board slug from the domain and probe each ATS's public API, (c) fetch the company's careers page and look for an embedded Greenhouse/Lever/Ashby/etc. link. First hit wins.
  3. Every job on the resolved board is fetched, normalized, optionally filtered, and pushed to the dataset.

Input

FieldTypeDefaultNotes
companiesstring[]["stripe.com", "figma.com"]*Domains or careers-page URLs. ATS is auto-detected.
boardsstring[]["https://jobs.lever.co/spotify", "https://jobs.ashbyhq.com/linear"]*Direct board/API URLs — skips detection.
include_descriptionbooleanfalseAdds description_text/description_html. Costs one extra request per job for Workday/SmartRecruiters/BambooHR/Workable.
posted_afterstring (ISO date)Keeps jobs with no known date.
keywordstringMatches title/department/team/description. |-separated alternatives.
locationstringSubstring match against the job's location(s).
max_jobs_per_companyinteger500Cap per resolved board, applied after filtering.
max_total_jobsintegerunlimitedCap for the whole run.
include_rawbooleanfalseAttaches the source ATS record (PII stripped) as raw.

* The defaults only apply when both companies and boards are left empty — this is what a zero-config run uses, so it always returns real jobs from four different ATSs in well under a minute.

Supported ATSs

Greenhouse · Lever · Ashby · SmartRecruiters · Workday · Teamtailor · Personio · Recruitee · Workable · BambooHR — all ten verified end to end (list + normalize) against live company boards while building this Actor. If a company's board is on one of these ten but detection fails (some careers pages hide the board behind JavaScript), pass the direct board URL in boards instead.

Pricing

Pay per event, no subscription:

EventPriceWhen
Actor start$0.002Once per run
Board resolved$0.005Once per company/board where an ATS was successfully found
Job$0.001Once per normalized job written to the dataset (primary event)

Worked examples:

  • 100 jobs from one company: $0.002 + $0.005 + 100 × $0.001 = $0.107
  • The default sample run (Stripe, Figma, Spotify, Linear — 755 jobs across 4 boards): $0.002 + 4 × $0.005 + 755 × $0.001 = $0.777
  • Free plan: the $5/month free usage plus the platform's own $0.20/GB-hour compute more than covers occasional runs — this Actor is HTTP-only and typically finishes a few hundred jobs in under a minute.

Limits & notes

  • Public data only: open job postings as published by the company. No login, no candidate data.
  • Recruiter/HR contact emails are stripped from every text field and from raw.
  • Some ATSs (Workday tenant/site, SmartRecruiters company id) aren't reliably guessable from a bare domain if the company uses a non-obvious slug — pass the board URL directly via boards in that case.
  • Not affiliated with Greenhouse, Lever, Ashby, SmartRecruiters, Workday, Teamtailor, Personio, Recruitee, Workable, or BambooHR. Trademarks belong to their respective owners.
  • Found a company whose board doesn't resolve, or a parsing bug? Open an issue on this Actor's Issues tab.