UK Fuel Finder Python Library
Python library for accessing the UK Government Fuel Finder API.
⚠️ API Changes (February 17, 2025)
The UK Fuel Finder API has been updated with breaking changes:
Breaking Changes
- Removed Fields:
successandmessagefields removed from API responses - New Field:
price_change_effective_timestampadded to fuel price responses - Error Codes: Invalid batch numbers now return HTTP 404 (Not Found) instead of previous error codes
- Data Types: Latitude and longitude values now use double precision
Backward Compatibility
This library includes backward compatibility mode (enabled by default):
# With backward compatibility (default)
client = FuelFinderClient(backward_compatible=True)
prices = client.get_all_pfs_prices()
print(prices[0].success) # Returns True (for backward compatibility)
print(prices[0].message) # Returns empty string (for backward compatibility)
# Without backward compatibility
client = FuelFinderClient(backward_compatible=False)
prices = client.get_all_pfs_prices()
# prices[0].success and prices[0].message not available
Environment Variable
Control backward compatibility via environment variable:
export UKFUELFINDER_BACKWARD_COMPATIBLE=0 # Disable backward compatibility
Migration Guide
- Update to the latest version of this library
- Test with
backward_compatible=True(default) - Update your code to remove usage of
successandmessagefields - Handle 404 errors for invalid batch numbers
- Switch to
backward_compatible=Falsewhen ready - Update to use the new
price_change_effective_timestampfield
⚠️ API Changes (February 25-26, 2026)
The UK Fuel Finder API has removed additional fields:
Breaking Changes
- Removed Field:
mft_organisation_nameremoved from all API responses - Removed Field:
mft.nameremoved from CSV extracts
Impact
- The
mft_organisation_namefield inPFSandPFSInfomodels is nowOptional[str] - Field will be
Nonefor all new API responses - Existing code accessing this field will receive
Noneinstead of a string value
Migration
Check for None before using the field:
pfs = client.get_all_pfs_prices()[0]
if pfs.mft_organisation_name:
print(f"Organisation: {pfs.mft_organisation_name}")
else:
print("Organisation name not available")
Features
- OAuth 2.0 Authentication - Automatic token management with refresh support
- Comprehensive Data Access - Fuel prices and forecourt information
- Built-in Caching - Reduces API calls with configurable TTL
- Rate Limiting - Automatic retry with exponential backoff
- Type Hints - Full type annotations for better IDE support
- Extensive Error Handling - Clear exceptions for all error cases
- Batch Pagination - Automatic handling of 500-record batches
- Incremental Updates - Fetch only changed data since a specific date
Installation
pip install ukfuelfinder-kroper
Quick Start
from ukfuelfinder import FuelFinderClient
# Initialize client
client = FuelFinderClient(
client_id="your_client_id",
client_secret="your_client_secret",
environment="production" # or "test"
)
# Get all fuel prices
prices = client.get_all_pfs_prices()
# Search for stations near a location (returns list of (distance, PFSInfo) tuples)
nearby = client.search_by_location(latitude=51.5074, longitude=-0.1278, radius_km=5.0)
for distance, station in nearby:
print(f"{distance:.2f}km - {station.trading_name}")
# Get prices for specific fuel type
unleaded_prices = client.get_prices_by_fuel_type("unleaded")
# Get forecourt information
forecourts = client.get_all_pfs_info()
# Get incremental updates since yesterday
from datetime import datetime, timedelta
yesterday = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
updated_prices = client.get_incremental_price_updates(yesterday)
Environment Variables
Set credentials via environment variables:
export FUEL_FINDER_CLIENT_ID="your_client_id"
export FUEL_FINDER_CLIENT_SECRET="your_client_secret"
export FUEL_FINDER_ENVIRONMENT="production"
Then initialize without parameters:
client = FuelFinderClient()
Documentation
Requirements
- Python 3.8+
- Valid Fuel Finder API credentials from developer.fuel-finder.service.gov.uk
API Coverage
This library provides access to all Information Recipient API endpoints:
-
Authentication
- Generate OAuth access token
- Refresh access token
-
Fuel Prices
- Fetch all PFS fuel prices (full or incremental)
-
Forecourt Information
- Fetch all PFS information (500 per batch)
- Fetch incremental PFS information updates
Examples
See the examples/ directory for complete working examples:
basic_usage.py- Simple getting started exampleerror_handling.py- Comprehensive error handlingfetch_fuel_prices.py- Fetch all fuel prices and save to JSONfetch_all_sites.py- Fetch all forecourt sites and save to JSONlocation_search.py- Search for stations near a location
Backward Compatibility Example
# With backward compatibility (default)
client = FuelFinderClient(backward_compatible=True)
prices = client.get_all_pfs_prices()
print(prices[0].success) # Returns True (for backward compatibility)
print(prices[0].message) # Returns empty string (for backward compatibility)
# Without backward compatibility
client = FuelFinderClient(backward_compatible=False)
prices = client.get_all_pfs_prices()
# prices[0].success and prices[0].message not available
# Use price_change_effective_timestamp instead
if prices[0].fuel_prices:
print(prices[0].fuel_prices[0].price_change_effective_timestamp)
Development
Setup
git clone https://github.com/KRoperUK/ukfuelfinder.git
cd ukfuelfinder
pip install -e .[dev]
Running Tests
pytest
Code Quality
ruff check ukfuelfinder tests
ruff format --check ukfuelfinder tests
mypy
Future Enhancements
Potential features for future development:
Smart Fuel Recommendations
- Cost-optimized routing - Calculate total fuel cost including detour distance based on vehicle consumption
- Cheapest fuel finder - Find the most economical option considering current location, fuel prices, and distance
- Route integration - Suggest fuel stops along planned routes with minimal detour
Price Intelligence
- Price alerts - Notify users when prices drop below a threshold in their area
- Price forecasting - Predict price trends based on historical data
- Price comparison - Compare prices across brands, regions, and fuel types
Advanced Filtering
- Multi-criteria search - Filter by amenities (car wash, shop, 24-hour, EV charging)
- Brand preferences - Filter by preferred fuel brands or loyalty programs
- Fuel type availability - Find stations with specific fuel types (HVO, E10, premium diesel)
Journey Planning
- Fuel range calculator - Estimate remaining range and suggest refuel points
- Multi-stop optimization - Plan optimal fuel stops for long journeys
- Emergency fuel finder - Quick search for nearest station when running low
Data Analytics
- Spending tracking - Monitor fuel expenses over time
- Savings calculator - Calculate savings from using cheapest stations
- Regional price analysis - Compare average prices across different areas
Integration Features
- Navigation app integration - Direct routing to selected stations
- Calendar integration - Schedule reminders for regular refueling
- Vehicle integration - Sync with vehicle telematics for automatic consumption data
Contributions implementing these features are welcome! See CONTRIBUTING.md for guidelines.
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
- Data provided by the UK Government Fuel Finder service
- API documentation: developer.fuel-finder.service.gov.uk
- Content available under Open Government Licence v3.0
Support
- Issues: GitHub Issues
- API Support: Contact Fuel Finder Team
Changelog
See CHANGELOG.md for version history.
Release Procedure
Releases are automated with release-please:
- Merge changes to
mainusing Conventional Commits (feat:,fix:,chore:— these drive the version bump and changelog). - release-please maintains a release PR that bumps the version in
pyproject.tomlandukfuelfinder/__init__.py, and updatesCHANGELOG.md. - Merge the release PR — the git tag and GitHub release are created, and the
distributions are built and published to PyPI via trusted publishing
(
.github/workflows/release-please.yml).
Manual fallback: push a v* tag or run the "Publish to PyPI" workflow by hand
(.github/workflows/publish.yml).
Metadata
Release files for ukfuelfinder-kroper 3.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ukfuelfinder_kroper-3.0.0.tar.gz | 21.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ukfuelfinder_kroper-3.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 43.1 kB
Release files / ukfuelfinder_kroper-3.0.0.tar.gz
| Download URL | ukfuelfinder_kroper-3.0.0.tar.gz |
|---|---|
| Size | 21.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a438856745171cc0c373e0323f456efc46b8ad141047b46cf6e90d80520386d7
|
|
BLAKE2b-256 checksum How to use checksums |
c11efbf7b4409c6412cd6b2323591c6aa07573684a11482caf133ae4382db625
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 25, 2026.
Transparency logRelease files / ukfuelfinder_kroper-3.0.0-py3-none-any.whl
| Download URL | ukfuelfinder_kroper-3.0.0-py3-none-any.whl |
|---|---|
| Size | 21.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d75178c1fbfb83f27727f8d241698e0bfa2b2a89845b360f57eb2bc0c392174a
|
|
BLAKE2b-256 checksum How to use checksums |
398e3f8491838260b57b632d92cffa7d97436a0bfc2cfd75f66282d3e048effe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 25, 2026.
Transparency log