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
2
Bookmarked
33
Total users
5
Monthly active users
4 hours ago
Last modified
Categories
Share
ATS Jobs Feed & Bulk API | Download Millions of Jobs from 48 ATS Platforms
A high-throughput bulk feed across 48 ATS platforms — Greenhouse, Lever, Ashby, Workday, iCIMS, Taleo, SuccessFactors, Workable, BambooHR, and 39 more. Built for ETL pipelines, data warehouses, and full-inventory sync. The easiest way to try it: open the actor on Apify, click Try for free, and run with the default input (one small batch). Up to 1,000 jobs per batch with cursor pagination — sync millions of jobs across every major ATS in minutes via the Jobo Connect API.
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
- 48 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 - Built for ETL — designed for data warehouses, search-index builders, and analytics pipelines
- Schedule on Apify — run hourly / daily / weekly with built-in monitoring and webhook delivery
What's new in v2.0
The feed now calls Jobo Connect directly (POST /api/jobs/feed) and includes the same enriched job shape as the search actors:
- Far richer per-job data — AI-extracted
qualifications(typed hard / soft skills, education, certifications),responsibilities[],benefits[],summary(one-paragraph AI summary),normalized_title. - Enriched company object —
company.industries[],company.summary,company.logo_url,company.website,company.details_url. - Geocoded locations — every
locations[]entry includes resolvedcity/region/countryandlatitude/longitudewhen geocodable. - 48 platforms — up from 13 in v1.x.
work_modelsfilter —remote,hybrid,onsite.- Work-authorization signals —
is_work_auth_required,is_h1b_sponsor,is_clearance_requiredflags per job.
What data can ATS Jobs Feed extract?
| Data point | Description |
|---|---|
| Job title | Raw + canonical normalized_title |
| Company | Name, logo, website, summary, industries, details_url |
| Location | Raw string + geocoded city / region / country / lat / lon |
| Salary | Min / max, currency, period |
| Employment type | full_time / part_time / contract / internship / freelance / temporary |
| Workplace type | remote / hybrid / onsite |
| Experience level | entry / mid / senior / lead / executive |
| Skills | AI-extracted, typed hard / soft |
| Responsibilities & benefits | Bullet lists from description |
| Description | Full text, HTML stripped |
| AI summary | 2–3 sentence role recap |
| Listing & apply URL | Canonical URLs on the source ATS |
| Work-auth signals | is_work_auth_required, is_h1b_sponsor, is_clearance_required |
| Source | Which of the 48 ATSes the job came from |
| Dates | date_posted, created_at, updated_at |
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: [...1000 rows], next_cursor: "def456...", has_more: true}...Request → {batch_size: 1000, cursor: "xyz789..."}Response → {jobs: [...300 rows], next_cursor: null, has_more: false}
The actor loops max_batches times automatically. The final cursor is stored under the FEED_METADATA key for resumable runs.
How do I use ATS Jobs Feed for a bulk job sync?
- Sign in to Apify.
- Open the actor page at apify.com/jobo.world/ats-jobs-feed.
- Pick a batch profile. For a smoke test set
batch_size: 10, max_batches: 1. For a real run,batch_size: 1000, max_batches: 100. - (Optional) narrow with
sources/locations/posted_after— e.g.posted_after: "1 day ago"for an incremental nightly sync. - Start the run. Watch the log; each batch is saved to the dataset as it completes.
- Download the dataset as JSON / CSV / XLSX, or ingest directly into your warehouse via Apify's webhook integrations.
- Save the cursor. Read
FEED_METADATA.last_cursorfrom the run's key-value store and pass it ascursorin the next run to resume.
Input
Configure the actor on the Input tab in the Apify UI.
| 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 first request. |
locations | Array | [] | Structured location filters. Each entry is {country, region?, city?}. Match ANY. |
sources | Array | [] | ATS source ids (e.g. ["greenhouse", "lever"]). Leave empty for all 48. |
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. |
Example locations shape
"locations": [{ "country": "United States" },{ "country": "Germany", "region": "Bavaria" },{ "country": "United Kingdom", "city": "London" }]
Output
The feed returns the same enhanced job shape as ATS Jobs Search. See that actor's README for the full field reference.
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.
{"id": "a1b2c3d4-5678-90ab-cdef-1234567890ab","title": "Senior Backend Engineer","normalized_title": "backend_engineer","company": {"id": "f7c12345-1111-2222-3333-444455556666","name": "Acme Corp","industries": ["SaaS", "Developer Tools"],"details_url": "https://connect.jobo.world/api/companies/f7c12345-1111-2222-3333-444455556666"},"description": "...","summary": "Senior backend role on Acme's platform team — Go, Postgres, AWS.","listing_url": "https://boards.greenhouse.io/acme/jobs/12345","apply_url": "https://boards.greenhouse.io/acme/jobs/12345#apply","locations": [{ "location": "San Francisco, CA", "city": "San Francisco", "region": "California", "country": "United States", "latitude": 37.7749, "longitude": -122.4194 }],"compensation": { "min": 180000, "max": 240000, "currency": "USD", "period": "year" },"employment_type": "full_time","workplace_type": "hybrid","experience_level": "senior","qualifications": { "must_have": { "skills": [{ "name": "Go", "type": "hard" }] }, "preferred": {} },"responsibilities": ["Own service reliability for the core API", "..."],"benefits": ["Equity", "401k match", "..."],"is_work_auth_required": true,"is_h1b_sponsor": true,"is_clearance_required": false,"source": "greenhouse","date_posted": "2026-04-15T10:30:00Z","created_at": "2026-04-15T11:02:11Z","updated_at": "2026-04-30T08:14:55Z"}
Quick-start examples
Smoke test — one small batch
{"batch_size": 10,"max_batches": 1}
Daily incremental sync — last 24 hours, US only, all ATSes
{"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..."}
EU mid-market only, remote roles, last 7 days
{"batch_size": 1000,"max_batches": 50,"sources": ["personio", "workable", "recruitee"],"locations": [{ "country": "Germany" }, { "country": "Netherlands" }, { "country": "Spain" }],"work_models": ["remote"],"posted_after": "7 days ago"}
Tips & advanced options
- Use
posted_afterfor incremental syncs. A daily cron withposted_after: "1 day ago"is much 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 try to construct or modify them — they encode internal pagination state. Just pass them back as-is.
- Cursors can expire. If a saved cursor is older than a few days you may get a
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.- Search vs. Feed. For filtered, paginated user-facing queries use ATS Jobs Search. For bulk download / sync use this actor.
industriesempty for some companies. Long-tail SMBs may not be fully enriched yet — coverage is heaviest for large employers.- 503 means retry. A
503 Feed temporarily unavailableindicates a transient circuit-breaker trip. Wait theRetry-Afterseconds and retry the same cursor. Also check jobo.world/status.
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/page_size up to 100 each). 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?
48 as of v2.0 (up from 13 in v1.x). Greenhouse, Lever, Ashby, Workday, iCIMS, Taleo, SuccessFactors, Workable, BambooHR, Personio, SmartRecruiters, ADP, Oracle Cloud, and 35 more.
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. 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.
What changed from v1.x?
v2 calls the Jobo Connect API directly, expands from 13 to 48 ATS platforms, returns the new enriched job shape, and exposes work_models (remote / hybrid / onsite) plus richer filters. Cursor pagination, batch_size, locations, sources, and posted_after are unchanged.
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 48 ATSes |
| AI Deep Job Search | AI-powered relevance scoring |
| Workable Jobs Search | Single-ATS workflows for Workable |
| Greenhouse Jobs Search | Single-ATS workflows for Greenhouse |
| Workday Jobs Search | Single-ATS workflows for Workday |
| Crunchbase Company Lookup | Pair with company.details_url for funding / leadership data |
About Jobo
Jobo provides the most 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