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

Countries15
Statutory contribution lines67
Lines read from the body that sets or collects the contribution33
Lines read from a named payroll reference instead34
Lines carrying an annual ceiling33
Countries with statutory extra pay6
Countries with modeled extra-pay contribution treatment6
Employer of record providers14
Providers publishing a per-employee price13
Items we could not confirm and therefore excluded26
Recorded changes and corrections, providers and countries17
Currencies10, never converted into each other
Statutory year2026
Last full refresh2026-08-21

The files

data.csvOne row per statutory contribution line. The country columns repeat down that country's rows. UTF-8, comma separated, list values separated by |.
providers.csvOne row per employer of record provider, with the published price and the page it was read from.
data.jsonOne 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.xmlRSS. One item per provider or country per day a figure changed.
changesThe 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.

Country columns, in data.csv
ColumnTypeWhat it holds
excluded_contributionsobjectJSON 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_assumptionsstringCoverage, period and earnings assumptions of the static benchmark. Conditional contributions require an explicit calculator choice; an excluded pension cost is not zero.
countrystringCountry name as it is written on this site.
iso2stringISO 3166-1 alpha-2 code. The country page is /c/<iso2 lower-case>.
page_urlurlThe page on this site that holds this country.
currencystringThe currency every amount for this country is in. We never convert.
rate_yearnumberThe statutory year the rates apply to.
extra_monthsnumberModeled 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_formstringHow 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_baseboolean|stringLegacy 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_sourceurlThe page the line above was read from.
extra_contribution_checkeddateThe day that page was read.
extra_contribution_notestringThe wording of the rule in the source's own terms.
extra_notestringExtra-pay rule, coverage and model assumptions, including conditions that can change the amount.
extra_bonus_statusstringWhether 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_minnumberWhere 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_maxnumberRecorded maximum percentage; may be historical as indicated by extra_bonus_status.
extra_bonus_wage_cap_monthnumberThe 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_monthnumberThe 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_sourceurlThe statute the four bonus columns were read from.
extra_bonus_checkeddateThe day that statute was read.
extra_bonus_notestringThe sections of that statute the four bonus columns rest on, in the statute's own terms.
leave_daysnumberStatutory minimum paid annual leave, in days per year.
public_holidaysnumberPaid public holidays per year, where they are set nationally.
leave_notestringHow the two figures above are set, and what varies.
severance_pctnumberSeverance 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_notestringWhat triggers severance and how it is worked out.
notice_weeksnumberMinimum employer notice in weeks, at the reference length of service used on the country page. 0 where statute sets none.
country_noteslistEverything material that is not a rate: regional variation, employee-side items that are often mistaken for employer cost, and similar. Separated by |.
unconfirmedlistItems we could not confirm from a source we were willing to cite, and therefore excluded from every figure. Separated by |.
payroll_modelobjectScoped 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.
Contribution columns, in data.csv (in data.json: n, r, cap, floor, max_wage, src, chk, conf)
ColumnTypeWhat it holds
contribution_namestringThe contribution as the statutory body names it, with the employer share stated.
rate_pctnumberEmployer percentage where the line uses a percentage. Empty for a fixed monthly amount; calculation states that amount and covered months.
capnumberAnnual 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_floornumberAnnual amount below which this line is not charged. Empty where it is charged from the first unit of pay.
max_wagenumberAnnual pay above which the employee does not qualify for this line at all. Empty where the line applies at every salary.
source_urlurlThe page this rate was read from.
checkeddateThe day that page was read.
confidencestringhigh 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_sourceurlSeparate official source for a corrected contribution assessment ceiling; it does not reverify the rate source.
ceiling_checkeddateDate the separate ceiling source was checked.
coverage_conditionstringRequired scenario condition. myfuturefund_enrolled is included only when enrollment is confirmed; static benchmarks exclude it.
base_override_keystringCalculator context key for a user-supplied pensionable-pay forecast. A supplied amount replaces the planning cap base, including any crossing-period excess.
amount_round_decimalsnumberRound 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_scheduleobjectJSON 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.
calculationobjectPer-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.
Provider columns, in providers.csv
ColumnTypeWhat it holds
contractor_fee_checkeddateDate the contractor fee and billing unit were checked; does not reverify EOR prices or employment terms.
brandstringProvider name exactly as the provider writes it.
page_urlurlThe page on this site that holds this row.
eor_usd_pemp_monthnumberPublished employer of record price in US dollars per employee per month. Empty where the provider publishes none.
price_publicbooleanWhether a per-employee price appears on the provider's own page.
price_statusstringlist (a flat published price), starting (published as a “from” price), or quote (no price published).
billingstringWhat the price covers and how it is billed, in the provider's own terms.
billing_basisstringmonthly or annual: the billing term the published price requires.
contractor_usdnumberPublished price per contractor per month, where the provider sells contractor payments separately.
contractor_mgmt_usdnumberPublished 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_unitstringWhat 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_usdnumberPublished price per contractor per month for a fully managed contractor of record.
pricing_urlurlThe published pricing page every figure in the row was read from.
checkeddateThe day the row was last read against that page.
eor_fee_checkeddateThe latest verification date for the displayed EOR fee or quote-only status; it does not reverify other products or contract terms.
eor_fee_billing_basisstringThe billing basis for the displayed EOR fee. Annual offers can have a different rate and separate eligibility conditions.
display_brandstringThe current public brand label, including a former name where relevant. The brand key remains unchanged for links and tracking.
notestringAny condition the provider attaches to the price, in its own wording.
deposit_notestringThe 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_notestringSetup, onboarding or termination fees as the provider's own page states them. Empty where the page states nothing.
notice_to_providerstringNotice 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.

ReferenceEmployer 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
LicenseCC BY 4.0
@misc{seatbill_employer_of_record_cost, title = {Employer statutory cost by country, and employer of record pricing}, author = {Kaz}, year = {2026}, url = {https://seatbill.com/employer-of-record/data}, note = {Employer of Record. Licensed 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

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.

ColumnTypeMeaning
calculation_statusstringunavailable means the annual gross input does not support a reliable combined employer-cost total. Blank numeric cells must not be treated as zero.
calculation_issuestringWhy the combined estimate is unavailable and which employee-specific inputs a local quote must establish.
calculation_required_conditionsobjectJSON array of the wage-base, coverage and period conditions required for the guarded country.
calculation_source_urlsobjectJSON array of primary framework sources supporting the calculation guard; this does not reverify every historical contribution source.