Ats Jobs Feed
Pricing
from $0.10 / 1,000 jobs
Ats Jobs Feed
Bulk fetch jobs from 57 ATS platforms with cursor-based pagination. Up to 1000 jobs per batch. Perfect for data pipelines, job boards & incremental syncs.
Pricing
from $0.10 / 1,000 jobs
Rating
5.0
(1)
Developer
Enrico
Maintained by CommunityActor stats
3
Bookmarked
36
Total users
5
Monthly active users
5 days ago
Last modified
Categories
Share
ATS Jobs Feed & Bulk API | Download Millions of Jobs from 57 ATS Platforms
A high-throughput bulk feed across 57 ATS platforms — Greenhouse, Lever, Ashby, Workday, iCIMS, Taleo, SuccessFactors, Workable, BambooHR, and 48 more. Built for ETL pipelines, data warehouses, and full-inventory sync, with up to 1,000 jobs per batch and cursor pagination. Open the actor on Apify, click Try for free, and run with the default input (one small batch).
What can ATS Jobs Feed do?
- Bulk-optimized — up to 1,000 jobs per batch (vs. 100 max for the search actors)
- Cursor pagination — fast, stable iteration through millions of rows
- 57 ATS platforms — every major ATS in one feed
max_batchesdriver — pull 1 batch for a smoke test, 100 for a full inventory dump- Resumable — pass the previous run's
last_cursorto pick up where you left off - Incremental syncs — filter with
posted_afterfor cheap nightly deltas - Schedule on Apify — run hourly / daily / weekly with built-in monitoring and webhooks
Supported ATS platforms (57)
| Category | Platforms |
|---|---|
| Tech-focused | greenhouse, lever, ashby, workable, polymer, rippling, gem, kula |
| Enterprise HCM | workday, successfactors, taleo, oraclecloud, csod, dayforce, ultipro, paycom, paycor, paylocity, adpmyjobs, adpworkforcenow, isolved, pageup |
| SMB / Mid-market | bamboohr, breezy, jazzhr, personio, recruitee, smartrecruiters, freshteam, hibob, jobscore, recooty, zohorecruit, manatal, hireology |
| AI-native | eightfold, phenompeople, joincom |
| Specialty / Other | icims, jobvite, applicantpro, careerplug, careerpuck, comeet, dover, gohire, hirebridge, hirehive, hiringthing, homerun, pinpoint, rival, talnet, teamtailor, trakstar, trinet, werecruit |
Leave sources empty to pull all 57. Set it to a subset (e.g. ["greenhouse", "lever", "ashby"]) to scope the feed.
How does cursor pagination work?
The feed uses opaque cursors. The first call omits cursor; each response returns next_cursor and has_more — pass next_cursor back to fetch the next batch:
Request → {batch_size: 1000}Response → {jobs: [...1000 rows], next_cursor: "abc123...", has_more: true}Request → {batch_size: 1000, cursor: "abc123..."}Response → {jobs: [...300 rows], next_cursor: null, has_more: false}
The actor loops max_batches times automatically and stops early when has_more is false. The final cursor is written to the FEED_METADATA key in the run's key-value store for resumable runs.
Input
Configure the actor on the Input tab in the Apify UI.
Batching & pagination
max_batches × batch_size is your spend ceiling — e.g. 100 × 1000 pulls up to 100,000 rows. Start small.
| Parameter | Type | Default | Description |
|---|---|---|---|
batch_size | Integer | 500 | Jobs per batch. Min 1, max 1000. |
max_batches | Integer | 1 | How many batches to pull this run. Min 1, max 100. |
cursor | String | - | Opaque cursor from a previous response. Omit for the first request. |
Filters
| Parameter | Type | Description |
|---|---|---|
locations | Array | Structured filters; each entry is {country, region?, city?}. Jobs match ANY entry. |
sources | Array | ATS source ids (e.g. ["greenhouse", "lever"]). Leave empty for all 57. |
work_models | Array | remote, hybrid, onsite. Leave empty for all. |
posted_after | String | ISO 8601 or relative (7 days ago, 1 month). Use for incremental syncs. |
"locations": [{ "country": "United States" },{ "country": "Germany", "region": "Bavaria" },{ "country": "United Kingdom", "city": "London" }]
Company enrichment
| Parameter | Type | Default | Description |
|---|---|---|---|
include_company_details | Boolean | false | Off by default for bulk feeds. Enable to attach the full company profile (deduped per company across the run). Slower and uses more API calls. |
Output
The feed returns the same normalized job shape as ATS Jobs Search. The source field tells you which of the 57 ATSes the row came from. The full JSON Schema is on the Dataset Schema tab in the Apify UI.
Each call also writes a FEED_METADATA value to the key-value store with total_jobs, batches_processed, last_cursor (for resume), and has_more.
The Output tab offers two views: Job Listings (jobs with a lightweight company preview) and Company details (the full company profile, populated when include_company_details is enabled).
Job fields
| Name | Description | Type |
|---|---|---|
id | Stable Jobo job identifier | uuid |
title | Raw job title | text |
normalized_title | Canonical title for grouping across ATSes | text |
description | Full job description, HTML stripped | text |
summary | 2–3 sentence AI role recap | text |
listing_url | Canonical listing URL on the source ATS | uri |
apply_url | Direct apply URL | uri |
locations | Array of {location, city, region, country, latitude, longitude} (geocoded when possible) | object[] |
compensation | {min, max, currency, period} | object |
employment_type | full_time / part_time / contract / internship / freelance / temporary | text |
workplace_type | remote / hybrid / onsite | text |
experience_level | entry / mid / senior / lead / executive | text |
qualifications | must_have / preferred, each with typed skills ({name, type: hard|soft}), education, certifications | object |
responsibilities | Bullet list extracted from the description | text[] |
benefits | Bullet list extracted from the description | text[] |
is_work_auth_required | Work authorization required | bool |
is_h1b_sponsor | Employer sponsors H1B | bool |
is_clearance_required | Security clearance required | bool |
source | ATS platform the job came from | text |
date_posted | When the role was posted | timestamp |
valid_through | Expiry timestamp (null in most cases) | timestamp |
created_at | When Jobo first indexed the job | timestamp |
updated_at | Last time Jobo refreshed the job | timestamp |
Company fields
company is always present. With include_company_details: true it is the full enriched profile; with it off (the default for bulk feeds), only the preview fields below are returned. When enabled, companies are deduped across the whole run so each unique company is fetched once.
Preview (always present)
| Name | Description | Type |
|---|---|---|
id | Stable Jobo company identifier — use as your primary key | uuid |
name | Trade name | text |
website | Company marketing website | text |
logo_url | Hosted logo URL | text |
summary | Short company blurb | text |
industries | Vertical industry labels | text[] |
details_url | Link to GET /api/companies/{id} for the full profile | uri |
Enriched (when include_company_details is on)
| Name | Description | Type |
|---|---|---|
legal_name | Registered legal entity name | text |
primary_industry | Main industry label | text |
company_size | Headcount band, e.g. 1001-5000 | text |
revenue | Annual revenue band | text |
founding_year | Year founded | text |
headquarters_location | HQ city / region | text |
country_code | HQ country code | text |
operating_status | active / closed | text |
ipo_status | private / ipo / delisted | text |
company_type | for_profit / non_profit | text |
stock_symbol | Ticker symbol | text |
stock_exchange | Listing exchange | text |
funding_stage | Latest funding stage | text |
total_funding | Total funding raised | text |
investors | Investor names | text[] |
funding_rounds | Per-round detail (investment_type, announced_on, raised_amount, …) | object[] |
founders | Founder names | text[] |
leadership | {name, title, linkedin_url, avatar_url} | object[] |
ratings | {source, rating, url, review_count} (Glassdoor, etc.) | object[] |
press_references | {url, posted_on, title, publisher} | object[] |
h1b_annual_job_counts | {year, count} H1B history | object[] |
technology_list | Detected technologies | text[] |
tech_stack | {name, categories} | object[] |
page_rank | Domain authority score | number |
leadership_display | Display tag — "Name — Title" | text[] |
ratings_display | Display tag — "Glassdoor 4.3 (2.1k)" | text[] |
funding_display | Display tag — "Series F · $15.4B" | text[] |
The complete company schema (every field) is on the Dataset Schema tab and at docs.jobo.world/api-reference/companies/schema.
Quick-start examples
Smoke test — one small batch
{"batch_size": 10,"max_batches": 1}
Daily incremental sync — last 24 hours, US only
{"batch_size": 1000,"max_batches": 100,"locations": [{ "country": "United States" }],"posted_after": "1 day ago"}
Full-inventory pull — Greenhouse + Lever + Ashby
{"batch_size": 1000,"max_batches": 100,"sources": ["greenhouse", "lever", "ashby"]}
Resume from a previous run — read last_cursor from the previous run's FEED_METADATA, then:
{"batch_size": 1000,"max_batches": 100,"cursor": "eyJsYXN0X2lkIjoiZTIwM2YxZjAtMzMyOC0..."}
Tips & advanced options
- Use
posted_afterfor incremental syncs. A daily cron withposted_after: "1 day ago"is far cheaper than re-paginating the full feed. max_batches×batch_size= your spend ceiling. A run withmax_batches: 100, batch_size: 1000can pull up to 100,000 rows. Start small.- Cursors are opaque. Don't construct or modify them — they encode internal pagination state. Pass them back as-is.
- Cursors can expire. A cursor older than a few days may return
400 Invalid cursor. Omit the cursor to restart from the beginning. has_more=falsemeans you're done. The actor stops automatically when the feed reports no more pages.industriesempty for some companies. Coverage is heaviest for large employers; long-tail SMBs may not be fully enriched yet.- 503 means retry. A
503 Feed temporarily unavailableis a transient circuit-breaker trip — wait theRetry-Afterseconds and retry the same cursor. Check jobo.world/status. - Search vs. Feed. For filtered, paginated user-facing queries use ATS Jobs Search. For bulk download / sync, use this actor.
Use cases
| Industry | Use case |
|---|---|
| Data Platforms | Sync millions of jobs into your warehouse for analytics |
| Job Boards | Power your full job index with cross-ATS coverage |
| Search Infra | Build a custom job search engine on top of Jobo data |
| HR Tech | Run market-intel pipelines with bulk daily syncs |
| AI Training | Build job-data training sets for LLM fine-tunes / embeddings |
| Competitive Intel | Track hiring velocity across companies and sectors |
Is it legal to scrape ATS job listings?
Our scrapers are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our scrapers, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
FAQ
What's the difference between this and ATS Jobs Search?
ATS Jobs Search — filtered, paginated queries (page up to 20, page_size up to 100). Use it for job-board UIs, AI agents, and interactive lookups.
ATS Jobs Feed (this actor) — bulk download with cursor pagination, up to 1,000 jobs per batch. Use it for data warehouses, full-inventory sync, and ETL pipelines.
How many ATS platforms are supported?
57 — Greenhouse, Lever, Ashby, Workday, iCIMS, Taleo, SuccessFactors, Workable, BambooHR, Personio, SmartRecruiters, ADP, Oracle Cloud, and many more. See the full list above.
How do I do incremental syncs?
Combine posted_after with a daily/hourly schedule. A typical setup is posted_after: "1 day ago" running every 24h.
How do I resume a long-running sync?
Save FEED_METADATA.last_cursor from each run and pass it as cursor in the next run to pick up where you left off.
Are duplicates de-duped?
Yes — Jobo Connect de-duplicates by (company + canonical title + listing URL) before serving from the feed.
What's the maximum throughput?
batch_size: 1000 × max_batches: 100 = up to 100,000 jobs in one Apify run. For larger pulls, schedule multiple runs and resume with cursor.
Where can I check if the Jobo API is up?
At jobo.world/status — check there first if runs return 503 or hang.
Related actors
| Actor | Best for |
|---|---|
| ATS Jobs Search | Filtered, paginated queries across all 57 ATSes |
| AI Deep Job Search | AI-powered relevance scoring |
| Workable Jobs Scraper | Single-ATS workflows for Workable |
| Greenhouse Jobs Scraper | Single-ATS workflows for Greenhouse |
| Workday Jobs Scraper | Single-ATS workflows for Workday |
| Crunchbase Company Lookup | Pair with company.details_url for funding / leadership data |
Changelog
2.2
- Job description in the listing view. The full
descriptionfield now appears directly in the Job Listings view. - Company enrichment is opt-in.
include_company_detailsnow defaults to off — the listing view carries a lightweight company preview, and the Company details view holds the full profile when enabled.
2.1
- Company enrichment (opt-in). Enable
include_company_detailsto replace the company preview with the full company profile — funding, leadership, ratings, tech stack, H1B, and more. Off by default for bulk feeds; companies are deduplicated across the whole run. - New "Company details" output view and company tags in the overview.
2.0
- Expanded from 13 to 57 ATS platforms, calling Jobo Connect directly (
POST /api/jobs/feed). - Same enriched job shape as the search actors: typed
qualifications,responsibilities[],benefits[],summary,normalized_title, and geocodedlocations[]. - Added the
work_modelsfilter (remote/hybrid/onsite) and work-authorization signals (is_work_auth_required,is_h1b_sponsor,is_clearance_required). - Cursor pagination,
batch_size,max_batches,locations,sources, andposted_afterare unchanged from v1.x.
About Jobo
Jobo provides comprehensive job data infrastructure for developers and businesses. Our ATS Jobs Database powers job boards, AI agents, and HR tech platforms worldwide.
- Website: jobo.world
- Enterprise API: jobo.world/enterprise
- API status: jobo.world/status
- Support: enrico@jobo.world