Live prices for 8,400+ UK forecourts, per-station price history, national and regional trends, DVSA MOT test centres, brand logos and fuel loyalty schemes - all over simple JSON endpoints, authenticated with an API key. Prefer talking to an AI instead of code? The same data is on the MCP server.
Version 1 · base URL https://www.fuel-checker.com/api/v1
Every endpoint (except the /api/v1 index) requires an API key. Keys are part of the Business plan: sign in at fuel-checker.com/account and create one under API keys. The raw key - it looks like fc_live_… - is shown exactly once at creation; we store only a hash, so copy it somewhere safe. You can revoke and re-issue keys at any time.
Send the key on every request, in either form:
# Authorization header (recommended) curl -H "Authorization: Bearer fc_live_YOUR_KEY" \ "https://www.fuel-checker.com/api/v1/stations?lat=53.7997&lng=-1.5492&radius=5" # or the x-api-key header curl -H "x-api-key: fc_live_YOUR_KEY" \ "https://www.fuel-checker.com/api/v1/trends"
A quick way to confirm your setup: GET /api/v1 is open and echoes "authenticated": true plus your product label when the key is valid.
Forecourts with live prices - nearby a point, around a geocoded place, everything inside a map viewport, or the whole country in one call. Provide exactly one of the four location forms.
| lat, lng | Decimal coordinates for nearby mode. |
| radius | Nearby search radius in miles (default 10, max 60). |
| q | Alternative to lat/lng: a postcode or place name, geocoded server-side (404 if it cannot be resolved). |
| bbox | minLng,minLat,maxLng,maxLat - returns every forecourt in the viewport (can be thousands of rows). |
| all | all=true - full dump: every visible UK forecourt with prices in one response. The Fuel Finder feed replacement - one call, whole country. No lat/lng/q/bbox needed. |
| limit | Max results: nearby default 60 (max 200); bbox default 10000 (max 10000); all default 20000 (max 20000). |
curl -H "Authorization: Bearer fc_live_YOUR_KEY" \ "https://www.fuel-checker.com/api/v1/stations?q=LS15%207NB&radius=5" # full-UK dump - every visible forecourt with prices, one call curl -H "Authorization: Bearer fc_live_YOUR_KEY" \ "https://www.fuel-checker.com/api/v1/stations?all=true"
{
"ok": true,
"center": { "lat": 53.8078, "lng": -1.4585 },
"count": 14,
"stations": [
{
"stationId": "gnkxs_10023",
"brand": "BP",
"brandLogo": "https://www.fuel-checker.com/Brands/BP_Helios_logo.svg",
"name": "Cross Gates Service Station",
"address": "York Road, Leeds",
"postcode": "LS15 7NB",
"lat": 53.8081, "lng": -1.4551,
"phone": "0113 264 0000",
"openingHours": { "monday": "06:00-22:00", "…": "…" },
"url": "https://www.fuel-checker.com/stations/bp-cross-gates-service-station-ls15",
"amenities": ["Car wash", "ATM", "Shop"],
"prices": { "e10": 139.9, "e5": 152.9, "b7": 146.9, "sdv": null },
"recordedAt": "2026-07-08T03:05:11+00:00",
"distMiles": 0.4
}
],
"poweredBy": { "…": "…" }
}Prices are pence per litre: e10 unleaded, e5 super unleaded, b7 diesel, sdv premium diesel; null means the grade is not sold or not reported. openingHours is a day-keyed object exactly as the retailer publishes it (shape varies, null when unpublished). url is the station’s public page on fuel-checker.com.
Full detail for one forecourt plus its daily price history. History comes from our rolling per-station archive (one row per day, retained ~90 days) - ideal for sparklines and “price went up/down” logic.
| stationId | The stationId returned by /api/v1/stations. |
| days | History window, 1-90 (default 30). |
curl -H "Authorization: Bearer fc_live_YOUR_KEY" \ "https://www.fuel-checker.com/api/v1/stations/gnkxs_10023?days=14"
{
"ok": true,
"station": {
"stationId": "gnkxs_10023",
"brand": "BP",
"brandLogo": "https://www.fuel-checker.com/Brands/BP_Helios_logo.svg",
"name": "Cross Gates Service Station",
"address": "York Road, Leeds",
"postcode": "LS15 7NB",
"lat": 53.8081, "lng": -1.4551,
"phone": "0113 264 0000",
"openingHours": { "monday": "06:00-22:00", "…": "…" },
"url": "https://www.fuel-checker.com/stations/bp-cross-gates-service-station-ls15",
"amenities": ["Car wash", "ATM", "Shop"],
"prices": { "e10": 139.9, "e5": 152.9, "b7": 146.9, "sdv": null },
"recordedAt": "2026-07-08T03:05:11+00:00"
},
"history": [
{ "date": "2026-07-08", "e10": 139.9, "e5": 152.9, "b7": 146.9, "sdv": null },
{ "date": "2026-07-07", "e10": 140.9, "e5": 152.9, "b7": 147.9, "sdv": null }
],
"historyDays": 14,
"poweredBy": { "…": "…" }
}Unknown ids return 404. History is newest-first and only includes days the station reported prices.
DVSA MOT test stations - nearest to a point or place, or everything in a viewport.
| lat, lng | Decimal coordinates for nearest mode (returns up to 25). |
| radius | Search radius in miles (default 10, max 50). |
| q | Postcode or place name instead of lat/lng. |
| bbox | minLng,minLat,maxLng,maxLat viewport mode (up to 1000 rows). |
| cls | Only sites testing that MOT class, 1-7 (class 4 is ordinary cars). |
curl -H "Authorization: Bearer fc_live_YOUR_KEY" \ "https://www.fuel-checker.com/api/v1/mot?q=Leeds&radius=5&cls=4"
{
"ok": true,
"count": 25,
"stations": [
{
"siteNumber": "V123456",
"tradingName": "Crossgates MOT Centre",
"address": "Unit 3, Station Road Industrial Estate",
"town": "Leeds",
"postcode": "LS15 8DT",
"phone": "0113 260 0000",
"lat": 53.8102, "lng": -1.4498,
"classes": [4, 5, 7],
"updatedAt": "2026-06-30T02:10:44+00:00",
"distMiles": 0.7
}
],
"poweredBy": { "…": "…" }
}updatedAt is when the record was last refreshed from the DVSA register. The DVSA dataset carries no branding or artwork, so MOT centres have no logo field - there is nothing to serve, and we don’t invent one.
National and regional average prices, cheapest/priciest cities, a brand league table (with logo URLs) and a ~70-day national price history. No query parameters. Cached for 30 minutes.
curl -H "Authorization: Bearer fc_live_YOUR_KEY" "https://www.fuel-checker.com/api/v1/trends"
{
"ok": true,
"national": { "e10": 141.2, "e5": 154.8, "b7": 147.6, "sdv": 161.3 },
"regions": [ { "name": "Yorkshire & the Humber", "e10": 139.8, "…": "…" } ],
"cities": [ { "name": "Leeds", "e10": 138.9, "…": "…" } ],
"brands": [ { "name": "Asda", "logoUrl": "https://www.fuel-checker.com/Brands/ASDA_logo.svg", "e10": 136.9, "…": "…" } ],
"trend": [ { "date": "2026-05-01", "…": "…" } ],
"poweredBy": { "…": "…" }
}The canonical forecourt brand list - the same normalisation table behind the brand and brandLogo fields on the stations endpoints and the brand league on /trends. One row per brand with its logo URL and a live count of visible forecourts currently resolving to it. No query parameters. Cached for 30 minutes.
curl -H "Authorization: Bearer fc_live_YOUR_KEY" "https://www.fuel-checker.com/api/v1/brands"
{
"ok": true,
"count": 63,
"brands": [
{
"name": "BP",
"slug": "bp",
"logoUrl": "https://www.fuel-checker.com/Brands/BP_Helios_logo.svg",
"retailType": "independent",
"stationCount": 1147
},
{
"name": "Tesco",
"slug": "tesco",
"logoUrl": "https://www.fuel-checker.com/Brands/Tesco_Logo.svg",
"retailType": "supermarket",
"stationCount": 503
},
{ "…": "…" }
],
"poweredBy": { "…": "…" }
}name matches the brand field on stations exactly. logoUrl is null when we hold no artwork for the brand. retailType is the statutory retail class: "supermarket", "motorway" or "independent" (which includes the oil majors - it means “not a supermarket or motorway operator”). stationCount can be 0 for brands with no live forecourts right now.
The UK fuel loyalty schemes the Fuel Map understands - Tesco Clubcard, Nectar, BP Rewards (BPme) and Shell Go+ - with per-litre figures, redemption rules and card artwork. Static data; safe to cache for a day.
curl -H "Authorization: Bearer fc_live_YOUR_KEY" "https://www.fuel-checker.com/api/v1/loyalty"
{
"ok": true,
"count": 4,
"schemes": [
{
"id": "Nectar",
"name": "Nectar",
"short": "Nectar",
"brands": ["Sainsburys", "Sainsbury's", "Esso"],
"type": "fixed",
"perLitre": 5,
"premiumPerLitre": null,
"minLitres": 10,
"points": 300,
"title": "Nectar at Esso & Sainsbury's",
"detail": "Swap 300 Nectar points for 5p off per litre…",
"imageUrl": "https://www.fuel-checker.com/Rewards/nectar.png"
}
],
"poweredBy": { "…": "…" }
}type tells you how to treat perLitre: only "fixed" schemes take a guaranteed pence-per-litre amount off the pump price; "upto" depends on the member’s accumulated vouchers, "value" is points-back, and "none" has no per-litre component. Match schemes to forecourts via the brands list against a station’s brand.
All image URLs in v1 responses are absolute and served from this origin - you can hotlink or self-host them, keeping the attribution below either way:
| https://www.fuel-checker.com/Brands/….svg | Forecourt brand logos (all SVG), from the brandLogo field on stations, logoUrl on /brands and the brands league on /trends. Null when we hold no artwork for a brand. Filenames may contain spaces - the API URL-encodes them (%20) for you. |
| https://www.fuel-checker.com/Rewards/….png | Loyalty scheme card artwork (all PNG), from the imageUrl field on /loyalty. |
| https://www.fuel-checker.com/fuelcheck-logo.svg | The FuelChecker logo itself (SVG), from poweredBy.logo on every response - use it next to the "Powered by FuelChecker" notice. |
MOT test centres have no artwork - the DVSA register carries none, so /mot responses have no logo or image field.
Each key has a per-minute allowance (default 120 requests/min - it travels with the key, not your IP). When you hit it you get a 429 with a retry-after header (seconds); back off and retry. Need a higher ceiling? Get in touch through the site.
Errors are always JSON with "ok": false:
| 400 | { "ok": false, "error": "bbox must be minLng,minLat,maxLng,maxLat" } - bad or missing parameters. |
| 401 | { "ok": false, "error": "Invalid or missing API key." } - no key, revoked key, or a typo. |
| 402 | { "ok": false, "error": "API access requires the Business plan.…", "requiredPlan": "business" } - the key is valid but its account no longer has API access. |
| 404 | { "ok": false, "error": "Unknown station id." } - also used when ?q cannot be geocoded. |
| 429 | { "ok": false, "error": "Too many requests - please slow down." } + retry-after header. |
| 503 | { "ok": false, "error": "Data store not configured." } - temporary; retry with backoff. |
Price data contains public sector information licensed under the Open Government Licence v3.0. Every response carries a poweredBy block - including poweredBy.logo, the absolute URL of the FuelChecker mark; display “Powered by FuelChecker” (linking to fuel-checker.com) and retain the OGL notice on any page that shows this data.
If you are replacing direct DVLA/DVSA integrations, here is the honest picture of what moves over and what does not:
Forecourt and price lookups, per-station price history, national/regional trend data, MOT test centre search (locations, classes, contact details), brand and loyalty-scheme data. If your DVLA-adjacent product needs “where can I fuel up / get an MOT done nearby”, v1 covers it.
Registration-plate vehicle lookups. Tax status, tax due date, MOT status and MOT expiry for a specific vehicle come from the DVLA Vehicle Enquiry Service (VES) and the DVSA MOT history API. FuelChecker does not offer a vehicle-enquiry endpoint - those lookups need your own free API key from developer.dvla.gov.uk (and DVSA for MOT history), called directly from your own backend. Keep that part of your integration where it is.
The API is versioned in the path (/api/v1). Within v1, changes are additive only - new fields and new endpoints may appear, existing fields keep their names, types and units. Anything breaking ships as /api/v2 with notice on this page. Build parsers that ignore unknown fields.
Questions, higher rate limits or a missing field you need? Get in touch through the website - or try the MCP server if an AI assistant is the consumer.