Skip to main content

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 Live jobs Companies Sources Dataset snapshot

ats-scrapers provides two layers:

  • A free, hosted dataset of live jobs from company career sites, ATS platforms, and public job feeds. The badges above read current counts and snapshot time directly from the live manifest.
  • Reusable scraper adapters for 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:

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: ADP Workforce Now, Greenhouse, Lever, Ashby, Workday, SmartRecruiters, SuccessFactors, Oracle, iCIMS, HERP Hire, HRMOS, Keka, Paycom, Softgarden, 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

Metadata

Release files for ats-scrapers 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ats-scrapers 0.3.0
File Size Uploaded Provenance Actions
ats_scrapers-0.3.0.tar.gz 292.8 kB Without provenance Details for ats_scrapers-0.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for ats-scrapers 0.3.0
File Interpreter ABI Platform Actions
ats_scrapers-0.3.0-py3-none-any.whl Python 3 none any Details for ats_scrapers-0.3.0-py3-none-any.whl

Total release size: 674.8 kB

Release files / ats_scrapers-0.3.0.tar.gz

Download URL ats_scrapers-0.3.0.tar.gz
Size 292.8 kB
Tags Source
SHA-256 checksum
How to use checksums
689262d35cb97102e98de656d18340996bde819f91409fff0650f449a57cd375
BLAKE2b-256 checksum
How to use checksums
9368be488d3703389a9508a9e49625242c4ac3c605e9fccfec3064e4c09d5fe9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.0

Release files / ats_scrapers-0.3.0-py3-none-any.whl

Download URL ats_scrapers-0.3.0-py3-none-any.whl
Size 382.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7d4dec9b9c3dab5729e444af0dd5b31aecfe63571b74d2106883a8ab723db485
BLAKE2b-256 checksum
How to use checksums
d7d7fd32a2002c5fd6434ec32b166525c6ac3c71e116398ed3c0dd283a64f99a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.0

Security for ats-scrapers 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page