ATS Job Board Feed Sync - Greenhouse, Lever, Ashby
Pricing
from $2.60 / 1,000 job changes
ATS Job Board Feed Sync - Greenhouse, Lever, Ashby
One actor for every major ATS: Greenhouse, Lever, Ashby, Workday. Auto-detect the job board behind a company, pull all open roles as a jobs JSON feed with one normalized schema. Incremental mode bills only NEW, UPDATED and REMOVED jobs - unchanged are tracked but never billed.
Pricing
from $2.60 / 1,000 job changes
Rating
0.0
(0)
Developer
Lake Sky
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
Share
What is ATS Job Feed Sync?
Every company runs its hiring on one of a handful of applicant tracking systems — Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Workday and others. Each one exposes a different JSON shape, with different field names for the same concept.
ATS Job Feed Sync hides that. You give it a list of companies, it auto-detects which board each one runs on, pulls every open role, and returns a single normalized schema regardless of the source.
Set it to incremental mode and it keeps a fingerprint index between runs, so the second run reports only what actually changed: new, updated and removed jobs. Unchanged roles are still tracked in the index, but they are never emitted and never billed — which is what makes a daily or hourly watch affordable.
Four guarantees about incremental billing
- The index survives between runs. It is stored in a named key-value store
(
ats-feed-index). Apify keeps named storages indefinitely, while default/unnamed storages are created per run and expire — that is why this Actor does not use the default store for state. - Shrinking your company list never creates phantom charges. Jobs belonging to companies you did
NOT request in a run are excluded from
removeddetection (removedScopeSkippedin the run summary), so changing 100 companies to 60 can never bill you for the 40 you dropped. - A cold start says so. If there is no usable index (first run, or you set
resetIndex: true), every job counts asnewand is billed in full — and the run status message says "Cold start" instead of quietly charging you the full-feed price while promising incremental rates. - Changing your company list does not erase the baselines you already paid for. Baselines are
stored per company, and a run only refreshes the companies it successfully fetched. Running
3 companies, then 1, then 3 again bills 0 on the third run — not 180. (Measured, see
research/apify/incremental-contract.cjs, assertions B6/B8.)
Because it talks to plain JSON endpoints rather than rendering pages, throughput is roughly 600,000 jobs per hour.
What can this Actor do?
- ✅ Auto-detect the ATS behind a company — you do not need to know which board they use
- ✅ One normalized schema across every supported board
- ✅ Incremental diffing —
new,updatedandremovedchange types with a persisted index - ✅ Opt-in Workday probing during auto-detect (off by default because it is slow)
- ✅ Optional full job descriptions in the output
- ✅ Run summary counters written to the key-value store, so you can see what happened without reading every row
- ✅ Scheduling, webhooks, API access and storage come from the Apify platform, so wiring this into a nightly pipeline is a few clicks
How to use it
- Open the Input tab.
- Add companies to
companies. Aslugis enough; addatsonly if you already know the board and want to skip detection. - Choose
mode:fullfor a one-off snapshot, orincrementalfor a recurring watch. - Click Start.
- Switch the dataset to the Changes only view to see just
new/updated/removedrows.
{"companies": [{ "slug": "stripe" },{ "slug": "palantir", "ats": "lever" }],"detectAts": true,"mode": "incremental"}
Pricing
This Actor is pay-per-event, billed on the job change event.
| Event | When it is charged | Price |
|---|---|---|
| Job change | One new, updated or removed job detected | $5 per 1,000 changes ( = $0.005 each ) |
| Actor start | Once per run, per GB of memory | $0.00005 per GB |
The important detail: in incremental mode, unchanged jobs are tracked but never charged. A company with 400 open roles that added 3 and closed 1 produces 4 billable events, not 400 — every single run after the first. Compare that with scrapers that re-bill the full job list on every run.
Apify's BRONZE, SILVER, GOLD, PLATINUM and DIAMOND plans reduce the unit price automatically.
Rough budgeting:
| Job changes detected | Cost |
|---|---|
| 1,000 | $5 |
| 5,000 | 5 × $5 |
| 10,000 | 10 × $5 |
Input
| Field | Type | Default | Notes |
|---|---|---|---|
companies | array | two samples | Objects with slug and optional ats |
detectAts | boolean | true | Auto-detect the board when ats is omitted |
includeWorkday | boolean | false | Also probe Workday during auto-detect |
mode | string | full | full or incremental |
includeDescription | boolean | true | Include job description text |
maxConcurrency | integer | 8 | Parallel company fetches |
requestTimeoutMs | integer | 25000 | Per-request timeout |
retries | integer | 1 | Retries per company |
Output
One dataset item per detected change:
{"changeType": "new","title": "Senior Backend Engineer","company": "Stripe","department": "Engineering","location": "Remote, US","applyUrl": "https://boards.greenhouse.io/stripe/jobs/1234567"}
The run also writes a SUMMARY record to the key-value store with aggregate counters (jobs seen, changes emitted, ATS detected per company) plus the incremental index used by the next diff.
Other Actors you may like
- Bulk Tech Stack Detector - BuiltWith/Wappalyzer Alternative — find companies running a given stack, then track their hiring here.
- Bulk Email Verifier — verify recruiting contacts before outreach.
- Bulk On-Page SEO Audit — 26 on-page checks across a whole sitemap.
FAQ
Do I need to know which ATS a company uses? No. Leave ats off and detectAts will find it.
Supply it explicitly only to skip detection.
What counts as a change? A job that appeared, disappeared, or whose normalized fingerprint changed. Unchanged roles are indexed, not emitted.
Is Workday supported? Yes, but probing it is slow, so includeWorkday is off by default. Turn it
on when you expect a target to run Workday.
What happens on the very first incremental run? There is no previous index, so every open role is
new — one full bill. Every run after that bills only the delta.