Gross ↔ Net Salary (Vietnam) API
Convert Vietnamese gross and net salaries with social, health and unemployment insurance, family deductions and personal income tax, by period.
The salary API computes a monthly salary in Vietnam both ways: from gross to net (gross=30000000) and from the net amount an employee should receive back to the gross to put in the contract (net=26215000). It returns every step: compulsory insurance of the employee (BHXH 8%, BHYT 1.5%, BHTN 1%) with their caps, income before tax, family deductions, taxable income, tax per bracket and the employer’s cost (BHXH 17%, TNLĐ-BNN 0.5%, BHYT 3%, BHTN 1%, optional 2% union fund).
Rules are stored with their effective dates and the period is a parameter (date or month), so payroll for past months is computed with the rules of that time: the 7-bracket table and 11 / 4.4 million deductions until 2025; the 5-bracket table of Law 109/2025/QH15 and 15.5 / 6.2 million deductions (Resolution 110/2025/UBTVQH15) from tax year 2026; the base salary (2.34 → 2.53 million from 1/7/2026) for the 20× insurance cap and the regional minimum wages for the unemployment insurance cap. The legal reference of each value is returned in rules.
insurance_salary sets a different salary for insurance (it defaults to gross), non_taxable excludes tax-free allowances, region (1–4) selects the minimum-wage region and resident=false applies the flat 20% of non-residents. The result is an estimate for planning and checking payroll; special cases (overtime, bonuses, foreigners’ insurance) need your own rules.
Parameters
| Name | In | Type | Required | Default | |
|---|---|---|---|---|---|
gross | body|query | number | no | Monthly gross salary in VND (send gross or net). | |
net | body|query | number | no | Monthly net salary in VND, to find the gross. | |
dependents | body|query | number | no | 0 | Number of registered dependants. |
region | body|query | number | no | 1 | Minimum-wage region 1–4 (for the BHTN cap). |
date | body|query | string | no | Salary period, YYYY-MM-DD or month=YYYY-MM (default: today). From 2020-07. | |
insurance_salary | body|query | number | no | Salary used for insurance (default: gross). | |
non_taxable | body|query | number | no | 0 | Tax-free part of gross (meal allowance…). |
insurance | body|query | boolean | no | true | false: no compulsory insurance. |
resident | body|query | boolean | no | true | false: non-resident, flat 20%. |
union_fund | body|query | boolean | no | false | Add the 2% union fund to the employer cost. |
Example
curl "https://apibox.io.vn/v1/vn-salary?gross=30000000&dependents=1&month=2026-11" \
-H "Authorization: Bearer YOUR_API_KEY"const res = await fetch('https://apibox.io.vn/v1/vn-salary?gross=30000000&dependents=1&month=2026-11', {
method: 'GET',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
},
});
const data = await res.json();
console.log(data);import requests
res = requests.get(
"https://apibox.io.vn/v1/vn-salary?gross=30000000&dependents=1&month=2026-11",
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/vn-salary?gross=30000000&dependents=1&month=2026-11');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY'],
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Response
{
"period": "2026-11",
"mode": "gross_to_net",
"region": 1,
"gross": 30000000,
"net": 26592500,
"insurance": {
"salary": 30000000,
"bhxh": 2400000,
"bhyt": 450000,
"bhtn": 300000,
"total": 3150000,
"caps": {
"bhxh_bhyt": 50600000,
"bhtn": 106200000
}
},
"income_before_tax": 26850000,
"deductions": {
"personal": 15500000,
"dependents": 6200000,
"dependent_count": 1,
"non_taxable_income": 0,
"total": 21700000
},
"taxable_income": 5150000,
"personal_income_tax": 257500,
"tax_brackets": [
{
"from": 0,
"to": 10000000,
"rate": 0.05,
"amount": 5150000,
"tax": 257500
}
],
"employer": {
"bhxh": 5100000,
"tnld_bnn": 150000,
"bhyt": 900000,
"bhtn": 300000,
"total": 6450000,
"total_cost": 36450000
},
"rules": {
"personal_deduction": 15500000,
"dependent_deduction": 6200000,
"deduction_ref": "Nghị quyết 110/2025/UBTVQH15",
"tax_table": "Luật Thuế TNCN 109/2025/QH15 (5 bậc, áp dụng từ kỳ tính thuế 2026)",
"base_salary": 2530000,
"region_min_wage": 5310000,
"…": "…"
},
"notes": []
}
Use cases
- Salary calculators on job boards and HR websites
- Check payslips and payroll exports
- Offer letters: find the gross that gives an agreed net
- Estimate the total employer cost of a hire
FAQ
Which tax table is used in 2026?
The 5-bracket table (5%, 10%, 20%, 30%, 35%) of Law 109/2025/QH15 applies to salaries of tax year 2026, with the 15.5 million personal and 6.2 million dependant deductions. Periods in 2025 and earlier use the 7-bracket table.
Why is the insurance lower than 10.5% for high salaries?
BHXH and BHYT are capped at 20 × the base salary (50.6 million from 1/7/2026) and BHTN at 20 × the regional minimum wage. The caps used are in insurance.caps.
How is net → gross computed?
By searching the smallest gross that gives at least the requested net with the same rules, so the result is exact to the dong.
Related APIs
JSON Validator
Check JSON syntax with exact line and column of errors, and validate data against a JSON Schema (draft 4, 7, 2019-09 or 2020-12).
{ }JSON Formatter
Pretty print JSON with 0-8 spaces or tabs, minify it, or sort object keys recursively. Syntax errors are reported with line and column.
CSVCSV to JSON
Convert CSV into an array of JSON objects using the header row, with delimiter auto-detection, number and boolean typing, and row-level errors.