Skip to main content

4.2M+ live jobs from 63,000+ companies. An open dataset and Python toolkit for ATS and job-source data.

Project description

ats-scrapers

ats-scrapers

An open dataset and Python toolkit for job data from ATS platforms and public sources.

PyPI version Python versions License: MIT

ats-scrapers provides two layers:

  • A free, hosted dataset with 4.2M+ live jobs from 63,000+ companies across 49 sources.
  • More than 50 reusable scraper adapters, including Workday, Greenhouse, Lever, Ashby, SmartRecruiters, and SuccessFactors.

Jobs are collected from ATS endpoints, company career sites, and public job feeds, then normalized into one typed schema. Querying the hosted dataset requires no API key or account.

Install

pip install ats-scrapers

The package is imported as ats_scrapers. Optional extras add only what you need:

pip install "ats-scrapers[parquet]"   # query the full Parquet snapshot
pip install "ats-scrapers[scrapers]"  # run the scraper library
pip install "ats-scrapers[all]"       # install every runtime extra

Query the public dataset

from ats_scrapers import search

# Per-source searches work with the base install.
jobs = search(
    query="machine learning engineer",
    location="Paris",
    ats="greenhouse",
    limit=100,
)

# The result is a pandas DataFrame.
print(jobs[["company", "title", "location", "apply_url"]])

For practical full-dataset queries, install the parquet extra. The base install is intended for smaller per-source CSV slices.

from ats_scrapers import search

jobs = search(query="data engineer", remote=True, salary_min=80_000)

The live manifest contains current row counts and artifact URLs. See the job schema for field definitions and normalization rules.

Scrape a company

You don't need to know which ATS a company uses. Paste its careers URL:

from ats_scrapers import get_scraper_for_url

scraper = get_scraper_for_url("https://jobs.ashbyhq.com/openai")
jobs = scraper.fetch()

Or look it up by name in the hosted companies directory (63,000+ tenants):

from ats_scrapers import find_company
from ats_scrapers.scrapers import get_scraper

find_company("openai")          # → ats="ashby", slug="openai", url=...
scraper = get_scraper("ashby", "openai")
jobs = scraper.fetch()

Scraper classes are also available directly:

from ats_scrapers.scrapers import GreenhouseScraper

jobs = GreenhouseScraper("anthropic").fetch()

Scrapers are async-first — in async code (or for concurrency) use await scraper.afetch() instead. The sync fetch() also works from inside a running event loop (Jupyter, FastAPI): it transparently runs on a worker thread.

Scraper adapters include:

  • Major ATS platforms: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, SuccessFactors, Oracle, iCIMS, Workable, Personio, and more.
  • First-party company APIs: Amazon, Apple, Google, TikTok, and Uber.
  • Public and regional sources: EURES, Bundesagentur, Arbetsformedlingen, Welcome to the Jungle, and others.

Run python -c "from ats_scrapers import list_ats; print(*list_ats())" for the sources currently present in the hosted dataset. The dataset can list a source before this package ships a scraper for it — search() still returns those rows; only building your own scraper needs one. To skip sources without a scraper:

from ats_scrapers import list_ats
from ats_scrapers.scrapers import ScraperRegistry, get_scraper

scrapeable = [a for a in list_ats() if ScraperRegistry.has_scraper(a)]

Contributing

Contributions can add a source, improve an existing scraper, or add companies to the CSV inventories in ats-companies/. The scraper API is intentionally tiny: subclass BaseScraper, set ats, and implement async def afetch() using self.make_fetcher() for HTTP — retries, backoff, and error mapping come for free. See src/ats_scrapers/scrapers/greenhouse.py for a compact reference and the Job model in src/ats_scrapers/models.py for the schema you populate.

git clone https://github.com/kalil0321/ats-scrapers
cd ats-scrapers
uv sync --extra dev
uv pip install -r pipeline/requirements.txt  # repo-only ops/publisher tests
uv run pytest
uv run ruff check .

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ats_scrapers-0.2.0.tar.gz (212.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ats_scrapers-0.2.0-py3-none-any.whl (281.1 kB view details)

Uploaded Python 3

File details

Details for the file ats_scrapers-0.2.0.tar.gz.

File metadata

  • Download URL: ats_scrapers-0.2.0.tar.gz
  • Upload date:
  • Size: 212.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.1

File hashes

Hashes for ats_scrapers-0.2.0.tar.gz
Algorithm Hash digest
SHA256 3f9d4805ab497ac819456431c233de63e15e710646e091938833801f313cab1d
MD5 ebf0f7b912d54884a8231ebfa1d138e7
BLAKE2b-256 4eb60c1e948047bec7304eb45eb73ce6f3c3a596cd6e6b6685fa1e08373e46b4

See more details on using hashes here.

File details

Details for the file ats_scrapers-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for ats_scrapers-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 cc62376cac2b3e26fd8abe78c1ac5128beebeccba6caf95009a9c9fd45bf3701
MD5 a74924a9b1dc00a7410bbbe3f24037c9
BLAKE2b-256 4e00450723a1e264debfab42a13536864cbbbdaa8d89c69b38fa1726315f52d4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page