Data Sources

SGHere displays real-time information sourced entirely from Singapore government APIs and open data platforms. Here's exactly where each piece of data comes from, how often it updates, and what happens when things go wrong.

Bus Arrivals

Source: LTA DataMall — Bus Arrival API v2

Update frequency: Polled every 30 seconds per stop when actively viewed

Data included: Estimated arrival time for the next 3 buses per service, bus occupancy level (seats available / standing / crowded), bus type (single deck / double deck / bendy), and visit number (first or second trip past the stop).

The LTA API returns real-time GPS-calculated ETAs based on each bus's current position and historical travel patterns. Accuracy is generally within 1–2 minutes, though traffic conditions can cause deviations.

Bus Stop Database

Source: LTA DataMall — BusStops static dataset

Update frequency: Cached in IndexedDB on device; refreshed weekly

Data included: Approximately 5,000 bus stops with stop code, description (road name), latitude/longitude coordinates, and road name.

This static dataset is used for searching by stop code, road name, or postal code, and for plotting stop markers on the Nearby map. Since bus stops rarely move, weekly refresh is sufficient to catch new stops or closures.

Bus Routes

Source: LTA DataMall — BusRoutes dataset

Update frequency: Cached locally; refreshed weekly

Data included: Complete route information for every bus service — direction, sequence of stops, first/last bus timings, and weekday/Saturday/Sunday schedules.

This powers the search-by-route feature (type a bus number to see all stops on that route) and the last-bus indicator that warns you when the final service is approaching.

MRT Status

Source: LTA DataMall — TrainServiceAlerts API

Update frequency: Checked every 60 seconds

Data included: Service status for all MRT/LRT lines (normal operation or disruption), affected stations during incidents, and disruption messages with descriptions.

When all lines are running normally, the API returns a "normal" status. During disruptions, it provides the affected line, direction, stations involved, and a free-text message describing the issue (e.g., "Train service between Bishan and Ang Mo Kio is delayed").

MRT Crowd Levels

Source: LTA DataMall — PCDRealTime (Platform Crowd Density) API

Update frequency: Real-time during operating hours

Data included: Crowd density level at each MRT station categorised as Low (l), Moderate (m), or High (h).

Crowd data is only available during train operating hours (approximately 5:30 AM to midnight). Outside these hours, crowd levels are not displayed. The data is based on fare gate tap-in/tap-out patterns and platform sensors.

Parking Availability

Source: LTA DataMall — CarPark Availability API

Update frequency: Updated every 1 minute

Data included: Available lots for cars, motorcycles, and heavy vehicles at each car park, along with car park ID, area, development name, and coordinates.

Coverage includes HDB car parks, URA surface/multi-storey car parks, and some private car parks that report to LTA's system. The count reflects lots that are physically unoccupied at the time of the API response.

EV Chargers

Source: LTA DataMall — EV charger dataset

Update frequency: Periodically refreshed

Data included: Charger location, charger type (AC/DC), connector standard, power output (kW), number of chargers, availability status, and operator/pricing information.

EV charger locations and specifications come from LTA's dataset of registered public charging points across Singapore. Availability status is updated as charger operators report occupancy changes to the system.

Hawker Centres

Source: data.gov.sg — Hawker Centres dataset

Update frequency: Cached locally; refreshed periodically

Data included: Centre name, address, coordinates, operating hours, quarterly cleaning schedule, and number of food/market stalls.

This dataset is published by the National Environment Agency (NEA) through data.gov.sg. Cleaning schedules are published quarterly in advance, so you can always check whether a hawker centre will be closed on a given day.

Weather

Source: data.gov.sg — 2-hour weather forecast API

Update frequency: Updated every 30 minutes by NEA

Data included: Area-based weather forecasts (e.g., "Thundery Showers", "Partly Cloudy") for ~50 areas across Singapore.

The weather card on the Nearby tab shows the forecast for the area closest to your current location. This helps you decide whether to bring an umbrella before heading to the bus stop.

Map Tiles

Source: OneMap Singapore (Singapore Land Authority)

Update frequency: Tiles served on-demand; map data maintained by SLA

Data included: Dark-themed raster map tiles covering all of Singapore with streets, buildings, parks, and water bodies rendered.

OneMap is the official mapping platform for Singapore, maintained by the Singapore Land Authority. SGHere uses their dark-theme tile layer for the Nearby map, providing accurate and up-to-date street-level detail without relying on commercial mapping services.

Fallback Mechanism

Source: arrivelah community API

When used: As a backup when the primary LTA DataMall proxy is unavailable

Data included: Bus arrival times (same underlying LTA data, served through an independent community-maintained proxy)

If our primary Cloudflare Worker proxy fails to reach LTA DataMall (due to API downtime, rate limiting, or network issues), SGHere automatically falls back to the arrivelah API — a community-maintained open-source proxy that also serves LTA bus arrival data. This ensures you still get arrival information even during primary service interruptions.

Caching Strategy & Data Freshness

SGHere uses a layered caching strategy to balance speed with freshness:

  • localStorage with TTL — Small, frequently-accessed data (e.g., last-fetched arrivals, user settings) is stored in localStorage with time-to-live values. When the TTL expires, fresh data is fetched on the next request.
  • IndexedDB for large datasets — The bus stop database (~5,000 entries), bus routes, and hawker centre list are cached in IndexedDB because they're too large for localStorage. These are refreshed on a weekly schedule since they rarely change.
  • Network-first for real-time data — Bus arrivals, MRT status, and parking availability always attempt a network fetch first. Cached data is only shown briefly while the network request is in progress, and the "last updated" timestamp tells you how fresh the displayed data is.

Why data might be delayed: Even with 30-second polling, there are multiple points where small delays can add up — the bus's GPS reports its position, LTA processes that into an ETA, our proxy fetches and caches it, and then your device requests it. In total, the displayed ETA could be 10–30 seconds behind the absolute latest position. For most practical purposes, this is imperceptible, but it's why we show freshness timestamps and stale-data warnings.

You can manually force a refresh by pulling down on the arrivals list or tapping the refresh button in the header. This bypasses any local cache and fetches directly from the API.

Open SGHere

Free · No login · Works in your browser