Clean, machine-readable pay and allowance data for the US Armed Forces, parsed from official government sources into JSON and CSV. Everything here is US Government public-domain data, restructured so you can actually load it in a spreadsheet or a script without scraping a PDF.
If you have ever tried to pull Basic Allowance for Housing (BAH) rates for analysis, you know the source files are fixed-width ASCII dumps that change format year to year. This repo does that parsing once and keeps it current.
| Dataset | Records | Coverage | Source |
|---|---|---|---|
| BAH rates | 36,531 rows | 338 Military Housing Areas x 27 paygrades x 4 years (2023-2026), with and without dependents | DoD Defense Travel Management Office (DTMO) |
| Basic Pay | 541 rows | 2026 Active Duty monthly basic pay by grade and years of service (3.8% raise) | DFAS / militarypay.defense.gov |
| CONUS COLA | full table | 2026 continental-US cost-of-living allowance factors | DoD CONUS COLA program (travel.dod.mil) |
| Combat & Special Pay | full table | 2026 hostile-fire / imminent-danger and select special pays | DoD Special and Incentive Pays |
| GS Pay | full table | 2026 General Schedule base + locality tables (civilian) | OPM |
data/*.json- the parsed source-of-truth files (compact, nested).csv/bah-rates-2023-2026.csv- BAH in long format, one row per year/area/grade. GitHub renders it as a searchable table.csv/basic-pay-2026.csv- basic pay in long format, one row per grade/YOS.
year, mha_code, mha_name, paygrade, with_dependents, without_dependents
2026, TX285, "SAN ANTONIO, TX", E-5, 1869, 1500
mha_code is the DoD Military Housing Area code; mha_name is the human label. Rates are monthly USD.
year, paygrade, years_of_service, monthly_basic_pay
2026, E-5, 6, 4110
years_of_service uses the official pay-table brackets (<2, 2, 3, 4, 6, ... 40).
Python:
import pandas as pd
bah = pd.read_csv("csv/bah-rates-2023-2026.csv")
# E-5 with dependents in San Antonio, 2026
print(bah.query("year==2026 and mha_code=='TX285' and paygrade=='E-5'").with_dependents)JavaScript:
import bah from "./data/bah.json" assert { type: "json" };
const i = bah.paygrades.indexOf("E-5");
console.log(bah.years["2026"]["TX285"].w[i]); // with-dependents monthly rateAll figures come from official US Government publications and are in the public domain (US Government works are not subject to copyright, 17 U.S.C. 105). The BAH numbers are parsed from the DoD DTMO BAH-ASCII rate files; base pay from the DFAS active-duty table; COLA, combat/special pay, and GS tables from the agencies listed above.
- Data: public domain (US Government work). Use it for anything.
- Repo tooling (the parse/CSV scripts): MIT, see
LICENSE.
This is an unofficial, community-maintained mirror. It is not affiliated with or endorsed by the Department of Defense. Always confirm against your Leave and Earnings Statement or the official tables before making a financial decision.
If you would rather look up a rate than parse a file, militarycalc.com is a free browser calculator built on this same data: BAH by area, base pay by grade and years of service, VA disability, combat pay, and the 2026 BAH tables by branch. No signup.
Rates refresh once a year (BAH and CONUS COLA typically effective January 1; basic pay after the NDAA pay raise). The CSVs are regenerated from data/*.json with:
node scripts/build-csv.mjs
Contributions welcome: open an issue if a rate looks off against the official table, or a PR to add a dataset (drill pay, VA disability history, etc.).