Annual PIT finalisation API
Annual personal income tax finalisation for salaries in Vietnam: tax for the year, refund or extra tax, 2026 deductions, deadlines and authorisation.
Send the taxable salary of the year (income) with compulsory insurance and the tax withheld, or several incomes (employers, casual income withheld at 10%), the number of dependents (or dependent_months), charity and voluntary pension. The API applies the rules of the tax year: for 2024–2025 the 7-bracket table and 11 / 4.4 million deductions; from 2026 the 5-bracket table of Luật Thuế TNCN 109/2025/QH15, 15.5 / 6.2 million deductions (Nghị quyết 110/2025/UBTVQH15), voluntary pension up to 3 million a month and the new medical (≤ 23 million) and education (≤ 24 million) deductions of Nghị định 253/2026/NĐ-CP.
The answer gives the tax for the year bracket by bracket, the refund or the amount to pay, whether a finalisation is required (no finalisation when you do not ask for a refund; until 2025 also when the extra tax is ≤ 50,000 đ), whether the employer can finalise for you, and the deadlines (31/3 for employers, end of April for individuals, moved to the next working day when it is a holiday).
Resident employees only; business, capital and property income are out of scope. It is an estimate for planning, not tax advice.
Parameters
| Name | In | Type | Required | Default | |
|---|---|---|---|---|---|
year | query|body | number | no | Tax year 2024–2027 (default last year). | |
income | query|body | number | no | Taxable salary of the year (one employer). | |
insurance | query|body | number | no | Compulsory insurance paid by the employee in the year. | |
withheld | query|body | number | no | Tax already withheld. | |
incomes | body | array | no | Several sources: [{"name":"A","income":300000000,"insurance":31500000,"withheld":5000000},{"kind":"casual","income":60000000,"withheld":6000000}]; the first is the current employer. | |
dependents | query|body | number | no | Dependants for the whole year (or dependent_months in total). | |
charity | query|body | number | no | Charity contributions to approved funds. | |
voluntary_pension | query|body | number | no | Voluntary pension / life insurance (capped). | |
medical | query|body | number | no | Medical costs in the health-insurance list (2026+, ≤ 23 million). | |
education | query|body | number | no | Domestic education costs (2026+, ≤ 24 million). |
Example
curl -X POST "https://apibox.io.vn/v1/vn-pit-annual" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"year":2026,"income":360000000,"insurance":37800000,"dependents":1,"withheld":10000000}'const res = await fetch('https://apibox.io.vn/v1/vn-pit-annual', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"year": 2026,
"income": 360000000,
"insurance": 37800000,
"dependents": 1,
"withheld": 10000000
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://apibox.io.vn/v1/vn-pit-annual",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"year": 2026, "income": 360000000, "insurance": 37800000, "dependents": 1, "withheld": 10000000},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/vn-pit-annual');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"year":2026,"income":360000000,"insurance":37800000,"dependents":1,"withheld":10000000}',
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Response
{
"year": 2026,
"result": "refund",
"tax_due": 3090000,
"withheld": 10000000,
"refund": 6910000,
"deductions": {
"personal": 186000000,
"personal_months": 12,
"dependents": 74400000,
"dependent_months": 12,
"insurance": 37800000,
"voluntary_pension": 0,
"charity": 0,
"medical": 0,
"education": 0,
"total": 298200000
},
"taxable_income": 61800000,
"brackets": [
{
"from": 0,
"to": 120000000,
"rate_percent": 5,
"amount": 61800000,
"tax": 3090000
}
],
"finalisation": {
"required": true,
"can_authorise_employer": true,
"form": "Tờ khai 02/QTT-TNCN (+ phụ lục 02-1/BK-QTT-TNCN for dependants)",
"deadline_individual": "2027-05-04",
"deadline_employer": "2027-03-31"
},
"legal": [
"Luật Thuế TNCN 109/2025/QH15 (biểu 5 bậc, áp dụng từ kỳ tính thuế 2026)",
"Nghị quyết 110/2025/UBTVQH15 (giảm trừ 15,5 / 6,2 triệu đồng)",
"Nghị định 253/2026/NĐ-CP Điều 49, 51 (giảm trừ y tế, giáo dục; quyết toán)",
"Nghị định 252/2026/NĐ-CP Điều 10 (thời hạn quyết toán)"
],
"reviewed": "2026-11-11"
}
Use cases
- Show the expected PIT refund in a payroll or HR app
- Check before authorising the employer to finalise
- Plan the 2026 finalisation with the new deductions
- Estimate tax for people with two employers or freelance income
FAQ
Which rules apply to the finalisation done in 2026?
The 2025 tax year: 7 brackets and 11 / 4.4 million deductions. The new 5-bracket table and 15.5 / 6.2 million deductions apply from tax year 2026 (finalised in 2027).
Can my employer finalise for me?
Yes with a contract of 3 months or more and still working there, if other income is only casual income withheld at 10% and averages ≤ 15 million a month (10 million until 2025). Medical and education deductions need self-finalisation.
What is “income” here?
Taxable salary: gross pay minus exempt items such as overtime pay within legal limits, meals up to the limit and uniforms. Do not deduct insurance: send it as insurance.
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.