A while ago I wrote a list of free APIs for side projects, and it became my most-read post on DEV. This is the grown-up version: free government APIs I've actually used in production.
I'm co-founder of TrustCheck, a platform that helps people in Ghana check a business, a price or a car before they pay. Our free used-car checker runs almost entirely on the APIs below. None of them need an API key, a sign-up or a credit card.
Every example here is a real request I ran while writing this post. Copy it into your terminal and it works.
1. NHTSA vPIC: decode any VIN
What it gives you: make, model, year, engine size, fuel type, where the car was built, and more, from a 17-character VIN.
curl "https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVinValues/1HGCM82633A004352?format=json" { "Make": "HONDA", "Model": "Accord", "ModelYear": "2003", "DisplacementL": "2.998832712", "FuelTypePrimary": "Gasoline", "PlantCountry": "UNITED STATES (USA)", "ErrorCode": "0" } Build idea: "Does the ad match the car?" A seller says 2015. The VIN says 2009. In Ghana that matters even more now, because used cars 15 years and older can no longer be imported.
Gotcha: check ErrorCode. "0" is a clean decode. Cars built for other markets (Japan, the Gulf, Europe) often decode only partly, so show what you got and say what's missing.
2. NHTSA Recalls: every open safety recall
What it gives you: recalls for a make, model and year: the component, what goes wrong, and the fix.
curl "https://api.nhtsa.gov/recalls/recallsByVehicle?make=honda&model=accord&modelYear=2003" The 2003 Accord has 24 recalls. Each result includes Component, Summary, Consequence, Remedy, and flags like parkIt (don't drive it) and overTheAirUpdate.
Gotcha: model names must be spelled the way NHTSA spells them. I once showed "0 recalls" for a GMC Sierra that has 6, because recalls are filed under "SIERRA 1500", not "Sierra". API #5 is the fix.
3. NHTSA Complaints: what real owners reported
What it gives you: complaints filed by owners, with crash, fire, injury and death counts, the components involved, and the owner's own description.
curl "https://api.nhtsa.gov/complaints/complaintsByVehicle?make=honda&model=accord&modelYear=2003" That returns 2,013 complaints. Each has crash, fire, numberOfInjuries, components and a summary in the owner's words.
Build idea: count complaints by component and show "the top 3 things that break on this car". It's more useful to a buyer than any spec sheet.
Gotcha: this endpoint can take several seconds on popular models. Call it in parallel with the others, and cache the result. Complaint data doesn't change hourly.
4. NHTSA 5-Star Safety Ratings, with crash test photos
What it gives you: official crash test ratings, plus links to crash test photos (US government work, public domain).
It's two steps. First find the vehicle ID:
curl "https://api.nhtsa.gov/SafetyRatings/modelyear/2017/make/toyota/model/corolla" # → { "VehicleDescription": "2017 Toyota Corolla 4 DR FWD", "VehicleId": 11142 } Then get the ratings:
curl "https://api.nhtsa.gov/SafetyRatings/VehicleId/11142" { "OverallRating": "5", "OverallFrontCrashRating": "4", "RolloverRating": "4", "FrontCrashPicture": "https://static.nhtsa.gov/crashTest/images/2017/v09984P085.JPG" } Build idea: put the crash test photo next to the stars. People understand a crumpled car faster than a number.
5. NHTSA Products: the model-name fixer
What it gives you: NHTSA's own list of model names for a make and year. It isn't exciting on its own, but it's what makes APIs 2 and 3 reliable.
curl "https://api.nhtsa.gov/products/vehicle/models?modelYear=2017&make=gmc&issueType=r" # → "SAVANA PASSENGER 2500", "CANYON", "ACADIA LIMITED", ... Users type "RX 350"; NHTSA says "RX350". Users type "Sierra"; recalls are under "SIERRA 1500". I download this list once (it's cached for 30 days), strip spaces and punctuation from both sides, and match. When the name a user typed finds nothing, I retry with NHTSA's spelling.
Lesson: when one provider has several APIs, don't assume they share identifiers.
6. US EPA fueleconomy.gov: real fuel consumption
What it gives you: official city, highway and combined fuel economy for almost every car sold in the US since 1984.
It works like a menu: model list → engine options → vehicle.
curl -H "Accept: application/json" \ "https://www.fueleconomy.gov/ws/rest/vehicle/menu/options?year=2017&make=Toyota&model=Corolla" # → [{ "text": "Auto (AV-S7), 4 cyl, 1.8 L", "value": "38154" }, ...] curl -H "Accept: application/json" "https://www.fueleconomy.gov/ws/rest/vehicle/38154" # → { "city08": "28", "highway08": "35", "comb08": "31", "fuelType": "Regular", "displ": "1.8" } Gotcha: without the Accept: application/json header you get XML.
Build idea: convert to litres per 100 km (235.215 / mpg) and multiply by your local fuel price. We show "about GH₵ X a month in fuel" using the town figure and Ghana's current official fuel price. Nobody buys a car per mile-per-gallon; they buy it per month.
7. Bank of Ghana: official exchange rates and Treasury bill rates
What it gives you: the central bank's daily interbank exchange rates and weekly Treasury bill rates.
I'll be honest: this one isn't a documented API. The Bank of Ghana publishes these as public tables on bog.gov.gh, and the page loads them as structured data. We read them once a day, cache them, and only ever request those fixed pages.
Build idea: a "dollar to cedi today" tool that shows the official rate, so people can tell how far a street or shop rate is from it. Or a Treasury bill calculator that tells someone what GH₵1,000 earns in 91 days at this week's rate.
Gotcha: if a government only publishes HTML tables, be a good citizen. Identify your bot in the User-Agent, fetch rarely, cache aggressively, and never hammer the site.
How I use them without getting blocked or slow
- Run independent calls in parallel. Recalls, ratings and fuel economy don't depend on each other. In Laravel I use
Http::pool(). - Cache by how often the data changes. Model lists: 30 days. Recalls and complaints: 7 days. Exchange rates: a day.
- Cache partial failures briefly. If one API was down, cache that answer for 15 minutes, not a week.
- Warm popular pages at night. We preload common model-years in small batches between 1 and 5:30 am.
- Say where the data comes from. "Source: NHTSA" on the page builds more trust than any design.
Over to you
The US government has the best-documented free vehicle data I've found anywhere. What free government APIs from your own country should more developers know about? I'd love to build a list in the comments, especially from African countries.
I'm Elliot, co-founder of TrustCheck, an enterprise technical writer and a researcher. I write about what I learn building software for the Ghanaian market. The car checker from this post is free at trustcheckapp.com/tools/car-check.

