Pay Transparency Compliance Monitor
Pricing
from $20.00 / 1,000 posting checked (initial or changed)s
Pay Transparency Compliance Monitor
Screen every posting on Greenhouse, Lever and Ashby boards for potential pay-transparency issues under US state and city laws, then re-check on a schedule and get alerted when a pay range is removed or a new posting has none. Potential issues for human review, not legal advice. By Steadfeed.
Pricing
from $20.00 / 1,000 posting checked (initial or changed)s
Rating
0.0
(0)
Developer
Steadfeed
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Features
Share
Screen every job posting on a company's careers page for potential pay-transparency issues against US state and city laws (plus Canadian provinces and the EU directive as a note), then re-check on a schedule and get told when a pay range disappears, a new posting appears without one, or a flagged item is resolved. Every flagged item is a potential issue that needs human review, not a determination of non-compliance.
Works from the public job feeds behind Greenhouse, Lever and Ashby boards. No login, no access to your systems, no ATS integration.
Read this first. This Actor screens public posting text and lists potential issues. It does not decide whether any employer violated any law. Whether a law applies depends on facts it cannot see (employer size, where the worker will be based, internal vs. external posting, exemptions), and a pay range shown only on a rendered page or in an attachment cannot be seen. Treat every item as a prompt to look at the live posting; you and your counsel decide. Not legal advice.
Who it is for
- Recruiting agencies and HR consultants checking many clients' boards (one watchlist per client).
- HR and TA teams that want a weekly "did anyone publish a posting without a range?" alert.
- Developers and automation builders who need a posting-compliance check as an API step (Apify API, MCP, webhooks).
What you get per run
| Output | Where |
|---|---|
One audit row per posting: status potential_issue, review_suggested, no_issue_found, no_law_identified or unchecked, with findings (each with reviewPriority and requiresHumanReview: true), laws screened and source links | Dataset (view Posting audits) |
Change rows since the previous run: pay_range_removed, became_potential_issue, new_posting_potential_issue, resolved, pay_range_changed, posting_closed | Dataset (view Changes) |
| Digest with alerts, per-company table and a review list with wording to consider | Key-value store DIGEST_HTML, DIGEST_MD |
Webhook-ready report JSON (steadfeed.pay-posting-review-report/1) | Key-value store REPORT, optional webhookUrl POST |
| Run summary | Key-value store SUMMARY |
What it checks
- Pay range present in the posting (structured ATS fields first, then the description text), including single figures and open-ended "from / up to" amounts.
- Applicable laws from the location text. Remote US roles are screened against the states you hire in (
hiringStates), or every in-force state law if you leave it empty, and reported once per problem with the list of states. - Benefits description where the law asks for it (for example CO, WA, IL, MD, NJ, MN) and the application close date (Colorado). On remote roles these are low review priority.
- Range width: wide spreads (2x or more) are a "good-faith estimate" review flag, never a problem on its own.
- Employer size (
employeeCount): laws with higher thresholds are skipped and listed as skipped. - Laws not yet in force are skipped (for example Delaware starts 2027-09-26).
Statuses are deliberately cautious: unclear wording is review_suggested (unclear wording to look at), a failed lookup is unchecked (never counted as a potential issue and never billed), and a board that could not be read is reported as a board problem, never as missing ranges or closed postings.
How to read the results
| Status | Meaning |
|---|---|
potential_issue | A high-priority item was found (for example no pay range in the data we can read). Open the live posting and confirm before acting. |
review_suggested | Wording is unclear (for example only a single figure, or an unparseable pay line) or a lower-priority item was found. |
no_issue_found | Nothing was flagged by this screen. This is not a statement that the posting complies. |
no_law_identified | No pay-transparency law could be matched from the location text. Not a finding that none applies. |
unchecked | The lookup failed. Never billed, never counted. |
reviewPriority (high, medium, low) orders what to look at first. Remote roles list, per state, why that state's law may or may not reach the role (remoteApplicability), taken from the state's own guidance where available.
Scheduled monitoring
- Run once with a watchlist name (for example
acme-careers). That run is the baseline. - Schedule the same input (Apify Schedules) weekly or daily. Each run compares with the previous one, kept in a named storage
pay-monitor-<watchlist>in your account. - Optionally set
webhookUrlto receive the report JSON when there are alerts (Slack/Zapier/Make/n8n/your endpoint).
Changing the location, country, remote or title filters starts a new baseline so filtered-out postings are not reported as closed. Boards that were not fully listed (cap reached) never close postings.
Input
| Field | Meaning |
|---|---|
boardUrls | Public Greenhouse, Lever or Ashby board or job links (up to 50 URLs, 20 boards) |
watchlistId | Name of this watchlist (history is kept per name) |
trackChanges | Compare with the previous run (default true) |
hiringStates | States you hire in, for remote roles (for example ["CA","NY","WA","NYC"]) |
employeeCount | Skip laws above your size |
locations, countries, remoteOnly, titleKeywords | Optional filters |
maxJobsPerCompany | Cap per board (default 100) |
webhookUrl, webhookOnlyWhenAlerts | Optional report delivery to a public https URL |
Example: {"boardUrls":["https://job-boards.greenhouse.io/yourcompany"],"watchlistId":"yourcompany","hiringStates":["CA","NY","WA","CO"],"employeeCount":60}
Limits and honest caveats
- Reads the company's own ATS feed, not Indeed, LinkedIn or copies on other boards (those copies can differ). When the feed shows no range, the Actor also reads the posting's own public page once (plain HTTP, no JavaScript rendering) and reports where it found a range (
pay.pageCheck:found_on_page,confirmed_missingorpage_unavailable). Pages that need JavaScript, a login or that block automated requests cannot be read, so open a flagged posting and confirm before acting. - Workday, iCIMS and custom career pages are not supported yet.
- A range shown only as an image, a PDF or a gated page cannot be read. Wording such as "competitive salary" with no figures is reported as missing or needs review.
- Law summaries were checked against statute or agency pages on 2026-11-09 (see each entry's source link; entries not checked against a primary source say so). Laws change, thresholds and remote-work rules differ. Uncertain entries are flagged in the output (
ruleCaveat): Virginia's effective date and employer threshold could not be confirmed from a primary source, and the California, Illinois and Washington penalty and cure details come from public trackers (secondary sources). Verify with the linked sources. - This Actor is a screening aid. It makes no promise that a posting, an employer or a law check is complete or correct, and "no issue found" is never a statement of compliance.
- Heuristic text checks (benefits, close date) can miss unusual wording, which is why they are review items, not conclusions.
Pricing
Pay per event, no subscription. You pay only for postings actually checked:
| Event | Price | When |
|---|---|---|
Initial posting check (posting-audited) | $0.02 | The first time a posting is checked in a watchlist, and any time a posting has changed since its last check (text, location, pay figures or the resulting assessment). A changed posting gets a fresh assessment. |
Unchanged recheck (posting-rechecked) | $0.005 | A posting whose content fingerprint and assessment outcome are identical to its last paid check. The posting text is still re-read and re-screened every run, so a pay range that was removed or edited always shows up and is billed as a change, never as a recheck. |
| Actor start | $0.00005 per GB of memory started | Standard Apify start event (256 MB default). |
Free: postings that could not be checked (unchecked), change rows, digests, report JSON and webhook delivery.
How "unchanged" is decided: each run keeps a snapshot of every posting (a fingerprint of the posting text and extracted fields, plus the assessment outcome) in the named storage pay-monitor-<watchlist> in your account. A posting is billed at the recheck rate only if its fingerprint and outcome match that snapshot. With Track changes off, or on the first run of a watchlist, there is no snapshot, so every posting is billed as an initial check. Changing the watchlist name starts a new snapshot.
Cost examples (illustrative, before Apify's own platform usage, which is a small fraction of a cent per run): a 100-posting board is $2.00 for the first check; a weekly recheck with nothing changed is $0.50 per week; if 5 postings change, $0.50 + 5 x $0.015 more. Weekly monitoring is the recommended default; daily runs are supported and are billed the same way, so mostly unchanged postings cost $0.005 each per day. Set a maximum cost per run in Apify and the Actor stops cleanly at it.
Support
Issues and requests: use the Issues tab on this Actor page. Built by Steadfeed.