Developer guides

EU Pay Transparency Directive data: how many job ads show pay, by country

Directive (EU) 2023/970 required member states to bring pre-employment pay information into national law by 7 June 2026; no official body publishes how many job ads actually show pay, so the figure has to be measured from the ads. Source: Arcadium Data, data as of .

Article 5 of the Pay Transparency Directive gives applicants the right to know the starting pay or pay range of a job before the interview, and that information can be given in the vacancy notice itself. Employers also may not ask about salary history. The deadline for national transposition was 7 June 2026, and countries moved at very different speeds: some have laws in force, several have drafts, a few have not started. Companies that hire across borders now face a patchwork, and the first place it shows is in the job ad.

For a recruiter, a salary tool, a journalist or a compliance team, the practical question is simple: has the share of job ads with pay changed in country X? This guide shows what the official sources can and cannot answer, how to measure it yourself, and the API that does it daily.

The official route: law texts, trackers and Eurostat

What the official sources give you

No statistical office or ministry we are aware of publishes the share of job ads that show pay. The signal is in the ads themselves, which is why the measure is built from public job boards.

Measure it yourself

Many employers publish through applicant tracking systems whose public job-board APIs carry structured pay fields (see the posted salary guide): Greenhouse, Ashby and Lever expose it, others only in the text. A defensible measure has five parts:

  1. A panel of boards, fixed and documented. State how you chose them. Ours is the open boards of the employers we can place in a country.
  2. A daily snapshot of open jobs per country. The denominator is open jobs, not new postings.
  3. A pay test: a structured pay field with a minimum or maximum amount. Pay that is only written in the ad text is harder to detect reliably, so a strict tracker leaves it out and says so. A bare "competitive salary" never counts.
  4. Shares at two levels: jobs with pay over open jobs, and employers with at least one ad with pay over employers. The second is harder to move with one large employer.
  5. Legal status next to the number, with a date, so a rise can be read against the law.

Python

from collections import defaultdict

def pay_share(jobs: list[dict]) -> dict[str, dict]:
    """jobs: one snapshot, each {"country": "DE", "employer": "x.com", "has_pay": bool}."""
    out = defaultdict(lambda: {"open": 0, "with_pay": 0, "employers": set(), "emp_pay": set()})
    for j in jobs:
        c = out[j["country"]]
        c["open"] += 1
        c["employers"].add(j["employer"])
        if j["has_pay"]:
            c["with_pay"] += 1
            c["emp_pay"].add(j["employer"])
    return {k: {"payShare": v["with_pay"] / v["open"],
                "employerPayShare": len(v["emp_pay"]) / len(v["employers"])} for k, v in out.items()}

Pitfalls

The fast route: the share of ads with pay, daily by country

Arcadium Data keeps the panel and the pay test, and serves a daily row per country (and size band of employer) with open jobs, jobs with pay, employers, employers with pay, the two shares and the legal status of the directive with its effective date. The statuses are maintained by hand from public trackers and national measures and carry their as-of date. One country per call is open without a key:

Calls on this page work without a key from one IP (10 requests a minute, 100 a day, short answers, point lookups). A free key lifts the limits: sign up. Routes, parameters and fields: OpenAPI.

curl

curl -s "https://api.arcadiumdata.io/v1/pay/transparency?country=PL"

Python

import requests

data = requests.get("https://api.arcadiumdata.io/v1/pay/transparency?country=PL", timeout=30).json()
for row in data["data"]:
    print(row["day"], row["payShare"], row["employerPayShare"], row["directiveStatus"])

TypeScript

const res = await fetch('https://api.arcadiumdata.io/v1/pay/transparency?country=PL');
const data = (await res.json()) as { data: { day: string; openJobs: number; payShare: number; employerPayShare: number; directiveStatus: string }[] };
for (const r of data.data) console.log(r.day, r.payShare, r.employerPayShare, r.directiveStatus);

Response (abridged)

{
  "count": 2,
  "data": [{
    "day": "2026-10-24", "country": "PL", "countryName": "Poland", "sizeBand": "all",
    "openJobs": 11271, "jobsWithPay": 773, "payShare": 0.0686,
    "employers": 1177, "employersWithPay": 191, "employerPayShare": 0.1623,
    "directiveStatus": "partial", "directiveInForce": "2025-12-24"
  }]
}

For comparison, the same call for country=DE on the same day returned a pay share of 2.3% and status not_started: 1,556 of 68,206 open jobs in the German panel. Poland, where pre-employment duties are in force, shows about three times that. Read the two shares together: the job share says how common pay is in the stock of open jobs, and the employer share says how widespread the practice is across firms. When the employer share is far above the job share, a few large employers with many ads are not yet showing pay. Use a free key to pull all countries, since and until windows and size bands. The country-by-country picture is on our pay transparency tracker; the statistics page tracks the trend.

Comparison

Law trackers / EUR-LexEurostatArcadium Data /v1/pay/transparency
AnswersLegal status and datesActual pay and gapsShare of ads with pay
Update rhythmWeeks to monthsYearsDaily
UnitCountryCountry, sectorCountry, employer size band
BasisLawsSurveysPublic job boards of a documented panel
KeyNoneNoneNone for one country; key for all

Get the data without the plumbing

Arcadium Data serves these datasets from one REST API and one MCP server, with sources, licences and dates on every answer. No key is needed to try the routes in this guide.

Sources

Last updated 2026-10-25. This guide is ours and independent of the organisations it describes. Found a mistake? Tell us and we correct it.

Questions

What does the EU Pay Transparency Directive require in job ads?

Article 5 gives applicants the right to the initial pay or pay range of a job before the interview, which may be stated in the vacancy notice. Employers also may not ask about pay history. The transposition deadline was 7 June 2026.

Is there an official dataset of job ads that show pay?

Not that we are aware of. EUR-Lex lists national measures and Eurostat publishes actual pay, but no body publishes the share of job ads with pay, so it is measured from public job boards.

Which countries have transposed the directive?

Statuses change monthly. Our tracker lists each member state as transposed, partial, draft or not started, with a source and an as-of date. Check the national measure on EUR-Lex for the legal position.

How is the share of job ads with pay calculated?

Open jobs on the boards of a documented panel of employers, counting a job as having pay when the job board publishes a minimum or maximum amount in a structured field; pay written only in the ad text is not counted, so the share is a floor. We publish both a job share and an employer share.

Is the panel the whole job market?

No. It covers employers on public applicant tracking systems, which skew towards tech and larger firms, so treat the number as a panel measure and compare it over time and between countries.

Cite as: Arcadium Data, "EU Pay Transparency Directive data: how many job ads show pay, by country", https://arcadiumdata.io/guides/eu-pay-transparency-directive-data/, data as of 2026-10-25.