Job Change Tracker: Greenhouse, Lever, Ashby & more
Pricing
from $1.00 / 1,000 results
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
Maintained by CommunityActor 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 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
| Field | Default | Meaning |
|---|---|---|
companies | demo list | Careers URLs, platform:slug (greenhouse:, lever:, lever-eu:, ashby:, smartrecruiters:, recruitee:, workable:), or bare slugs. Bare slugs are probed on all six platforms. |
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. |
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 (metadata only)
| 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, smartrecruiters, recruitee or workable. |
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 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
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.