Ashby Salary Monitor — Pay Range Changes & Job History
Pricing
Pay per usage
Ashby Salary Monitor — Pay Range Changes & Job History
Track published salary ranges on Ashby job boards. Get before/after ranges, new and reappeared jobs, and confirmed removals. No LLM or proxy required.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Viktor
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Ashby Salary Monitor
See when a company's published pay ranges change. Keep the old and new ranges, regional tiers, currencies and pay periods together with the original job link.
Designed for compensation research, recruiting teams and job-data pipelines watching a known list of Ashby employers. Also reports new listings, location changes, reappearances and confirmed removals.
Free beta: no developer fee. Standard Apify platform usage charges apply to your account.
The Console starts in snapshot mode so every successful check displays current jobs. Use changes mode below for a feed of differences.
Try one board
{"boards": ["Ashby"],"monitorId": "my-watchlist","outputMode": "changes","emitInitial": true,"removalConfirmations": 2}
The first run returns BASELINE rows: listings that already existed when monitoring began. Repeat with the same watch list name to get changes. An unchanged board returns no change rows; the SUMMARY record still shows jobs checked and salary coverage.
Schedule daily and export the dataset to JSON, CSV or Excel, or connect its API to your reporting workflow. The Actor itself does not send emails or Slack messages.
What you receive
| Field | Meaning |
|---|---|
changeType | BASELINE, NEW, CHANGED, REMOVED, REAPPEARED, or UNCHANGED in snapshot mode |
changedFields | Which tracked fields changed |
salaryRanges | Separate range per tier, currency and period; no conversion or averaging |
salaryRangesJson / previousSalaryRangesJson | CSV-friendly before/after range arrays |
salaryDataStatus | structured, summary_only, or not_published |
salarySummary | Source's salary wording, when available |
observedAt / previousObservedAt | Observation times, not claimed publication or closure times |
jobUrl | Original public posting |
eventId | Identifier for this observed event |
Example of a synthetic salary change:
{"changeType": "CHANGED","title": "Software Engineer","changedFields": ["salaryRanges"],"previousSalaryRangesJson": "[{\"tier\":\"EU\",\"currency\":\"EUR\",\"interval\":\"1 YEAR\",\"min\":100000,\"max\":140000}]","salaryRangesJson": "[{\"tier\":\"EU\",\"currency\":\"EUR\",\"interval\":\"1 YEAR\",\"min\":100000,\"max\":165000}]"}
Real baseline examples and the live verification record are in examples/. The synthetic demonstration is labeled separately.
Coverage and limitations
- Only the documented Ashby public posting API. No credentials, applicant data, private or explicitly unlisted jobs.
- Employers may publish salaries only in prose. This version does not extract numbers from descriptions, infer missing pay or promise universal salary coverage.
- Only base salary components are compared. Equity, bonuses, benefits and job-description changes are outside this version.
- Maximum 20 boards per run, 5,000 jobs and 16 MiB response per board. Oversized or malformed responses fail the board instead of saving a truncated snapshot.
- Two successful absences are required before
REMOVEDby default. A failed request neither advances absence counts nor overwrites history. A repeated valid but incomplete source response can still look like a removal. REMOVEDmeans no longer listed, not necessarily hired, expired or cancelled. No historical data exists before your first run. Removed listings are retained for 90 days; later reappearances are treated as new.- Run one schedule per watch list without overlap. A concurrent-write check catches some collisions, but there is no distributed atomic lock. Do not share a watch list across parallel runs.
- Output and state writes are not a single transaction. A storage failure can cause a later retry to repeat an observation. Exactly-once delivery is not promised.
- A partial source failure retains successful-board results, writes
SUMMARY, and marks the run failed so failure integrations can detect it.
Pricing
This beta has no developer fee: no charge per board or output row. Apify bills platform usage according to your plan; available platform credits can cover that usage. Free beta does not mean unlimited free compute or storage.
A cloud test of one board with 71 baseline rows used approximately $0.00058 of platform usage; an immediate repeat used approximately $0.00026. These are individual measurements, not a price guarantee, and exclude builds and subsequent storage. Larger boards, retries and frequent schedules cost more.
Start with one board and a daily schedule. Review your Apify usage and retain only the output you need. Any future paid pricing will be shown in the Store under Apify's pricing-change rules.
Local development
Node 22 or newer:
npm ci --ignore-scriptsnpm testnpm run demonpm run smokenpm run integration
smoke makes two public requests each to Ashby, Linear and Notion, saves aggregate measurements and one baseline sample per board. No accounts or paid services are used.
To run the Apify SDK locally, save the JSON input above to storage/key_value_stores/default/INPUT.json, then:
$APIFY_PURGE_ON_START=false npm start
Repeat with the same input to observe deltas. Local state lives in storage/key_value_stores/ashby-pay-<monitorId>; deleting only that directory resets this watch list. storage/ is ignored by Git and Docker.
Deployment and launch tracking: docs/launch.md. Research and economics: docs/research.md.