Primary-sourced, QA-verified payroll data for 6 countries โ income tax tables, contribution rates, labour law, minimum wages โ every figure cited to the issuing government document. Free and open.
# Install
npm install philippines-payroll-data
# Import typed rate tables for any country
import { sss2025, sgCpf, myContributions, thSocialSecurity } from 'philippines-payroll-data';
# Philippines โ SSS bracket lookup
sss2025.brackets.find(b => b.msc === 25000).employee; // 1250
# Singapore โ employee CPF rate at age 35, salary $5,000
sgCpf.rates.find(r => r.age_group === '35_45').employee_pct; // 20
# Or fetch the JSON directly โ no install needed
const sss = await fetch('https://cdn.jsdelivr.net/npm/philippines-payroll-data/data/sss_2025.json').then(r => r.json());
All 19 tables conform to JSON Schema 2020-12, validated on every push by CI. Browse all tables: data/index.json.
The repo includes AGENTS.md, CLAUDE.md, and llms.txt โ navigation contracts for Claude, ChatGPT, Gemini, and any tool following the llmstxt.org convention. Add it to your agent's context once; any SE Asia payroll question resolves in 2 hops without web searches.
# Point your agent at the answer router for any country
ph/INDEX.md โ maps "what is the SSS rate for โฑ25k?" to the exact file
sg/INDEX.md โ maps "what is the CPF OW ceiling for 2026?" to the exact file
my/INDEX.md โ maps "EPF rate for employee under 60?" to the exact file
# โฆ and so on for TH, ID, VN
# Why this is more accurate than fetching the source:
# Most SE Asia gov issuances are scanned image PDFs โ AI OCR has fabricated
# wrong tax tables from them. Every figure here was rendered and verified
# against the primary document by a human, then adversarially QA-checked.
Every figure is cited to the actual government issuance โ the circular, gazette, or regulation PDF โ not a blog or summary site.
Each country went through an independent adversarial verification pass before going live. The gate caught real errors in 3 of 6 countries (Thailand min wage, Vietnam PIT reform, Philippines de minimis).
Every file carries source_tier, verified_from, and last_verified frontmatter. Absence of a caveat means it was checked.
The data/*.json tables are generated from the markdown and validated against it on every push. If a rate file and its JSON drift, CI fails.