ats-scrapers
An open dataset and Python toolkit for job data from ATS platforms and public sources.
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
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)
| 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)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| 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.