Job Change Tracker: Greenhouse, Lever, Ashby, Workday & more avatar

Job Change Tracker: Greenhouse, Lever, Ashby, Workday & more

Pricing

from $1.00 / 1,000 job row (new, updated or unchanged)s

Go to Apify Store
Job Change Tracker: Greenhouse, Lever, Ashby, Workday & more

Job Change Tracker: Greenhouse, Lever, Ashby, Workday & more

Detect new, updated and removed job postings at any company on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable or Personio. Metadata only, no login, no proxies. Built for hiring signals, competitor tracking, job alerts and AI agents.

Pricing

from $1.00 / 1,000 job row (new, updated or unchanged)s

Rating

0.0

(0)

Developer

Ailu Studio

Ailu Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Security

Limited permissions

Share

Job Change Tracker: new, updated and removed job postings on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable and Personio

Job posting change detection for AI agents. Give the Actor a list of companies and it tells you which job postings appeared, changed or disappeared since the previous run. The input is careers-page URLs or board slugs. The output is one small metadata row per job: id, title, URL, company, locations, dates and change type. Job descriptions and salaries are never returned. Defaults are small and safe for tool calls (outputMode: "changes", maxItems: 100), so it works well as an MCP tool, in scheduled automations, and in plain API calls.

Not affiliated with Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable or Personio. This Actor reads only the public, unauthenticated job-board endpoints those platforms provide for employers' career sites. Job content belongs to the employers who posted it. Removal / takedown requests: open a ticket in the Issues tab of this Actor. Verified requests from employers or platforms are handled within 5 business days.

Use cases: hiring signals, competitor tracking and job alerts

  • Hiring signals for sales and recruiting: see which companies on your list opened new roles this week.
  • Competitor and market tracking: follow how a team or region grows or shrinks over time.
  • Personal job alerts: get only the new postings that match your keywords or locations.

Quick start: job posting change alerts via API, MCP or a schedule

{ "companies": ["https://jobs.lever.co/palantir", "https://jobs.ashbyhq.com/ramp", "stripe"] }
  • First call for a given stateStoreName: every open job is reported as changeType: "new". The response is capped by maxItems, which defaults to 100.
  • Jobs beyond maxItems on the first call are still recorded as seen. They are not reported as new later, so the first call works as a baseline. To get the complete current list once, use outputMode: "all" with a high maxItems.
  • Later calls: only the differences are returned. A call where nothing changed returns 0 rows.
  • Separate watchlists: give each one its own stateStoreName, for example "competitors" or "portfolio".
  • Run summary: the per-company result (jobs found, new/updated/removed counts, errors) is in the OUTPUT key-value record.

Input: careers page URLs or ATS job board slugs

FieldDefaultMeaning
companiesdemo listCareers URLs, platform:slug (greenhouse:, lever:, lever-eu:, ashby:, smartrecruiters:, recruitee:, workable:, personio:), or bare slugs. Bare slugs are probed on every platform except Workday (pass the Workday careers URL, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite).
outputModechangeschanges = new + updated + removed. new = only new jobs. all = every open job plus removed ones.
maxItems100Maximum rows per run. Raise it for full exports.
stateStoreNameats-jobs-stateName of the "memory" used to compare runs. Use one per watchlist.
keywords–Keeps jobs whose title contains any of these words (case-insensitive). Descriptions are also matched while processing if searchDescription is on.
searchDescriptiontrueAlso match keywords against the description. The description is used only for matching and is never output or stored.
locations–Case-insensitive substring match on locations. Remote also matches jobs flagged as remote.
remoteOnlyfalseOnly jobs flagged as remote.
companyNameOverrides{}{ "slug" or "platform:slug": "Display Name" }
resolveCompanyNamestrueRead the Lever/Ashby board page title once to get the real company name.
workdayMaxJobs3000Workday returns 20 jobs per request; boards above this cap are read partially and flagged truncated in the summary.
smartRecruitersDetails, smartRecruitersMaxDetailsfalse, 500Optional extra request per SmartRecruiters posting. It checks that the posting is active and detects description edits.
maxConcurrency, minRequestIntervalMs, cacheTtlMinutes5, 300, 0Throughput and politeness controls.

Output fields: job posting metadata only (no descriptions or salaries)

FieldTypeMeaning
idstringStable key platform:companySlug:sourceId. Use it to deduplicate.
changeTypenew / updated / unchanged / removedChange since the previous run with the same stateStoreName. unchanged appears only in outputMode: "all".
changedFieldsstring[]On updated rows only. Any of title, department, team, locations, workplaceType, employmentType, salary, description. For salary and description, only the fact that they changed is reported, never the content.
sourcestringgreenhouse, lever, lever-eu, ashby, workday, smartrecruiters, recruitee, workable or personio.
sourceIdstringPosting ID on the platform.
companySlug, companystringBoard slug and display name.
titlestringJob title. On removed rows, the last title seen.
department, teamstring | nullWhen provided by the platform.
locationsstring[]Locations as published.
isRemoteboolean | nullFlagged remote by the platform, or a location says remote.
workplaceTypestring | nullremote, hybrid or onsite, when known.
employmentTypestring | nullFull-time, contract, intern, etc.
postedAt, updatedAtISO 8601 | nullPublication and last-edit time on the platform. updatedAt comes from Greenhouse and Recruitee only.
urlstringPublic posting URL. Open it to read the full posting.
applyUrlstring | nullApplication page link. The Actor never applies.
firstSeenAt, lastSeenAtISO 8601First time this watchlist saw the job, and the current run time.
removedAtISO 8601On removed rows only.
isFirstRunForBoardbooleantrue on a board's first run, when all jobs are new.

Removed rows contain id, source, company, companySlug, title, locations, isRemote, url, changeType, firstSeenAt, removedAt.

{
"id": "lever:palantir:6ed76ce8-4156-4b60-b120-403538bd66cd", "changeType": "updated", "changedFields": ["title"],
"source": "lever", "sourceId": "6ed76ce8-4156-4b60-b120-403538bd66cd", "companySlug": "palantir", "company": "Palantir Technologies",
"title": "Senior Administrative Business Partner", "department": null, "team": "Administrative",
"locations": ["Singapore, Singapore"], "isRemote": false, "workplaceType": "hybrid", "employmentType": "Full-time",
"postedAt": "2026-08-11T10:58:11.368Z", "updatedAt": null,
"url": "https://jobs.lever.co/palantir/6ed76ce8-…", "applyUrl": "https://jobs.lever.co/palantir/6ed76ce8-…/apply",
"firstSeenAt": "2026-10-01T00:00:00.000Z", "lastSeenAt": "2026-10-02T00:00:00.000Z", "isFirstRunForBoard": false
}

How the job board change tracker behaves

  • Metadata only. The output never includes job descriptions or salary. The saved state holds metadata plus hashes of salary and description, which is enough to detect edits without storing any text. State from version 0.1.4 and earlier is migrated automatically and produces no false "updated" rows.
  • Safe state handling. If a board fails in one run, its previous snapshot is kept, so you never get a burst of false "removed" rows. One bad company never fails the run.
  • Polite and read-only. The Actor spaces requests per host, can cache responses, and retries with backoff on 429/5xx. It uses GET requests only and never submits applications. Unlisted postings are excluded: Ashby isListed:false, non-public or inactive SmartRecruiters postings, and unpublished Recruitee offers. Workday is read through the same JSON endpoint the public careers site uses (POST, no login).

Pricing

  • $1.00 per 1,000 current job rows (new, updated, and unchanged rows in outputMode: "all").
  • Free: removed rows, and anything dropped by your filters. A daily changes run where nothing changed costs nothing beyond platform usage.
  • Example: a 50-company watchlist with ~5,000 open roles costs about $5 on the first run; later daily runs usually bill only the few hundred new or updated roles a month.

Limitations and supported ATS platforms

  • Eight platforms: Greenhouse, Lever (global and EU), Ashby, Workday, SmartRecruiters, Recruitee, Workable and Personio. iCIMS, Taleo, BambooHR and Teamtailor are not supported yet.
  • Workday exposes only list-level fields (title, location text, posting age, requisition ID). Department, employment type and exact posting dates are not available without one request per job, which this Actor does not make. postedAt is derived from "Posted N days ago" and is accurate to the day.
  • Personio reads the public XML feed (<company>.jobs.personio.de/xml). Companies that disabled the feed return no jobs.
  • SmartRecruiters company IDs are case-sensitive, and an unknown ID returns an empty list. With smartRecruitersDetails off (the default), description-only edits on SmartRecruiters are not detected.
  • Workable's public widget endpoint is undocumented and may change.
  • The data is whatever the employer published. It is not verified.