About the UK Bus Stop Finder
This tool makes it easier to find the ATCO code recorded for a UK public transport stop in NaPTAN, the Department for Transport stop dataset. ATCO codes are used by journey-planning services and integrations such as Home Assistant bus departure displays.
Search by postcode, street, place, ATCO code, or coordinates. Select a result to see its code, direction, coordinates and source fields. Bus routes come from OpenStreetMap, matched by ATCO code, and may be incomplete.
Shareable URL parameters
Use one search form at a time; selecting a stop replaces search parameters with its NaPTAN ATCO code (or OSM object ID).
| Parameters | Meaning | Example |
|---|---|---|
q |
A postcode, street, place name, or exact ATCO code. Place searches show up to 20 UK-only matches to choose from; a postcode with one match opens directly. | {{ url_for('index') }}?q=Bristol+Temple+Meads |
lat and lon |
Decimal latitude and longitude. Both are required. The map opens around this point. | {{ url_for('index') }}?lat=51.4545&lon=-2.5879 |
naptan |
A NaPTAN ATCO code. Opens the active stop and its surroundings. | {{ url_for('index') }}?naptan=010000056 |
node |
An OpenStreetMap node ID. The stop opens with nearby stops visible. | {{ url_for('index') }}?node=485403178 |
way |
An OSM way ID, for the less common stop mapped as an area. | {{ url_for('index') }}?way=123456 |
relation |
An OSM relation ID used as a stop object. | {{ url_for('index') }}?relation=123456 |
You can also enter coordinates directly in the search box as
latitude, longitude, for example 51.4545, -2.5879.
Browser location searches produce a shareable lat/lon URL.
Using the map
- Search results are sorted by distance from the searched point.
- After moving the map, results are sorted from the new map centre.
- Text searches use the visible map as a Nominatim ranking preference, but matches outside the view remain eligible.
- Stops in the visible area load automatically at zoom level 15 or closer.
- Wider views do not load stops, to keep the map readable.
- Selecting a stop highlights it and refreshes surrounding markers without closing its details.
Data and availability
Stops come from a locally imported NaPTAN download published by the Department for Transport. Only active stops with usable coordinates are shown, covering England, Scotland and Wales, not Northern Ireland. The snapshot is refreshed by the site operator; it is not a live departure feed. Contains public sector information licensed under the Open Government Licence v3.0.
Maps and bus routes use OpenStreetMap contributors' data. Place searches use Nominatim. Selecting a NaPTAN stop looks up OSM stops with the same ATCO code, then their bus route relations. A missing match or empty route list does not mean no buses serve the stop. Route queries use overpass.atownsend.org.uk, with Private.coffee as a fallback. These public services may occasionally be busy. Operators can also configure OSM as the stop source; existing OSM stop links continue to work.
Location and privacy
“Use my current location” asks the browser for permission. The coordinates are sent to this application to find nearby stops and appear in the shareable URL; the application does not intentionally persist search or location history. Requests to map tiles, Nominatim, and Overpass are subject to those services' own policies and operational logs.
Source code
The source code for this tool is available at git.4angle.com/edward/openstreetmap-tools.
JSON endpoints
The interface uses these endpoints. Errors have the form {"error": "code", "message": "text"}.
| Endpoint | Purpose |
|---|---|
GET {{ url_for('search') }}?q=… | Search a place, coordinates, or ATCO code. |
GET {{ url_for('stops') }}?lat=…&lon=… | Stops within 1 km of a point. |
GET {{ url_for('bounded_stops') }}?south=…&west=…&north=…&east=… | Stops in a safely limited map area. |
GET {{ url_for('naptan_detail', code='010000056') }} | Active NaPTAN stop by ATCO code. |
GET {{ url_for('naptan_routes', code='010000056') }} | OSM bus routes matched by ATCO code. |
GET {{ url_for('stop_detail', element_type='node', element_id=485403178) }} | One stop by OSM type and ID. |
GET {{ url_for('stop_routes', element_type='node', element_id=485403178) }} | Stop-area-aware bus routes serving a stop. |