# Pay Transparency Law Checker for Job Posts: US, Canada & EU (`nerolabs/pay-transparency-rules`) Actor

Checks whether a job post must show the pay range and exactly what it must include, for every US state and city law, Canadian provinces and all 27 EU countries under Directive 2023/970, with official sources. Inputs: job locations, remote, headcount, date. Charged per check. Agent-ready: x402, MCP.

- **URL**: https://apify.com/nerolabs/pay-transparency-rules.md
- **Developed by:** [Adam Pearce](https://apify.com/nerolabs) (community)
- **Categories:** Business, AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 rule lookups

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Pay Transparency Law Checker for Job Posts: US, Canada & EU

New pay transparency laws start every few months (US states, Canadian provinces, and every EU country under the EU directive from June 2026). This tells an agent, before the post goes live, which laws apply and exactly what the post must say.

Built for job boards, applicant tracking systems, recruiters and AI agents that write or publish job ads. Every answer names the law and links the official government page it came from, so a person can check it in one click.

### What it returns

- **Check a job post** (`mode: "check"`): Checks a job post against pay transparency laws before it is published. Give every location the job is based in or could be done from, whether it can be done remotely, the employer headcount and the posting date. Returns each law that applies (or may apply, with the reason), a merged checklist of what the post must include (for example a good-faith minimum and maximum pay range and a description of benefits), salary history question bans, penalties and the official source and citation per law. Covers US states and cities, Canadian provinces and the EU Pay Transparency Directive (EU) 2023/970 country by country, including countries that have not transposed it yet.
- **List the laws** (`mode: "list"`): Lists pay transparency laws with status (in force, enacted not yet in force, pending, EU transposition overdue), start date, who is covered and what a posting must include. Filter by country ("US", "CA", "EU" or an EU country name) and status.
- **Upcoming law changes** (`mode: "upcoming"`): Lists pay transparency laws and amendments starting in a date window, soonest first, so a recruiter or HR agent can prepare.

Answers that depend on something you did not say come back as the **safe** answer (the stricter rule) plus a `depends_on` note saying what would change it.

### Example input

```json
{
  "mode": "check",
  "locations": [
    "Denver, CO",
    "New York City",
    "Germany"
  ],
  "remote": false,
  "employer_employees": 250
}
```

### Example output (shortened)

```json
{
  "date": "2026-10-10",
  "locations": [
    "Denver, CO",
    "New York City",
    "... 1 more"
  ],
  "verdict": "The post must follow at least one pay transparency law (see checklist).",
  "post_must_include": [
    "hourly rate or salary, or a good faith range (min and max) the employer expects to pay",
    "general description of all benefits and other compensation (bonuses, commissions, other pay)",
    "... 5 more"
  ],
  "do_not_ask_salary_history_in": [
    "Colorado, US",
    "New York, US",
    "... 1 more"
  ],
  "laws_that_apply": [
    {
      "law": "Colorado Equal Pay for Equal Work Act (job posting rules)",
      "id": "US-CO",
      "where": "Colorado, US",
      "status_on_date": "in_force",
      "in_force_since": "2021-01-01",
      "must_include_in_posting": [
        "hourly rate or salary, or a good faith range (min and max) the employer expects to pay",
        "general description of all benefits and other compensation (bonuses, commissions, other pay)",
        "application deadline or expected hiring date (since 1 January 2024)"
      ],
      "on_request_only": false,
      "salary_history_ban": true,
      "penalties": "Fines of 500 to 10,000 US dollars per violation; each job posting is a separate violation.",
      "citation": "C.R.S. 8-5-201; 7 CCR 1103-13 (Equal Pay Transparency Rules)",
      "source": "https://cdle.colorado.gov/dlss/labor-laws-by-topic/equal-pay-for-equal-work-act",
      "verified_on_primary_source": true
    },
    {
      "law": "New York State pay transparency (Labor Law 194-b)",
      "id": "US-NY",
      "where": "New York, US",
      "status_on_date": "in_force",
      "in_force_since": "2023-09-17",
      "must_include_in_posting": [
        "compensation or range (minimum and maximum annual salary or hourly rate the employer believes in good faith to be accurate)",
        "job description, if one exists",
        "statement that pay is commission based, where that applies"
      ],
      "on_request_only": false,
      "salary_history_ban": true,
      "penalties": "Civil penalties under Labor Law 218: up to 1,000 US dollars for a first violation, 2,000 for a second, 3,000 for third and later.",
      "citation": "N.Y. Labor Law 194-b (salary history: 194-a)",
      "source": "https://www.nysenate.gov/legislation/laws/LAB/194-B",
      "verified_on_primary_source": true
    },
    "... 1 more"
  ],
  "not_law_yet": [
    {
      "law": "Germany: amendment of the Entgelttransparenzgesetz (not yet drafted publicly)",
      "id": "EU-DE",
      "where": "Germany",
      "status_on_date": "overdue",
      "in_force_since": null,
      "must_include_in_posting": [],
      "on_request_only": false,
      "salary_history_ban": null,
      "penalties": "Set nationally; see source.",
      "citation": "Entgelttransparenzgesetz (2017), amendment pending",
      "source": "https://eur-lex.europa.eu/legal-content/EN/NIM/?uri=CELEX:32023L0970",
      "verified_on_primary_source": false,
      "what_this_means": "This EU country missed the 7 June 2026 deadline to pass its own law. Employers there are not yet bound by a national posting rule, but a law can pass at any time; the EU directive sets the minimum it will require."
    }
  ],
  "eu_directive": {
    "law": "Pay Transparency Directive (EU) 2023/970",
    "id": "EU-DIR",
    "where": "EU",
    "status_on_date": "overdue",
    "in_force_since": "2023-06-06",
    "must_include_in_posting": [
      "initial pay or its range, based on objective gender neutral criteria, given in the vacancy notice, before the interview or otherwise (Article 5(1))",
      "relevant collective agreement provisions, where applicable",
      "gender neutral vacancy notices and job titles (Article 5(3))"
    ],
    "on_request_only": false,
    "salary_history_ban": true,
    "covered_employers": {
      "min_employees": 1,
      "counting": "All public and private employers for Article 5 recruitment rules; reporting thresholds by headcount.",
      "notes": null
    },
    "covered_jobs": "Applicants for employment (Article 5); workers for later articles.",
    "recruiters_and_job_boards": "Not specified at EU level; national laws decide.",
    "penalties": "Member states must set effective, proportionate and dissuasive penalties, including fines (Article 23).",
    "summary": "The EU directive gives job applicants the right to know the starting pay or range before the interview and bans questions about pay history. Each EU country must turn it into its own law; the deadline was 7 June 2026.",
    "upcoming_changes": [
      {
        "effective": "2027-06-07",
        "summary": "First gender pay gap reports: employers with 250 plus workers (then yearly) and 150 to 249 workers (then every 3 years)."
      },
      {
        "effective": "2031-06-07",
        "summary": "First reports for employers with 100 to 149 workers (then every 3 years)."
      }
    ],
    "citation": "Directive (EU) 2023/970, OJ L 132, 17.5.2023; Articles 5, 9, 23, 34",
    "source": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32023L0970",
    "verified_on_primary_source": true,
    "note": "Where a country has not passed its own law yet, the directive is not directly binding on private employers, but national law can change quickly; see the country entry."
  },
  "data_as_of": "2026-10-10"
}
```

### Inputs

- `locations`: Where the job is based or could be done. Each item is a string like "Denver, CO", "New York City", "Ontario, Canada", "Germany", or an object {country, state, city}.
- `remote`: True if the job can be done remotely. Many US laws then apply to remote jobs that could be done in their state.
- `remote_scope`: If remote, where from: "US", "EU", "Canada" or "anywhere". Default: the countries of the locations given.
- `employer_employees`: Total employees. Several laws only cover employers above a size. Optional.
- `date`: Posting date, YYYY-MM-DD. Defaults to today. Future dates include laws already enacted with a later start.
- `lookups`: many questions in one run (up to 1,000), each item with the fields above.

### Pricing

**$0.003 per answered lookup** (a listing mode is one lookup). Failed lookups (for example an address the US Census geocoder cannot find) are not charged. 1,000 lookups cost $3 US dollars.

### For AI agents

- Runs through Apify's MCP server (`https://mcp.apify.com/?tools=nerolabs/pay-transparency-rules`) and through x402, so an agent without an Apify account can pay per call.
- A **free MCP server** with the same rules is at `https://pay-transparency-rules.nerolabs.workers.dev/mcp` for chat use; this actor adds bulk runs, datasets, scheduling, webhooks and Apify billing.
- Part of **Nero Labs Rules**: tools that answer rules which change after a model's training cutoff. The others: US minimum wage, pay transparency, US sales tax nexus, data breach deadlines.

### Data and limits

- Built from primary sources only (statutes, regulators, revenue departments, official gazettes), each figure with its source URL and a `verified_on_primary_source` flag.
- Rules data is checked and updated by Nero Labs; every answer carries `data_as_of`.
- Information, not legal or tax advice. Check the linked source before acting on a close call.

# Actor input Schema

## `mode` (type: `string`):

check (default) answers one question, or every item in Lookups. The other modes list the rules themselves. Every mode is charged as one lookup per answer.

## `locations` (type: `array`):

Where the job is based or could be done. Each item is a string like "Denver, CO", "New York City", "Ontario, Canada", "Germany", or an object {country, state, city}.

## `remote` (type: `boolean`):

True if the job can be done remotely. Many US laws then apply to remote jobs that could be done in their state.

## `remote_scope` (type: `string`):

If remote, where from: "US", "EU", "Canada" or "anywhere". Default: the countries of the locations given.

## `employer_employees` (type: `integer`):

Total employees. Several laws only cover employers above a size. Optional.

## `date` (type: `string`):

Posting date, YYYY-MM-DD. Defaults to today. Future dates include laws already enacted with a later start.

## `lookups` (type: `array`):

Optional list of lookups for the check mode, up to 1,000 per run, each charged as one lookup. Each item uses the same field names as above, for example {"locations": \["Seattle, WA"], "employer_employees": 40}.

## `country` (type: `string`):

Used by the 'List the laws' mode. Optional: "US", "CA", "EU", or a country name such as "Germany".

## `status` (type: `string`):

Used by the 'List the laws' mode. Optional: in_force, enacted_not_yet_in_force, pending, transposition_overdue.

## `from_date` (type: `string`):

Used by the 'Upcoming law changes' mode. YYYY-MM-DD, default today.

## `days` (type: `integer`):

Used by the 'Upcoming law changes' mode. 1 to 730, default 365.

## Actor input object example

```json
{
  "mode": "check",
  "locations": [
    "Denver, CO",
    "New York City",
    "Germany"
  ],
  "employer_employees": 250
}
```

# Actor output Schema

## `results` (type: `string`):

One row per lookup (or per rule in a listing mode), with the official source for each answer.

## `summary` (type: `string`):

Lookups asked, answered and failed, and the free MCP server URL.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Denver, CO",
        "New York City",
        "Germany"
    ],
    "remote": false,
    "employer_employees": 250
};

// Run the Actor and wait for it to finish
const run = await client.actor("nerolabs/pay-transparency-rules").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": [
        "Denver, CO",
        "New York City",
        "Germany",
    ],
    "remote": False,
    "employer_employees": 250,
}

# Run the Actor and wait for it to finish
run = client.actor("nerolabs/pay-transparency-rules").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Denver, CO",
    "New York City",
    "Germany"
  ],
  "remote": false,
  "employer_employees": 250
}' |
apify call nerolabs/pay-transparency-rules --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nerolabs/pay-transparency-rules"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/GvbZawjcvRchrSvuK/builds/4hvABxvp1TQsYoROD/openapi.json
