ATS Jobs Scraper for 6 ATS Sources

Scrape public Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio job boards into one normalized jobs dataset.

Data fields

FieldTypeDescription
sourcetextSource exported in the dataset view.
companySlugtextCompany slug exported in the dataset view.
companyNametextCompany exported in the dataset view.
jobIdtextJob ID exported in the dataset view.
titletextTitle exported in the dataset view.
locationtextLocation exported in the dataset view.
departmenttextDepartment exported in the dataset view.
teamtextTeam exported in the dataset view.

Input preview

startUrlsMixed ATS board URLs
greenhouseBoardsGreenhouse board tokens or URLs
leverCompaniesLever company slugs or URLs
ashbyBoardsAshby board slugs or URLs
recruiteeCompaniesRecruitee company subdomains or URLs
smartRecruitersCompaniesSmartRecruiters company identifiers or URLs

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Scrape public ATS job boards from Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio with a single Apify Actor and export normalized job postings.

Use this actor when you need normalized jobs from multiple applicant tracking systems in one recruiting dataset.

At a glance

  • Input: Public Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, or Personio board URLs or source-specific slugs.
  • Output: One normalized dataset row per public job posting, with source, company, title, location, department, job URL, apply URL, dates, and optional descriptions.
  • Best for: Recruiting market maps, hiring-signal lead generation, job-board refreshes, and warehouse-ready job data.
  • Pricing unit: A start event per run plus one item event for each saved job posting.
  • Login required: No. The Actor supports public ATS job boards only.

What can it do?

ATS Jobs Scraper extracts public ATS job postings from Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio job boards for recruiting, sales, market research, and job-data workflows.

It returns normalized job posting output such as title, location, department, company, apply URL, published date, and description.

  • Greenhouse: Public job boards.
  • Lever: Public job boards.
  • Ashby: Public hosted job pages.
  • Recruitee: Public careers pages.
  • SmartRecruiters: Public company pages.
  • Personio: Public job boards.

It saves one normalized dataset so every row has the same job fields regardless of source.

Who is it for?

  • Recruiting teams: Monitor hiring activity across target companies.
  • Sales teams: Find companies hiring for roles related to their product.
  • Market researchers: Track demand for skills, locations, departments, or seniority levels.
  • Job aggregators: Collect public postings from many employer-hosted boards.
  • Data teams: Standardize Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio data before loading it into a warehouse.

Why use one combined scraper?

Many company lists contain a mix of Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio boards.

Running one combined actor is simpler than maintaining separate workflows for each ATS.

The actor detects the source from URLs when possible and also accepts source-specific slugs.

Supported sources

Greenhouse boards include URLs such as https://boards.greenhouse.io/airbnb.

Lever boards include URLs such as https://jobs.lever.co/spotify.

Ashby boards include URLs such as https://jobs.ashbyhq.com/openai.

Recruitee boards include URLs such as https://jobs.recruitee.com/example-company.

SmartRecruiters boards include URLs such as https://jobs.smartrecruiters.com/SmartRecruiters.

Personio boards include URLs such as https://egym.jobs.personio.de.

Only public, no-login job boards are supported.

What data can you extract?

Each job posting can include:

Field Description
source greenhouse, lever, ashby, recruitee, smartrecruiters, or personio
companySlug Board slug or company identifier
companyName Public company name when available
jobId Source job id
title Job title
location Primary location text
department Department when available
team Team when available
workplaceType Remote / hybrid / onsite signal when available
employmentType Full-time, part-time, contract, or commitment text
compensation Public compensation summary when available
jobUrl Public job page URL
applyUrl Public apply URL when available
description Plain text job description when requested
descriptionHtml HTML description when requested
publishedAt Public creation or published date
updatedAt Public updated date
sourceRawMetadata Useful source-specific extras
scrapedAt Timestamp for this run

Quick start

  1. Open the actor on Apify.
  2. Add public Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, or Personio URLs in Mixed ATS board URLs.
  3. Set Maximum jobs.
  4. Choose whether to include descriptions.
  5. Run the actor.
  6. Export the dataset as JSON, CSV, Excel, XML, or via API.

Input notes

Mixed ATS board URLs

Use startUrls when you have a mixed list of public board URLs.

The actor auto-detects Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, or Personio from each URL.

Greenhouse board tokens or URLs

Use greenhouseBoards for Greenhouse-only inputs.

Examples:

  • airbnb
  • https://boards.greenhouse.io/airbnb

Lever company slugs or URLs

Use leverCompanies for Lever-only inputs.

Examples:

  • spotify
  • https://jobs.lever.co/spotify

Ashby board slugs or URLs

Use ashbyBoards for Ashby-only inputs.

Examples:

  • openai
  • https://jobs.ashbyhq.com/openai

Recruitee company slugs or URLs

Use recruiteeCompanies for Recruitee-only inputs.

Examples:

  • example-company
  • https://jobs.recruitee.com/example-company

SmartRecruiters company slugs or URLs

Use smartRecruitersCompanies for SmartRecruiters-only inputs.

Examples:

  • SmartRecruiters
  • https://jobs.smartrecruiters.com/SmartRecruiters

Personio company slugs or URLs

Use personioCompanies for Personio-only inputs.

Examples:

  • egym
  • https://egym.jobs.personio.de

Maximum jobs

maxItems limits saved jobs across all sources.

Set it low for tests and higher for production jobs.

Include descriptions

Turn on includeDescriptions when you need full job descriptions.

Turn it off when you only need listings and want faster runs.

Filtering jobs

Use departmentFilter to match department or team text.

Use locationFilter to match location text.

Use keywordFilter to match title and description text.

Filters are case-insensitive.

Example input

{
  "startUrls": [
    { "url": "https://boards.greenhouse.io/airbnb" },
    { "url": "https://jobs.lever.co/spotify" },
    { "url": "https://jobs.ashbyhq.com/openai" },
    { "url": "https://jobs.recruitee.com/example-company" },
    { "url": "https://jobs.smartrecruiters.com/SmartRecruiters" },
    { "url": "https://egym.jobs.personio.de" }
  ],
  "maxItems": 30,
  "includeDescriptions": true,
  "locationFilter": "remote"
}

Example output

{
  "source": "lever",
  "companySlug": "spotify",
  "companyName": null,
  "jobId": "abc123",
  "title": "Data Engineer",
  "location": "New York",
  "department": "Engineering",
  "team": "Data Platform",
  "workplaceType": "hybrid",
  "employmentType": "Full-time",
  "compensation": null,
  "jobUrl": "https://jobs.lever.co/spotify/...",
  "applyUrl": "https://jobs.lever.co/spotify/.../apply",
  "description": "Plain text description...",
  "publishedAt": "2026-06-01T00:00:00.000Z",
  "updatedAt": null,
  "scrapedAt": "2026-06-24T00:00:00.000Z"
}

Tips for best results

  • Use source URLs: Use public company career board URLs, not search engine result URLs.
  • Confirm empty boards: If one board returns no jobs, confirm the company still uses that ATS.
  • Choose specific inputs when known: Use source-specific fields when you already know the ATS type.
  • Speed up count checks: Set includeDescriptions to false for fast job-count monitoring.
  • Enrich text workflows: Set includeDescriptions to true for keyword analysis and enrichment workflows.

Integrations

Send the dataset to Google Sheets for recruiter review.

Load JSON into BigQuery, Snowflake, Postgres, or DuckDB.

Trigger the actor from Zapier or Make when a target-account list changes.

Use Apify webhooks to notify your team when new postings are scraped.

Combine with enrichment tools to classify roles, seniority, and skills.

API usage: Node.js

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/ats-jobs-scraper').call({
  startUrls: [{ url: 'https://jobs.lever.co/spotify' }],
  maxItems: 20
});
console.log(run.defaultDatasetId);

API usage: Python

from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/ats-jobs-scraper').call(run_input={
    'startUrls': [{'url': 'https://boards.greenhouse.io/airbnb'}],
    'maxItems': 20,
})
print(run['defaultDatasetId'])

API usage: cURL

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~ats-jobs-scraper/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"startUrls":[{"url":"https://jobs.ashbyhq.com/openai"}],"maxItems":20}'

MCP and AI agents

Use the actor from Claude Desktop or Claude Code through the official Apify MCP server.

MCP tool URL format:

https://mcp.apify.com?tools=fetch_cat/ats-jobs-scraper

Claude Code setup example:

claude mcp add apify-ats-jobs "https://mcp.apify.com?tools=fetch_cat/ats-jobs-scraper"

Claude Desktop JSON config example:

{
  "mcpServers": {
    "apify-ats-jobs": {
      "url": "https://mcp.apify.com?tools=fetch_cat/ats-jobs-scraper"
    }
  }
}

Example prompts:

  • “Scrape these ten ATS boards and summarize remote engineering roles.”
  • “Find companies hiring sales engineers in Europe.”
  • “Compare new AI infrastructure job postings across this target account list.”

Public data and legality

The actor collects publicly available job postings.

It does not log in, bypass private accounts, or access employer-only candidate data.

Always review source website terms and your local laws before using scraped data.

Limitations

  • Public boards only: v1 covers Greenhouse, Lever, Ashby, Recruitee, SmartRecruiters, and Personio where the tenant exposes public listings without login or private data.
  • Career pages can move: Some companies customize or migrate career pages, which can cause empty results.
  • Fields vary by ATS: Descriptions and metadata depend on the source system and employer configuration.

Automation and data handling

  • Data freshness: Each run fetches current public data and records scrapedAt for traceability.
  • Export formats: Apify datasets can be exported as JSON, CSV, Excel, XML, RSS, or HTML.
  • Scheduling: Use Apify schedules to monitor the same company list daily or weekly.
  • Webhooks: Use Apify webhooks to trigger downstream workflows after each successful run.
  • Storage: Results are saved to the default Apify dataset for the run.
  • Privacy: The Actor does not collect private applicant data or candidate profiles.

Support

If a run fails, returns no data, or a field looks wrong, open an issue from the Actor page.

Please include the Apify run ID or run URL, input JSON, one example public URL, query, or input item, what you expected, and what the dataset returned. Small reproducible inputs make parsing or site-layout issues much faster to fix.

Common questions

Questions and answers reused from the canonical actor README.

Why did a board return zero jobs?

The company may have no open roles, may use a different ATS, or may have changed its public board URL.

Why is a field null?

Not every ATS exposes every field. The actor keeps a stable schema and uses null when public data is unavailable.

Why are descriptions slower?

Descriptions can require more data per job, especially for Ashby detail pages. Disable descriptions for fast listing checks.