Job Change Tracker: Greenhouse, Lever, Ashby, Workday & more
Pricing
from $1.00 / 1,000 job row (new, updated or unchanged)s
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
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 aschangeType: "new". The response is capped bymaxItems, which defaults to 100. - Jobs beyond
maxItemson the first call are still recorded as seen. They are not reported asnewlater, so the first call works as a baseline. To get the complete current list once, useoutputMode: "all"with a highmaxItems. - 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
OUTPUTkey-value record.
Input: careers page URLs or ATS job board slugs
| Field | Default | Meaning |
|---|---|---|
companies | demo list | Careers 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). |
outputMode | changes | changes = new + updated + removed. new = only new jobs. all = every open job plus removed ones. |
maxItems | 100 | Maximum rows per run. Raise it for full exports. |
stateStoreName | ats-jobs-state | Name 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. |
searchDescription | true | Also 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. |
remoteOnly | false | Only jobs flagged as remote. |
companyNameOverrides | {} | { "slug" or "platform:slug": "Display Name" } |
resolveCompanyNames | true | Read the Lever/Ashby board page title once to get the real company name. |
workdayMaxJobs | 3000 | Workday returns 20 jobs per request; boards above this cap are read partially and flagged truncated in the summary. |
smartRecruitersDetails, smartRecruitersMaxDetails | false, 500 | Optional extra request per SmartRecruiters posting. It checks that the posting is active and detects description edits. |
maxConcurrency, minRequestIntervalMs, cacheTtlMinutes | 5, 300, 0 | Throughput and politeness controls. |
Output fields: job posting metadata only (no descriptions or salaries)
| Field | Type | Meaning |
|---|---|---|
id | string | Stable key platform:companySlug:sourceId. Use it to deduplicate. |
changeType | new / updated / unchanged / removed | Change since the previous run with the same stateStoreName. unchanged appears only in outputMode: "all". |
changedFields | string[] | 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. |
source | string | greenhouse, lever, lever-eu, ashby, workday, smartrecruiters, recruitee, workable or personio. |
sourceId | string | Posting ID on the platform. |
companySlug, company | string | Board slug and display name. |
title | string | Job title. On removed rows, the last title seen. |
department, team | string | null | When provided by the platform. |
locations | string[] | Locations as published. |
isRemote | boolean | null | Flagged remote by the platform, or a location says remote. |
workplaceType | string | null | remote, hybrid or onsite, when known. |
employmentType | string | null | Full-time, contract, intern, etc. |
postedAt, updatedAt | ISO 8601 | null | Publication and last-edit time on the platform. updatedAt comes from Greenhouse and Recruitee only. |
url | string | Public posting URL. Open it to read the full posting. |
applyUrl | string | null | Application page link. The Actor never applies. |
firstSeenAt, lastSeenAt | ISO 8601 | First time this watchlist saw the job, and the current run time. |
removedAt | ISO 8601 | On removed rows only. |
isFirstRunForBoard | boolean | true 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, andunchangedrows inoutputMode: "all"). - Free:
removedrows, and anything dropped by your filters. A dailychangesrun 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.
postedAtis 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
smartRecruitersDetailsoff (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.