The dataset behind every figure on this site
The country data and provider records are available as JSON and CSV. They cover 15 countries and 67 lines of modeled statutory employer contributions. Each line cites a statutory source or a named payroll reference and shows the day it was checked. The provider records also show 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, 67 rows and 50 columns. providers.csv has one row per firm, 14 rows and 21 columns.
What is in it
| Countries | 15 |
| Statutory contribution lines | 67 |
| Lines read from the body that sets or collects the contribution | 33 |
| Lines read from a named payroll reference instead | 34 |
| Lines carrying an annual ceiling | 33 |
| Countries with statutory extra pay | 6 |
| Countries with modeled extra-pay contribution treatment | 6 |
| Employer of record providers | 14 |
| Providers publishing a per-employee price | 13 |
| Items we could not confirm and therefore excluded | 26 |
| Recorded changes and corrections, providers and countries | 17 |
| 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 or country 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 |
|---|---|---|
excluded_contributions | object | JSON array of conditional contributions excluded from the modeled subtotal. They may still apply to the legal employer; read the country assumptions and itemized quote. |
model_assumptions | string | Coverage, period and earnings assumptions of the static benchmark. Conditional contributions require an explicit calculator choice; an excluded pension cost is not zero. |
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 | Modeled extra pay expressed in equivalent months of salary per year; check extra_note for eligibility and agreement assumptions. 0.5 is fifteen days, 0.96 is a holiday allowance of 8% of annual salary. |
extra_form | string | How the statute writes that extra pay: months where it is a multiple of salary paid as extra months or days of wages, allowance where it is a percentage of annual salary. Empty where there is no statutory extra pay. Only the months form makes a quoted annual salary ambiguous between a twelve-month base and a full annual total. |
extra_in_contribution_base | boolean|string | Legacy annual extra-pay flag where that model applies. scheme_specific uses payroll_model and each contribution calculation instead: it is not a blanket annual contribution base. Empty indicates no extra pay or an unresolved rule; read the source note. |
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 | Extra-pay rule, coverage and model assumptions, including conditions that can change the amount. |
extra_bonus_status | string | Whether the bonus fields are current or historical. Historical-not-currently-verified fields are retained as a record, excluded from the model and not a determination of current liability. |
extra_bonus_pct_min | number | Where a country has a statutory annual bonus instead of extra months of salary, the recorded minimum percentage. Read extra_bonus_status and extra_bonus_note before treating it as current. |
extra_bonus_pct_max | number | Recorded maximum percentage; may be historical as indicated by extra_bonus_status. |
extra_bonus_wage_cap_month | number | The monthly wage at or below which that bonus is due in the recorded source, in the country's currency; may be historical. Empty means no recorded threshold, not no legal liability. |
extra_bonus_base_month | number | The monthly wage the bonus is computed on where the recorded source caps the computation base, in the country's currency; may be historical. |
extra_bonus_source | url | The statute the four bonus columns were read from. |
extra_bonus_checked | date | The day that statute was read. |
extra_bonus_note | string | The sections of that statute the four bonus columns rest on, 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 excluded accrual. Excluded is not zero legal liability; the result is a modeled subtotal, not a guaranteed minimum. |
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 |. |
payroll_model | object | Scoped payroll calculation rules. Brazil adds its separately sourced vacation premium and uses covered remuneration. The Philippines supports constant monthly basic pay of PHP 100,000 or more for twelve covered months, one employer, no other pay and thirteenth-month eligibility. Interactive estimates require explicit confirmation; published examples state these assumptions. |
| 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 percentage where the line uses a percentage. Empty for a fixed monthly amount; calculation states that amount and covered months. |
cap | number | Annual ceiling on the base for this line, in the country's currency. Empty where the line is uncapped. For conditional MyFutureFund this is the EUR 80,000 planning threshold; a payroll forecast override can include crossing-period pay above it. For a scoped monthly calculation this is the twelve-month equivalent where supplied; calculation.monthly_cap states the monthly cap. Fixed EC has no percentage ceiling. |
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. |
ceiling_source | url | Separate official source for a corrected contribution assessment ceiling; it does not reverify the rate source. |
ceiling_checked | date | Date the separate ceiling source was checked. |
coverage_condition | string | Required scenario condition. myfuturefund_enrolled is included only when enrollment is confirmed; static benchmarks exclude it. |
base_override_key | string | Calculator context key for a user-supplied pensionable-pay forecast. A supplied amount replaces the planning cap base, including any crossing-period excess. |
amount_round_decimals | number | Round each annual line amount to this many decimal places using half-up rounding. Empty retains the unrounded model amount; this is not pay-period payroll rounding. |
rate_schedule | object | JSON schedule with weekly_divisor, minimum_weekly and periods of [upper weekly earnings, employer rate] bands. A null upper bound is open. Full 2026 assumes equal monthly pay and weights January–September nine twelfths and October–December three twelfths. |
calculation | object | Per-line monthly method and base. monthly_capped uses the stated monthly_cap for twelve covered months in the supported high-pay scenario. fixed_monthly uses monthly_amount, not a percentage. It does not implement lower-pay monthly salary-credit brackets. |
| Column | Type | What it holds |
|---|---|---|
contractor_fee_checked | date | Date the contractor fee and billing unit were checked; does not reverify EOR prices or employment terms. |
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 for contractor management only, where it is priced apart from payments. Read contractor_billing_unit for what the figure is charged against. |
contractor_billing_unit | string | What contractor_mgmt_usd is charged against: per_contractor_month (a price for each contractor), flat_month (one monthly fee whatever the headcount), or quote (not published). Empty where the provider publishes no contractor-management price. |
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. |
eor_fee_checked | date | The latest verification date for the displayed EOR fee or quote-only status; it does not reverify other products or contract terms. |
eor_fee_billing_basis | string | The billing basis for the displayed EOR fee. Annual offers can have a different rate and separate eligibility conditions. |
display_brand | string | The current public brand label, including a former name where relevant. The brand key remains unchanged for links and tracking. |
note | string | Any condition the provider attaches to the price, in its own wording. |
deposit_note | string | The deposit or reserve the provider's own page states for an EOR employee. Empty where the page states nothing, which is not the same as none. |
setup_fee_note | string | Setup, onboarding or termination fees as the provider's own page states them. Empty where the page states nothing. |
notice_to_provider | string | Notice the provider asks for before a termination, where its own terms state it. Empty where not stated. |
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. 26 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 6 where severance is owed but not as a percentage accruing each year. Both are treated as no accrual in the modeled subtotals; this does not establish that nothing is legally owed or that the subtotal is a guaranteed minimum.
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 history blocks in data.json are not in the CSV. The provider previous block, and the country changelog block, are history rather than a current figure. They are published in full in changes and the feed, so they are left in the JSON and out of the CSV.
Two fields left data.json on 7 September 2026. low and high held the range a country's marginal employer rate was recorded as moving through when that country was first read. Nothing on this site ever computed from them and they were never read again, so in three countries they had fallen behind the per-line rates sitting in the same file: they missed the United Kingdom apprenticeship levy and Canada's second additional CPP, and in Mexico they stood at a range the rows here do not produce. Rather than keep a summary nobody maintained, they were removed. The per-line rates in data.csv are what every figure on this site is built on, and they stay.
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: 33 of 67 lines come from the body that sets or collects the contribution, and the remaining 34 from a named national payroll reference, because the statutory page could not be reliably retrieved. confidence says how firm the reading is: 30 of 67 are high and 37 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 57 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 Employer of Record 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 | Employer of Record (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 Employer of Record (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.
Page last updated 2026-10-14. Sources are listed per figure and labeled statutory or payroll reference. Last full statutory dataset review: 2026-08-21. Individual facts may have later source-specific check dates. 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.
The two scoped payroll metadata columns are appended after the existing CSV columns. In JSON, payroll_model is on the country object and calculation is on the contribution line. The Philippines monthly calculation and Brazil vacation premium use these rules; a generic annual percentage cannot reproduce them.
Unavailable combined country estimates
Numeric rankings and ceiling-effect comparisons cover supported models only. India, Mexico remain listed with no calculated total or percentage; missing inputs are not treated as zero.
For guarded IN/MX rows, numeric rates, caps and generic benefit/accrual assumptions are blank in CSV and null in JSON. They are not current calculation inputs. Source URLs remain available; use the guard sources and the local quote conditions.
| Column | Type | Meaning |
|---|---|---|
calculation_status | string | unavailable means the annual gross input does not support a reliable combined employer-cost total. Blank numeric cells must not be treated as zero. |
calculation_issue | string | Why the combined estimate is unavailable and which employee-specific inputs a local quote must establish. |
calculation_required_conditions | object | JSON array of the wage-base, coverage and period conditions required for the guarded country. |
calculation_source_urls | object | JSON array of primary framework sources supporting the calculation guard; this does not reverify every historical contribution source. |