The dataset behind every figure on this site
Every figure on this site comes out of one file, and that file is published. It holds 15 countries and 63 lines of employer cost set by law. Each line is copied from the body that sets or collects it. Each one shows the page it came from and the day it was read. The file also holds what 14 employers of record charge, where they publish it. It is free to reuse under CC BY 4.0.
The same rows come in two shapes. data.json keeps each country's lines inside it. The two CSV files are flat, so they open in a spreadsheet. data.csv has one row per line of cost, 63 rows and 27 columns. providers.csv has one row per firm, 14 rows and 13 columns.
What is in it
| Countries | 15 |
| Statutory contribution lines | 63 |
| Lines read from the body that sets or collects the contribution | 28 |
| Lines read from a named payroll reference instead | 35 |
| Lines carrying an annual ceiling | 44 |
| Countries with statutory extra pay | 6 |
| Of those, countries where we hold a source putting it in the contribution base | 5 |
| Employer of record providers | 14 |
| Providers publishing a per-employee price | 13 |
| Items we could not confirm and therefore excluded | 24 |
| Recorded price changes and corrections | 5 |
| Currencies | 10, never converted into each other |
| Statutory year | 2026 |
| Last full refresh | 2026-08-21 |
The files
| data.csv | One row per statutory contribution line. The country columns repeat down that country's rows. UTF-8, comma separated, list values separated by |. |
| providers.csv | One row per employer of record provider, with the published price and the page it was read from. |
| data.json | One object per country with contrib[] nested inside, and the providers alongside with the previous value of every figure that has moved. Served with CORS open, so you can fetch it from your own page. |
| feed.xml | RSS. One item per provider per day a figure changed. |
| changes | The same history as a page, with the old value beside the new one. |
What one row means
In data.csv a row is one contribution line; the country columns repeat down that country's rows, so a country with three contributions occupies three rows carrying the same leave, notice and severance values. In JSON the same country fields sit on the object and the contribution fields sit in contrib[], where they carry the short names given below.
Row order carries no meaning. Countries and providers come out in the order the source file holds them, not in any ranking, so sorting the file yourself changes nothing about what it says.
| Column | Type | What it holds |
|---|---|---|
country | string | Country name as it is written on this site. |
iso2 | string | ISO 3166-1 alpha-2 code. The country page is /c/<iso2 lower-case>. |
page_url | url | The page on this site that holds this country. |
currency | string | The currency every amount for this country is in. We never convert. |
rate_year | number | The statutory year the rates apply to. |
extra_months | number | Statutory extra pay expressed in months of salary per year. 0.5 is fifteen days, 0.96 is a holiday allowance of 8% of annual salary. |
extra_in_contribution_base | boolean | Whether that extra pay is itself subject to employer contributions. Empty where there is no statutory extra pay to charge them on, or where we hold no source saying either way; in the second case the extra pay is left out of the contribution base and the country page says so. |
extra_contribution_source | url | The page the line above was read from. |
extra_contribution_checked | date | The day that page was read. |
extra_contribution_note | string | The wording of the rule in the source's own terms. |
extra_note | string | What the statutory extra pay is, in the statute's own terms. |
leave_days | number | Statutory minimum paid annual leave, in days per year. |
public_holidays | number | Paid public holidays per year, where they are set nationally. |
leave_note | string | How the two figures above are set, and what varies. |
severance_pct | number | Severance accrued per year of service, as a percentage of base salary, where statute sets one. 0 where there is no statutory severance at all. Empty where statute does require severance but not as a percentage accruing each year, for example a number of weeks' pay that steps up with length of service or applies only on redundancy: see severance_note, and note that every figure on this site treats an empty cell as no accrual, which makes the figure a floor. |
severance_note | string | What triggers severance and how it is worked out. |
notice_weeks | number | Minimum employer notice in weeks, at the reference length of service used on the country page. 0 where statute sets none. |
country_notes | list | Everything material that is not a rate: regional variation, employee-side items that are often mistaken for employer cost, and similar. Separated by |. |
unconfirmed | list | Items we could not confirm from a source we were willing to cite, and therefore excluded from every figure. Separated by |. |
| Column | Type | What it holds |
|---|---|---|
contribution_name | string | The contribution as the statutory body names it, with the employer share stated. |
rate_pct | number | Employer rate, as a percentage of the contribution base. |
cap | number | Annual ceiling on the base for this line, in the country's currency. Empty where the line is uncapped. |
band_floor | number | Annual amount below which this line is not charged. Empty where it is charged from the first unit of pay. |
max_wage | number | Annual pay above which the employee does not qualify for this line at all. Empty where the line applies at every salary. |
source_url | url | The page this rate was read from. |
checked | date | The day that page was read. |
confidence | string | high or medium. Medium means the agency had not published the current year at the check date, or the figure came from a payroll reference rather than from the collecting agency. |
| Column | Type | What it holds |
|---|---|---|
brand | string | Provider name exactly as the provider writes it. |
page_url | url | The page on this site that holds this row. |
eor_usd_pemp_month | number | Published employer of record price in US dollars per employee per month. Empty where the provider publishes none. |
price_public | boolean | Whether a per-employee price appears on the provider's own page. |
price_status | string | list (a flat published price), starting (published as a “from” price), or quote (no price published). |
billing | string | What the price covers and how it is billed, in the provider's own terms. |
billing_basis | string | monthly or annual: the billing term the published price requires. |
contractor_usd | number | Published price per contractor per month, where the provider sells contractor payments separately. |
contractor_mgmt_usd | number | Published price per contractor per month for contractor management only, where it is priced apart from payments. |
cor_usd | number | Published price per contractor per month for a fully managed contractor of record. |
pricing_url | url | The published pricing page every figure in the row was read from. |
checked | date | The day the row was last read against that page. |
note | string | Any condition the provider attaches to the price, in its own wording. |
What is deliberately not in it
No computed values. The employer cost at a given salary, the uplift percentage, the severance accrual in money and the break-even headcount against an employer of record fee are all worked out at build time from these columns; none of them is stored, so nobody has to trust a number whose derivation is invisible. The method page writes out every formula.
No converted currencies. Each country stays in its own currency and provider fees stay in the dollars the provider publishes. A converted figure is one nobody published, and it would need an exchange rate and a date we do not hold.
No guesses. Where a statutory body does not publish something, or we could not retrieve it, the field is empty and the item is named in unconfirmed instead. 24 items are excluded that way. An empty cell and a zero are different things: severance_pct is 0 in the 8 countries with no statutory severance at all, and empty in the 5 where severance is owed but not as a percentage accruing each year. Both are treated as no accrual in the figures, which is one of the reasons those figures are floors.
No ratings. There is no score, star or rank column anywhere in it. Ordering on this site comes from one computed number and nothing else.
Two fields in data.json are not in the CSV. low and high hold the range a country's marginal employer rate moves through, recorded when the country was first read. Nothing on this site computes from them, and the per-line rates in data.csv are what every figure is built on, so they are left in the JSON and out of the CSV. The provider previous block is left out for the same reason: it is history rather than a current figure, and it is published in full in changes and the feed.
How to read the confidence and source labels
Two labels sit on every contribution line and they mean different things. source_url says where the rate was read: 28 of 63 lines come from the body that sets or collects the contribution, and the remaining 35 from a named national payroll reference, because the statutory page could not be reliably retrieved. confidence says how firm the reading is: 23 of 63 are high and 40 are medium. A line can be statutory and still medium, for example where the agency had not published the current year at the check date.
The 46 entries in country_notes carry what does not fit a rate: regional variation, employee-side items often mistaken for employer cost, and conditions attached to a figure. They are part of the data, not decoration.
How often it changes
Figures are re-read against the source page and re-dated when they move. Any figure older than 90 days is marked on the page it appears on. Every change is kept, with the old value, the new value, the date and the reason, and published in changes and the feed. The URLs above are stable: the file at each one is replaced, never moved.
License
The data is published under Creative Commons Attribution 4.0. You may reuse it, including commercially, if you credit After the Salary and link back. The rates themselves are facts published by statutory bodies and the prices are facts published by the providers; the collection, the column definitions and the wording on this site are ours.
Cite this data
If you quote a figure, please cite the dataset rather than an individual page, and give the date you took it. The figures move.
| Reference | After the Salary (2026). Employer statutory cost by country, and employer of record pricing [Data set]. https://seatbill.com/employer-of-record/data |
| In a sentence | “According to After the Salary (2026), …” with a link to https://seatbill.com/employer-of-record/data |
| License | CC BY 4.0 |
Researchers and journalists are welcome to the whole file. If you need a cut of it that is not here, a set of countries or a date range, ask and it will be produced.
If a figure is wrong
Tell us through the contact form with the statutory page or the pricing page you saw it on. It will be re-read, corrected, re-dated, and the correction published in changes with the old value beside the new one.
Related
- All fifteen countries, ranked by employer cost
- Method: the formula and where every rate comes from
- What an employer of record charges
- What changed, and when
Written by Kaz, independent publisher. No commercial relationship with the providers named unless it is listed on the disclosure page.
Page last updated 2026-09-06. Sources are listed per figure and labeled statutory or payroll reference. Rates last verified 2026-08-21. This is not legal, tax or payroll advice and we do not file anyone's payroll.
Every formula on this site is written out in full on Method. Ordering is by computed cost, never by what a provider pays us.
Corrections: contact form.