ATS Job Board Feed Sync - Greenhouse, Lever, Ashby avatar

ATS Job Board Feed Sync - Greenhouse, Lever, Ashby

Pricing

from $2.60 / 1,000 job changes

Go to Apify Store
ATS Job Board Feed Sync - Greenhouse, Lever, Ashby

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

Lake Sky

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

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

  1. 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.
  2. Shrinking your company list never creates phantom charges. Jobs belonging to companies you did NOT request in a run are excluded from removed detection (removedScopeSkipped in the run summary), so changing 100 companies to 60 can never bill you for the 40 you dropped.
  3. A cold start says so. If there is no usable index (first run, or you set resetIndex: true), every job counts as new and 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.
  4. 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 diffingnew, updated and removed change 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

  1. Open the Input tab.
  2. Add companies to companies. A slug is enough; add ats only if you already know the board and want to skip detection.
  3. Choose mode: full for a one-off snapshot, or incremental for a recurring watch.
  4. Click Start.
  5. Switch the dataset to the Changes only view to see just new / updated / removed rows.
{
"companies": [
{ "slug": "stripe" },
{ "slug": "palantir", "ats": "lever" }
],
"detectAts": true,
"mode": "incremental"
}

Pricing

This Actor is pay-per-event, billed on the job change event.

EventWhen it is chargedPrice
Job changeOne new, updated or removed job detected$5 per 1,000 changes ( = $0.005 each )
Actor startOnce 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 detectedCost
1,000$5
5,0005 × $5
10,00010 × $5

Input

FieldTypeDefaultNotes
companiesarraytwo samplesObjects with slug and optional ats
detectAtsbooleantrueAuto-detect the board when ats is omitted
includeWorkdaybooleanfalseAlso probe Workday during auto-detect
modestringfullfull or incremental
includeDescriptionbooleantrueInclude job description text
maxConcurrencyinteger8Parallel company fetches
requestTimeoutMsinteger25000Per-request timeout
retriesinteger1Retries 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

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.