ATS Jobs Scraper: Workable, SmartRecruiters, Personio & more avatar

ATS Jobs Scraper: Workable, SmartRecruiters, Personio & more

Pricing

from $1.00 / 1,000 job listings

Go to Apify Store
ATS Jobs Scraper: Workable, SmartRecruiters, Personio & more

ATS Jobs Scraper: Workable, SmartRecruiters, Personio & more

Get every open job from company career sites on Workable, SmartRecruiters, Recruitee, Personio, Teamtailor, BambooHR, Breezy HR, Greenhouse, Lever and Ashby in one normalized format: title, location, remote, type, salary, description, apply link. Auto-detects the ATS. No login, no personal data.

Pricing

from $1.00 / 1,000 job listings

Rating

0.0

(0)

Developer

Datakiln

Datakiln

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

ATS Jobs Scraper: Workable, SmartRecruiters, Recruitee, Personio, Teamtailor, BambooHR, Breezy HR, Greenhouse, Lever, Ashby

Give it a company career site, an "ats:slug" pair or just a company name. It finds out which applicant tracking system (ATS) the company uses, reads every open job and returns them in one flat format: title, department, location, remote or on-site, employment type, salary when published, description, job link and apply link.

The same fields come out whether the job lives on Workable or on Ashby, so you do not need ten parsers.

  • Ten systems, one format. Workable, SmartRecruiters, Recruitee, Personio, Teamtailor, BambooHR, Breezy HR, Greenhouse, Lever and Ashby.
  • Detects the system for you. Paste https://www.example.com/careers and the actor looks for the ATS behind the page. Or paste the ATS address directly, or type greenhouse:stripe, or a plain name such as Hugging Face.
  • Filters before you pay. Title keywords, location, remote only, posted in the last N days. Jobs that are filtered out are not charged.
  • Normalized values. workplaceType is remote, hybrid or on-site. employmentType is full-time, part-time, contract and so on. The original wording stays in employmentTypeRaw.
  • No personal data. No recruiter names, no personal e-mail addresses, no phone numbers. See the Limitations section.

Who is it for?

UseHow
Recruiters and sourcersWatch competitors' openings by role and city, run it weekly on a schedule
Job boards and aggregatorsPull open jobs from many employers without one integration per ATS
Salary researchUse the Salaries view: salaryMin, salaryMax, salaryCurrency, salaryPeriod for jobs that publish a range
Market analysisCount openings per department, country or company over time; compare remote and on-site share
AI agents / MCPSmall, flat JSON, easy to ask: "remote data engineer jobs at these 30 companies"

Supported systems

The list below is exactly what the code supports. Anything else is not read.

SystemInput examplesWhere the data comes from
Workablehttps://apply.workable.com/huggingface/Public widget API of the career page
SmartRecruitershttps://careers.smartrecruiters.com/Wix2The public career site and its job pages (HTML). The SmartRecruiters API is not used, because its robots.txt disallows generic bots
Recruiteehttps://bunq.recruitee.com, custom domainsPublic offers API of the career site
Personiohttps://company.jobs.personio.de (also .com)Public XML job feed
Teamtailorhttps://tibber.teamtailor.com, custom domainsPublic RSS feed
BambooHRhttps://flyio.bamboohr.com/careersPublic careers JSON; one request per job for the description
Breezy HRhttps://company.breezy.hrPublic JSON list plus the job page for the description
Greenhousehttps://job-boards.greenhouse.io/discordPublic Job Board API
Leverhttps://jobs.lever.co/spotify (EU site too)Public Postings API
Ashbyhttps://jobs.ashbyhq.com/notionPublic Job Posting API, with compensation

How it works

  1. Each input line is read. An ATS address or ats:slug goes straight to that system.
  2. Any other web address is opened and searched for links or embeds of a supported ATS. If nothing is found on the page, /careers and /jobs on the same site are tried. If still nothing, you get a not-found line with the reason.
  3. A plain company name is turned into a few likely slugs (huggingface, hugging-face) and tried on each supported system, in order, until one has jobs. You can limit this with Systems to try. A name is a guess, so a URL is more reliable.
  4. The jobs are listed, filtered, enriched with details when the system needs one request per job (SmartRecruiters, BambooHR, Breezy HR), cleaned and saved.

Requests go to the same public endpoints the ATS offers to the company's own career page. No login, no browser. At most 3 requests at a time per ATS host, with a short pause between them. Timeouts, HTTP 429 and 5xx are retried with backoff.

Input

Example:

{
"companies": ["https://apply.workable.com/huggingface/", "greenhouse:stripe", "Notion"],
"systems": [],
"maxJobsPerCompany": 50,
"titleKeywords": ["engineer"],
"remoteOnly": true
}
FieldTypeDefaultMeaning
companiesarrayrequiredCareer site URLs, ATS addresses, ats:slug pairs or company names, one per line
systemsarrayallOnly for plain names: which systems to try (workable, smartrecruiters, recruitee, personio, teamtailor, bamboohr, breezy, greenhouse, lever, ashby)
maxJobsPerCompanyinteger0 (no limit)Stop after this many jobs per company
maxJobsinteger0 (no limit)Stop the whole run after this many jobs
includeDescriptionbooleantrueReturn the description as text and HTML. Turn off for a fast list; this also saves the extra request per job on SmartRecruiters, BambooHR and Breezy HR
titleKeywordsarrayemptyKeep jobs whose title contains any of these words
excludeTitleKeywordsarrayemptyDrop jobs whose title contains any of these words
locationKeywordsarrayemptyKeep jobs whose location, city, region or country contains any of these words
remoteOnlybooleanfalseKeep only jobs marked remote, or with "remote" in the location
postedWithinDaysinteger0 (any)Keep jobs published in the last N days. Jobs with no date are kept
languagestringemptyTwo-letter code (en, de) for Personio feeds that publish several languages
keepCompanyEmailsbooleanfalseKeep generic mailboxes such as jobs@ or careers@ in descriptions. Other e-mail addresses are always removed
respectRobotsTxtbooleantrueSkip endpoints that robots.txt disallows. Skipped companies are listed and not charged
maxConcurrencyinteger10Companies processed at the same time (1 to 50)
detailConcurrencyinteger4Job pages read at the same time per company (1 to 10)
requestTimeoutSecsinteger30Wait for one response (5 to 120)
maxRetriesinteger2Retries per request (0 to 5)
proxyConfigurationobjectno proxyOptional. The public endpoints work without one

Output

One dataset item per job (description shortened here):

{
"status": "ok",
"input": "ashby:notion",
"ats": "ashby",
"companySlug": "notion",
"companyName": "notion",
"jobId": "1fc309c8-da20-4ff2-84c7-8b863ece2b0a",
"title": "Software Engineer, Developer Platform",
"department": "Engineering",
"location": "San Francisco, California",
"country": "United States",
"locations": ["San Francisco, California", "New York, New York"],
"isRemote": false,
"workplaceType": "hybrid",
"employmentType": "full-time",
"employmentTypeRaw": "FullTime",
"postedAt": "2026-08-24T14:44:49.699Z",
"salaryMin": null,
"salaryMax": null,
"salaryCurrency": null,
"salaryPeriod": null,
"salaryText": null,
"descriptionText": "Who We Are\nNotion is the collaborative AI workspace where teams and agents think together. ...",
"jobUrl": "https://jobs.ashbyhq.com/notion/1fc309c8-da20-4ff2-84c7-8b863ece2b0a",
"applyUrl": "https://jobs.ashbyhq.com/notion/1fc309c8-da20-4ff2-84c7-8b863ece2b0a/application",
"careersPageUrl": "https://jobs.ashbyhq.com/notion",
"scrapedAt": "2026-10-05T03:55:20.618Z",
"error": null
}

The full item also has team, city, region, countryCode, experienceLevel, descriptionHtml and language; fields a system does not publish are null.

A company that returns nothing gets one item with no job data and a status of no-jobs, not-found, failed, skipped (robots.txt) or invalid-input, plus an error that says why. These lines are free. At the end of the run, a SUMMARY record in the key-value store lists the result per company.

The dataset has two views: Jobs and Salaries.

How much does it cost?

You pay per job returned, not for time or for pages read.

PlanPer 1,000 jobs
Free$2.00
Starter (Bronze)$1.50
Scale (Silver)$1.20
Business (Gold)$1.00
  • The event is job-listing, charged once per job saved. Duplicates inside one run are saved and charged once.
  • A small Actor Start fee of $0.00005 applies to each run.
  • You are not charged for companies that fail, are not found, return no jobs, are skipped by robots.txt, or for invalid input lines.
  • Jobs removed by your filters are not charged.
  • Apify platform usage is billed separately by Apify.

Spending limit. Set Max cost per run in the run options. The actor reads it before starting, saves and charges job by job, and stops when the limit is reached. It never saves more jobs than your limit pays for. maxJobs gives you a second, count-based limit.

Limitations

  • Only these ten systems. A company on Pinpoint, iCIMS, Workday, Taleo or its own system is not read. You get a not-found or skipped line.
  • Companies change systems. A career site that moved from one ATS to another may still show an old link. If a run returns an empty or missing board, check the career page in a browser and paste the current address.
  • Plain names are guesses. Notion works if the company's board uses a slug like notion. Companies with unusual slugs need the URL or ats:slug.
  • Salary is often empty. Most postings do not publish pay. Where a system has structured pay, it goes to salaryMin, salaryMax, salaryCurrency and salaryPeriod (Recruitee, Lever, Ashby). Some systems give only text, which goes to salaryText (BambooHR, Breezy HR). Do not treat an empty salary as zero.
  • Fields vary by system. department, team, experienceLevel, postedAt, countryCode and workplace type exist only where the ATS publishes them. In one test run, Personio and Greenhouse jobs had no workplace type, and Teamtailor and Greenhouse jobs had no employment type.
  • SmartRecruiters is slower. It is read from the public career site pages, one request per job for details, so large boards take longer. Use includeDescription: false for a quick list.
  • Descriptions are cleaned. Text is the company's own. E-mail addresses, phone numbers, recruiter names and "contact person" blocks are removed, so a description can look slightly shorter than on the page.
  • What it does not collect. No applicants, no candidate data, no recruiter or hiring-manager names, no personal e-mail addresses or phone numbers.
  • Career sites can change or close an endpoint at any time.

Responsible use

The actor reads only data that companies publish for anyone to see, through endpoints the ATS vendors provide to the companies' own career sites. It does not log in, does not read applicant data and does not try to get around blocks. It checks robots.txt (on by default), limits requests per host and backs off on HTTP 429. Whether you may use job data for a given purpose depends on the company's terms and your local law, so check that for your case.

Integrations

Run it through the Apify API, schedules and webhooks, or the Apify MCP server. Send the dataset to JSON, CSV, Excel, Google Sheets, Make, Zapier or n8n with the standard Apify integrations.

FAQ

Do I need to know which ATS a company uses? No. Paste the company's career page and the actor looks for the system. If it cannot tell, paste the ATS address or use ats:slug.

Can it find the jobs of any company? Only companies on the ten systems above whose job board is public.

Does it return closed jobs? No, only jobs that are open on the career site when the run reads it.

Why did a company return skipped? Its robots.txt disallows the endpoint and Respect robots.txt is on. That line is free.

How do I get only remote engineering jobs? Set remoteOnly to true and titleKeywords to ["engineer"].

Can I get the salary of every job? Only where the company publishes it. Many do not.

Feedback

Missing a system, a field or a filter? Found a career site that does not parse? Open a ticket in the Issues tab of this actor. Include the input line you used and, if you can, the run link.

This actor is not affiliated with any of the applicant tracking systems or companies it reads.