Install
openclaw skills install buslahOne-word trigger for next bus arrival to your destination
openclaw skills install buslahNatural language bus lookup for Singapore.
bus from <source location> to <destination location>
Examples:
Use web_fetch to resolve the source location to coordinates via OneMap API:
https://www.onemap.gov.sg/api/common/elastic/search?searchVal=<source>&returnGeom=Y&getAddrDetails=Y&pageNum=1
Extract LATITUDE and LONGITUDE from the first result.
Fetch the full Singapore bus stop list and find stops closest to source coordinates:
https://busrouter.sg/data/2/bus-stops.json
This returns a JSON object where each key is a bus stop code, with fields: description, road, lat, lng.
Compute distance using: sqrt((lat2-lat1)^2 + (lng2-lng1)^2) (approximate is fine for short distances).
Pick the 3 nearest stops within ~300m.
Same as Step 1 for the destination. Extract its coordinates.
For each of the 3 nearest source stops, fetch arrivals:
https://arrivelah2.busrouter.sg/?id=<stop_code>
Then for each bus service at those stops, check if it passes near the destination using:
https://busrouter.sg/data/2/routes.json
This maps bus service numbers to arrays of stop codes in order. Cross-reference with bus-stops.json to get coordinates of each stop on the route, and check if any stop is within ~400m of the destination coordinates.
Keep only buses that:
For each matching bus at the source stop, get from the arrivelah2 response:
next.duration_ms → minutes until next bussubsequent.duration_ms → minutes until bus after thatnext.load → seat availability: SEA = Seats Available, SDA = Standing Available, LSD = Limited Standingnext.feature → WAB = Wheelchair accessiblenext.type → DD = Double decker, SD = Single deck, BD = Bendy🚌 Buses from [Source Stop Name] → [Destination]
Bus [XX]
⏰ Next: X min | Then: Y min
💺 [Seats Available / Standing / Limited Standing]
🚌 [Double Decker / Single Deck]
Bus [YY]
⏰ Next: X min | Then: Y min
💺 [Seats Available / Standing / Limited Standing]
📍 Stop: [Stop Description], [Road Name] (Stop code: XXXXX)
If no direct bus found, say so and suggest nearest MRT or alternative.
SEA = Seats Available 🟢SDA = Standing Available 🟡LSD = Limited Standing 🔴DD = Double DeckerSD = Single DeckBD = Bendy BusWAB = Wheelchair Accessible Bushttps://www.onemap.gov.sg/api/common/elastic/searchhttps://busrouter.sg/data/2/bus-stops.jsonhttps://busrouter.sg/data/2/routes.jsonhttps://arrivelah2.busrouter.sg/?id=<stop_code>