# Methodology: US Sales Tax Rates

> Where do the Sales Tax Rates API's rates come from, and how are they checked?

Rates and boundaries come from the rate and boundary files each Streamlined Sales Tax member state posts, for the states `GET /v1/sales-tax/coverage` lists as published. The files are checked twice a month; a state is restaged only when its files change. A release is published only after every jurisdiction a boundary record assigns resolves to exactly one rate on the dates served, rates are plausible, and hand-verified benchmark rates read from each state's own rate tables match.

## Sources

| Dataset | Source | Release | Refresh |
| --- | --- | --- | --- |
| `plutus.sst_rates_boundaries` | Streamlined Sales Tax rate and boundary files, one pair per state, as posted by each member state | Latest state files (for example 2026 Q4); the file name is returned with every rate as `source_version` | Checked on the 2nd and 16th of each month; stale after 100 days |

Published states (17 as of 2026-10-21): IN, KY, MI, MN, ND, NE, NJ, NV, OK, RI, SD, TN, UT, VT, WI, WV, WY. `GET /v1/sales-tax/coverage` is the authoritative list, with each state's files, their checksums and the dates served. Every other state answers `unsupported`.

## How values are produced

- Files are found through the directory index of the SST site and checked with HEAD requests (ETag, Last-Modified, Content-Length); a state is restaged only when a file changed or its served date range moved.
- Rates are exact decimal fractions as the state publishes them: general and food/drug, each intrastate and interstate.
- Lookups fall back from address range to ZIP+4 to 5-digit ZIP, and say which method matched (`match.method`) and how confident it is. A 5-digit ZIP that spans several jurisdiction sets is `ambiguous`, with every candidate; no single rate is chosen.
- Addresses are normalised deterministically (no geocoding); the state files are normalised the same way.
- Each state is served for dates from five years before its latest file quarter to the end of that quarter. Dates outside that range are `unsupported`, so an unposted quarter is never answered from older files.
- Rows a state file gets wrong are repaired only where the fix is unambiguous (for example ZIP codes written without their leading zero), and each repair is counted; otherwise they are left out.

## Validation checks

Every release runs the dataset's required checks before it can become active. A blocking check that fails stops the release, and the previous one keeps serving. Records that did not change keep their original `published_at`, and every record carries a `provenance` block with its `source_url`, the source snapshot it was read from and the validation status of its release.

| Check | What it guards |
| --- | --- |
| `file_layout` | Each file matches the SST layout; rejected lines stay under 1% |
| `state_rate_present`, `zip5_records_present` | Every published state has a state rate and a 5-digit ZIP fallback |
| `boundary_rates_resolve` | Every jurisdiction a boundary record assigns resolves to exactly one rate on the dates served |
| `rate_values_plausible` | State rates at most 10%, combined general rates at most 20% |
| `row_count_range`, `row_count_change` | Row counts within bounds; no state's rows drop by more than half |
| `unique_record_id`, `required_fields_present` | One row per record key; no missing required fields |
| `enabled_states_covered` | Every enabled state is either restaged or carried over with its current files |
| `benchmark_rates` | Hand-verified combined rates for real addresses and ZIP+4s, read from each state's own rate tables (not the SST files), must match |

## Known limits

- **Rates, not tax due.** No product taxability, sourcing, nexus or exemption rules. See [How sales tax rates by address work](https://olympus.new-odyssey.com/guides/sales-tax-rates-by-address).
- **ZIP-level states.** Some states (for example Minnesota, North Dakota, Utah and West Virginia) publish ZIP-level boundaries only, so street addresses match at ZIP+4 or ZIP level.
- **Single-rate states** (for example Indiana, Kentucky, Michigan, New Jersey and Rhode Island) map every ZIP to the state rate. New Jersey's Urban Enterprise Zone and Salem County reduced rates apply only to qualified sellers and are not applied.
- **Nebraska Good Life Districts** are not applied; affected responses carry a notice.
- Not included: states outside the Streamlined Sales Tax agreement, tax calculation on a transaction, lodging, excise and other special taxes.

> Data from the Streamlined Sales Tax Governing Board rate and boundary files, as posted by each member state. The Streamlined Sales Tax Governing Board does not certify Olympus or its use of the data, and Olympus is not a Certified Service Provider.

## Sources

- Streamlined Sales Tax Governing Board: [Rate and Boundary Files](https://www.streamlinedsalestax.org/Shared-Pages/rate-and-boundary-files)
- Streamlined Sales Tax Governing Board: [State Detail (member states)](https://www.streamlinedsalestax.org/Shared-Pages/State-Detail)

## Related

- [Coverage and sources: Sales Tax Rates](https://olympus.new-odyssey.com/coverage#sales-tax)
- [Sales Tax Rates API reference](https://olympus.new-odyssey.com/docs/sales-tax)
- [How sales tax rates by address work](https://olympus.new-odyssey.com/guides/sales-tax-rates-by-address)
- [Data release notes](https://olympus.new-odyssey.com/releases)

---
Published 2026-10-21, updated 2026-10-21 by New Odyssey. Canonical: https://olympus.new-odyssey.com/methodology/sales-tax
