What's the rule for bus stop parents in NaPTAN?

I’ve been using the /StopPoint/{id} API to fetch bus stop information. This API appears to find the root of the tree of StopPoint nodes that contains the StopPoint with the given id. Normally I get back a bus stop cluster or pair as the root, but sometimes the root is a transport hub or rail/metro station.

I’ve also started spotting cases where there is no parent for the bus stop - it’s not part of a bus stop pair or cluster or anything else.

My question is this:

  • Is this permitted for the TfL-maintained bits of the NaPTAN data?
    • If so, why doesn’t the TfL website gracefully handle this case?
    • If not, could some kind of audit be done to find and fix all the cases where a bus stop is missing a parent pair/cluster?

Example stop: ‘Dartford Grammar School for Girls’. There are two stops that share this name that are in the same place, served by the 492 in both directions. On the site, Dartford Grammar School For Girls - Transport for London works as a bus stop page, but attempting to browse to the ‘parent page’ (the immediate child of ‘Stations, stops & piers’) causes an error, suggesting the site assumes a parent can be found and falls over when it doesn’t find one.


As Dartford is outside the Greater London Authority area, Transport for London has no authority to define items there. Outside the GLA area, buses are run by private companies that are a literal law unto themselves : Bus services – Dartford Borough Council

If these stops are in NaPTAN they are a lot more controlled than this - it sounds like a “Stop Area” is missing.

If you can give me the ATCOCodes for these stops I can have a closer look

I don’t know if I ever did find others besides these but there’s a string of them along the 492 route towards Dartford (linked by a common stop name where possible):

Outbound id Inbound id Stop name
2400102531 X North Road
2400A070830A 2400102533 Seaton Road
2400102535 2400102537 Princes Road
2400A072640A 2400102539 Shepherds Lane / Havelock Road
2400102541 2400102543 Somerset Road
2400102545 240090625 Dartford Grammar School For Girls
240090627 240090629 Dartford Grammar School For Boys
2400102547 2400A019690A West Hill / Shepherds Lane
2400A019780A X Priory Hill
2400A060520A 2400A019280A Livingstone Hospital
2400102527 X Shenley Road
2400A018820A X The Brent
2400A018830A 2400A018810A Brentfield Road
2400A018840A 2400A018800A Milestone Road
2400A018850A 2400A018790A Brent School
2400A018860A 2400A018780A Welsh Tavern
2400A018870A 2400A018770A Elm Road
2400A018890A 2400A018750A Winston Close
2400A018900A 2400A018740A Waterstone Park
X 2400102529 Chastilian Road / North Road
X 2400109432 Constance Grove
X 2400A019270A Park Road
X 2400A019260A St Vincents Road

Looking closer at it, this could be an issue with the API, since I can only see this happening for stops outside the ‘490’ area (ta @briantist for the pointer) - I’ll see if I can dig up some more

Pulled some more by just cheating and looking at bus routes that escaped London. Apologies if some of these are red herrings - I hacked some code together to look for null parents.

Outbound Inbound Name
40004408086A X South Street
40004408086B X South Street / Rose Hill
X 40004408088A Vincent Lane
2400A019740A 2400A019720A Maiden Lane
2400A019750A X Bird In Hand
2400A019760A 2400A019710A Havelock Road
2400A019770A 2400A019700A West Hill School
2400102547 2400A019690A West Hill / Shepherds Lane
2400A019780A X Priory Hill
2400101012 2400A019210A Darent Valley Hospital
X 2400109432 Constance Grove
210021000540 210021001500 Potters Bar Tesco
210021085060 210021085060 Dame Alice Owen’s School
03700347 X Herschel Street
03700344 X Observatory Centre
03700345 X Wexham Road
03700087 03700086 The Toby
03700089 03700090 Sutton Lane
03700156 03700155 Crown Close
X 03700340 Queensmere Shopping Centre
X 03700161 Star & Garter

Thanks - I will see what I can find out in NaPTAN and start chasing down someone to update these.

I will let you know what the problem is - and how I get along trying to solve it.


hi @drjharrison - did you get any feedback from the relevant local authorities on these?

Many thanks,

Hi James

Yes - @MMJZ is helping get a list together to share. They know why this happens (long story involving changing tech over the years) and are happy to work on solving.

One of the funzies moments is that this may involve making the change for each stop individually in the software. Will of course try and find a better solution than grind!


Dr J

1 Like