Authentication & pricing
Three tiers, no signup required for the free ones:
| Endpoint | Auth required | Tier |
|---|---|---|
GET /v1/statistics/* (summary, states, hotspots, trends) | No | Free |
GET /v1/intelligence/location-risk (incl. AADT block) | No | Free |
GET /v1/reports/intersection/preview | No | Free |
GET /v1/crashes (search/list) | API key | $19/mo |
GET /v1/crashes/{st_case}/{year} (single crash + road exposure) | API key | $19/mo |
GET /v1/reports/intersection (full report) | Stripe token | $9/each |
Free endpoints are rate-limited to 60 requests/minute per IP. Pass an API key to lift the limit.
Getting an API key
Pass it on every request as a header or query param:
Searching crashes
GET /v1/crashes is the main endpoint. All filters are optional and combine with AND logic. Paginated - default 50 results, max 200.
By state and year
The simplest query. State is matched by name (case-insensitive) or FIPS code.
Tip: County names in FARS include the FIPS code, like "HARRIS (201)". Searching "Harris" matches it. Don't include the code in your search.
By location (radius search)
This is the feature NHTSA's own API doesn't have. Pass latitude, longitude, and radius in miles.
Tip: 0.1 miles = ~530 feet, roughly one intersection. For broader corridor analysis, use 1-5 miles. Queries over 50 miles will be slow - narrow with state or year filters.
Tip: About 0.4% of crashes have no GPS coordinates and won't appear in radius queries. If you need complete coverage for a state, use ?state= instead.
By vehicle
Filter by make, model, body type, or rollover. These use subqueries on the vehicle table - the crash is returned if any involved vehicle matches.
Tip: Make and model are partial matches. "Ford" matches "Ford", "vehicle_model=F-1" matches "F-150" and "F-100". Body type matches against NHTSA's verbose labels - "Truck" matches "Light Pickup", "Single-unit straight truck", etc.
Tip: About 3.4% of vehicles have numeric codes instead of model names (older cars, unidentified vehicles). These won't match model name searches.
By conditions
Tip: Weather and light are partial matches. "Dark" matches "Dark - Not Lighted", "Dark - Lighted", and "Dark - Unknown Lighting". "Rain" matches "Rain" and "Freezing Rain or Drizzle".
Tip: drunk_driver=true means at least one vehicle had an impaired driver (derived from the vehicle-level DR_DRINK field). It doesn't mean the drunk driver caused the crash - they were involved.
Pagination
Tip: Max 200 per page. To pull all Texas crashes (15k+), paginate with limit=200 and increment offset. The total field tells you when to stop.
Crash detail
GET /v1/crashes/{st_case}/{year} returns a single crash with full vehicle records, person records, and (new) the FHWA HPMS road exposure data for the segment the crash was matched to.
Tip: The st_case is NHTSA's case identifier. It's unique within a state and year. You can use it to cross-reference with NHTSA's own source CSVs if you need to verify a data point.
About road_exposure: Returned for ~80% of crashes. Returns null when the crash didn't snap to a HPMS segment within 80m, or snapped to a segment with AADT=0 (typically ramps without a traffic count, or HPMS sample sections in low-coverage states like Delaware and North Carolina). Source: FHWA HPMS 2017 public release. See data coverage for state-by-state match rates.
Intersection reports
Two endpoints: a free preview and a paid full report.
Free preview
No auth needed. Returns crash count, top collision types, and worst hours. Use this to check if a location has data before buying.
Tip: 2640 feet = half a mile. Good default for intersection analysis. Use 500-1000 feet for a single intersection, 2640-5280 for a corridor or road segment.
Full report
Purchase via the checkout flow, then access with your token. The example report shows what you get: map, pattern analysis, charts, and every crash record with vehicle and person detail.
Statistics (free, no auth)
Aggregate endpoints for analysis and benchmarking. No API key needed.
Summary
Breakdowns by year, month, hour, road type, weather, and collision type. Filter by state and/or year.
Tip: The by_hour breakdown is useful for fleet safety - it shows which hours have the most fatal crashes. Peak is typically 8pm-10pm nationally.
States ranking
Tip: Useful for insurance pricing - compare a state's fatality rate against the national average. Texas, California, and Florida consistently lead.
Trends
Tip: Response includes yoy_change_pct - year-over-year percentage change. Nationally, fatalities spiked +10.8% in 2021 (post-COVID driving behavior change) and have been declining since.
Hotspots
Tip: Hotspots are grouped into ~100-meter grid cells. A "hotspot" with 5 crashes means 5 fatal crashes occurred within roughly one block. This is useful for identifying dangerous corridors that individual crash queries might not reveal.
Location intelligence (free, no auth)
Risk analysis for any location - crash count, county percentile ranking, road-type benchmarks, AADT-adjusted Expected vs Actual fatal crashes, contributing factors, and a narrative assessment. This is what powers the "Location context" and "Expected vs Actual" sections in intersection reports.
Tip: This endpoint is free and doesn't require an API key. Use it to check whether a location has meaningful crash data before purchasing a full intersection report. The assessment paragraph is designed to be quotable in legal filings and safety reports (with appropriate disclaimers).
Tip: The county percentile tells you how this location's county compares to others in the same state. "Top 2%" means only 2% of counties in that state have more fatal crashes - useful for establishing that a location is in a high-crash area.
The aadt block: traffic-volume-adjusted analysis
For locations where at least one crash matched a FHWA HPMS road segment with non-zero AADT (~80% of US fatal crashes), the response includes a top-level aadt block with the Expected vs Actual computation:
About the baselines: Per-class fatal crash rates per 100M VMT computed from all matched FARS crashes 2017-2023 nationally. Interstates are the safest road class per VMT (0.322), Major Collectors are the deadliest (1.886). The Expected vs Actual ratio uses these baselines as the comparison anchor - this avoids the selection bias of comparing FARS-queried locations to a fleet-wide national average that includes millions of zero-crash road miles.
When AADT data is missing: The aadt field is null when no crash in the radius matched a HPMS segment with non-zero AADT (about 20% of fatal crashes nationally). State coverage ranges from 64% (Delaware) to 94% (DC). See data coverage for details.
Code examples
Python
JavaScript
curl
Rate limits
- Free endpoints (no auth): 60 requests per minute per IP. Includes statistics, intersection preview, and location-risk. Hitting the limit returns a 429.
- $19/mo API plan: 50,000 requests per month. Counter resets on the 1st of each month. Need more? Email us.
Best practices
- Cache aggressively. FARS data doesn't change mid-year. If you query Texas 2022 crashes today, you'll get the same results tomorrow. Cache responses for hours or days.
- Use statistics endpoints first. They're free and fast. Check if a state/year has the data you need before paginating through crash records.
- Narrow your queries. A 50-mile radius across all years is expensive. Add state, year, or condition filters to reduce result size.
- Paginate responsibly. Don't fetch 200 results if you only need 10. Use
limitto match your actual needs. - Verify important data points. For legal or actuarial use, cross-reference critical records against NHTSA's source CSVs using the
st_caseandyearfields.