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

Job Change Tracker: Greenhouse, Lever, Ashby & more

Pricing

from $1.00 / 1,000 results

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

Job Change Tracker: Greenhouse, Lever, Ashby & more

Track open roles at any company on 6 ATS platforms in one clean schema. Each run flags jobs as new, updated or removed since last time, with changed fields listed. Paste slugs or careers URLs. No login, no proxies. $1 per 1,000 current jobs; removed rows are free.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Ressa

Ressa

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Changed in 0.1.5: output is now metadata-only — description and salary fields were removed, and the default output mode is now changes-only (max 100 items). Pin build 0.1.4 if you need the old output.

Job posting change detection for AI agents: Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee & Workable

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, SmartRecruiters, Recruitee, or Workable. 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: contact ressatools@mail.grokbot.com. We act on verified requests from employers or platforms within 5 business days.

Quick start (agents and API)

{ "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

FieldDefaultMeaning
companiesdemo listCareers URLs, platform:slug (greenhouse:, lever:, lever-eu:, ashby:, smartrecruiters:, recruitee:, workable:), or bare slugs. Bare slugs are probed on all six platforms.
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.
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 (metadata only)

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, smartrecruiters, recruitee or workable.
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 it 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.

Limitations

  • Only these six platforms. Workday, iCIMS, Taleo and Personio are not supported.
  • 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.