Ats Jobs Feed avatar

Ats Jobs Feed

Pricing

from $0.10 / 1,000 jobs

Go to Apify Store
Ats Jobs Feed

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

Enrico

Maintained by Community

Actor stats

2

Bookmarked

33

Total users

5

Monthly active users

4 hours ago

Last modified

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.

Run on Apify Service Status


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_batches driver — pull 1 batch for a smoke test, 100+ for a full inventory dump
  • Resumable — pass the previous run's last_cursor to 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 objectcompany.industries[], company.summary, company.logo_url, company.website, company.details_url.
  • Geocoded locations — every locations[] entry includes resolved city / region / country and latitude / longitude when geocodable.
  • 48 platforms — up from 13 in v1.x.
  • work_models filterremote, hybrid, onsite.
  • Work-authorization signalsis_work_auth_required, is_h1b_sponsor, is_clearance_required flags per job.

What data can ATS Jobs Feed extract?

Data pointDescription
Job titleRaw + canonical normalized_title
CompanyName, logo, website, summary, industries, details_url
LocationRaw string + geocoded city / region / country / lat / lon
SalaryMin / max, currency, period
Employment typefull_time / part_time / contract / internship / freelance / temporary
Workplace typeremote / hybrid / onsite
Experience levelentry / mid / senior / lead / executive
SkillsAI-extracted, typed hard / soft
Responsibilities & benefitsBullet lists from description
DescriptionFull text, HTML stripped
AI summary2–3 sentence role recap
Listing & apply URLCanonical URLs on the source ATS
Work-auth signalsis_work_auth_required, is_h1b_sponsor, is_clearance_required
SourceWhich of the 48 ATSes the job came from
Datesdate_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?

  1. Sign in to Apify.
  2. Open the actor page at apify.com/jobo.world/ats-jobs-feed.
  3. 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.
  4. (Optional) narrow with sources / locations / posted_after — e.g. posted_after: "1 day ago" for an incremental nightly sync.
  5. Start the run. Watch the log; each batch is saved to the dataset as it completes.
  6. Download the dataset as JSON / CSV / XLSX, or ingest directly into your warehouse via Apify's webhook integrations.
  7. Save the cursor. Read FEED_METADATA.last_cursor from the run's key-value store and pass it as cursor in the next run to resume.

Input

Configure the actor on the Input tab in the Apify UI.

ParameterTypeDefaultDescription
batch_sizeInteger500Jobs per batch. Min 1, max 1000.
max_batchesInteger1How many batches to pull this run. Min 1, max 100.
cursorString-Opaque cursor from a previous response. Omit for first request.
locationsArray[]Structured location filters. Each entry is {country, region?, city?}. Match ANY.
sourcesArray[]ATS source ids (e.g. ["greenhouse", "lever"]). Leave empty for all 48.
work_modelsArray[]remote, hybrid, onsite. Leave empty for all.
posted_afterString-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_after for incremental syncs. A daily cron with posted_after: "1 day ago" is much cheaper than re-paginating the full feed.
  • max_batches × batch_size = your spend ceiling. A run with max_batches: 100, batch_size: 1000 can 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=false means 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.
  • industries empty 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 unavailable indicates a transient circuit-breaker trip. Wait the Retry-After seconds and retry the same cursor. Also check jobo.world/status.

Use cases

IndustryUse case
Data PlatformsSync millions of jobs into your warehouse for analytics
Job BoardsPower your full job index with cross-ATS coverage
Search InfraBuild a custom job search engine on top of Jobo data
HR TechRun market-intel pipelines with bulk daily syncs
AI TrainingBuild job-data training sets for LLM fine-tunes / embeddings
Competitive IntelTrack hiring velocity across companies and sectors

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

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.


ActorBest for
ATS Jobs SearchFiltered, paginated queries across all 48 ATSes
AI Deep Job SearchAI-powered relevance scoring
Workable Jobs SearchSingle-ATS workflows for Workable
Greenhouse Jobs SearchSingle-ATS workflows for Greenhouse
Workday Jobs SearchSingle-ATS workflows for Workday
Crunchbase Company LookupPair 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.