# Singapore Weather (data.gov.sg)

> Live weather for Singapore from NEA via data.gov.sg: readings from every weather station (temperature, rainfall, humidity and wind), the two-hour, 24-hour and four-day forecasts, the UV index and air quality (PSI and PM2.5) by region. No account or API key required.

App · 6 actions. Web page: https://docs.lodol.com/docs/integrations/sg-weather

## Actions

### Get 24-hour forecast

Get NEA's forecast for Singapore for the next 24 hours: the general outlook, temperature and humidity ranges, wind, and the forecast for the north, south, east, west and centre of the island in six-hour periods. No API key required.

**Inputs**

- At (`at`, date and time): A past moment to look up instead of the latest data, in Singapore time. Leave it blank for the latest. A day on its own means the end of that day.

**Outputs**

- `forecast` (text): The general forecast, e.g. 'Thundery Showers'.
- `forecast_code` (text): NEA's code for it, e.g. 'TL'.
- `humidity_high` (number): The highest relative humidity, in %.
- `humidity_low` (number): The lowest relative humidity, in %.
- `issued_at` (text): When NEA issued this data, in Singapore time (ISO 8601).
- `periods` (list): The forecast for each region in six-hour periods, earliest first.
- `temperature_high` (number): The highest temperature, in °C.
- `temperature_low` (number): The lowest temperature, in °C.
- `valid_from` (text): When the forecast starts (ISO 8601).
- `valid_period` (text): The period in words, e.g. '0 AM 17 Oct to 0 AM 18 Oct'.
- `valid_to` (text): When the forecast ends (ISO 8601).
- `wind_direction` (text): Where the wind comes from, e.g. 'SSE'.
- `wind_speed_high` (number): The highest wind speed, in km/h.
- `wind_speed_low` (number): The lowest wind speed, in km/h.

**Example output**

```json
{
  "forecast": "Thundery Showers",
  "forecast_code": "TL",
  "humidity_high": 95.0,
  "humidity_low": 60.0,
  "issued_at": "2026-10-16T23:40:46+08:00",
  "periods": [
    {
      "central": "Cloudy",
      "east": "Cloudy",
      "end": "2026-10-17T06:00:00+08:00",
      "north": "Cloudy",
      "period": "Midnight to 6 am 17 Oct",
      "south": "Cloudy",
      "start": "2026-10-17T00:00:00+08:00",
      "west": "Cloudy"
    },
    {
      "central": "Cloudy",
      "east": "Thundery Showers",
      "end": "2026-10-17T18:00:00+08:00",
      "north": "Thundery Showers",
      "period": "Midday to 6 pm 17 Oct",
      "south": "Cloudy",
      "start": "2026-10-17T12:00:00+08:00",
      "west": "Thundery Showers"
    }
  ],
  "temperature_high": 34.0,
  "temperature_low": 25.0,
  "valid_from": "2026-10-17T00:00:00+08:00",
  "valid_period": "0 AM 17 Oct to 0 AM 18 Oct",
  "valid_to": "2026-10-18T00:00:00+08:00",
  "wind_direction": "SSE",
  "wind_speed_high": 15.0,
  "wind_speed_low": 5.0
}
```

### Get air quality

Get Singapore's air quality for the north, south, east, west and centre of the island: the 24-hour PSI, hourly and 24-hour PM2.5, PM10, ozone, carbon monoxide, sulphur dioxide and nitrogen dioxide, with NEA's health band for the highest PSI. Useful for haze alerts. No API key required.

**Inputs**

- At (`at`, date and time): A past moment to look up instead of the latest data, in Singapore time. Leave it blank for the latest. A day on its own means the end of that day.

**Outputs**

- `highest_psi` (number): The highest 24-hour PSI of any region.
- `issued_at` (text): When NEA issued this data, in Singapore time (ISO 8601).
- `psi_band` (text): NEA's health band for the highest PSI: 'Good' (0-50), 'Moderate' (51-100), 'Unhealthy' (101-200), 'Very unhealthy' (201-300) or 'Hazardous' (above 300).
- `regions` (list): One record per region: north, south, east, west and central.
- `summary` (text): One readable line, e.g. '24-hour PSI 48-55 (Moderate)'.
- `timestamp` (text): The hour the readings are for (ISO 8601).

**Example output**

```json
{
  "highest_psi": 148,
  "issued_at": "2026-10-17T02:30:34+08:00",
  "psi_band": "Unhealthy",
  "regions": [
    {
      "co_8h_max": 2,
      "latitude": 1.41803,
      "longitude": 103.82,
      "no2_1h_max": 24,
      "o3_8h_max": 51,
      "pm10_24h": 123,
      "pm25_1h": 73,
      "pm25_24h": 101,
      "psi_24h": 148,
      "region": "north",
      "so2_24h": 6
    }
  ],
  "summary": "24-hour PSI 148 (Unhealthy)",
  "timestamp": "2026-10-17T02:00:00+08:00"
}
```

### Get four-day outlook

Get NEA's weather outlook for Singapore for the next four days: the forecast, temperature and humidity ranges and wind for each day. No API key required.

**Inputs**

- At (`at`, date and time): A past moment to look up instead of the latest data, in Singapore time. Leave it blank for the latest. A day on its own means the end of that day.

**Outputs**

- `count` (number): How many days were returned.
- `days` (list): One forecast per day, earliest first.
- `issued_at` (text): When NEA issued this data, in Singapore time (ISO 8601).

**Example output**

```json
{
  "count": 1,
  "days": [
    {
      "date": "2026-10-17",
      "day": "Saturday",
      "forecast": "Thundery Showers",
      "forecast_code": "TL",
      "humidity_high": 95.0,
      "humidity_low": 60.0,
      "summary": "Afternoon thundery showers",
      "temperature_high": 34.0,
      "temperature_low": 25.0,
      "wind_direction": "SSE",
      "wind_speed_high": 15.0,
      "wind_speed_low": 5.0
    }
  ],
  "issued_at": "2026-10-16T16:50:46+08:00"
}
```

### Get station readings

Get the latest reading from each of Singapore's weather stations for one measure: air temperature, rainfall, humidity, wind speed or wind direction, with each station's name and position and the island-wide average, lowest and highest. Narrow it to one station by name or ID. No API key required.

**Inputs**

- Measure (`measure`, text, required): What to read from the stations. One of: `air_temperature` (Air temperature (°C)), `rainfall` (Rainfall in the last 5 minutes (mm)), `relative_humidity` (Relative humidity (%)), `wind_speed` (Wind speed (knots)), `wind_direction` (Wind direction (degrees)). Default: `air_temperature`.
- Station (`station`, text): Keep only stations whose name or ID contains this, e.g. Changi or S24. Leave it blank for every station.
- At (`at`, date and time): A past moment to look up instead of the latest data, in Singapore time. Leave it blank for the latest. A day on its own means the end of that day.

**Outputs**

- `average` (number): The average across the stations returned. Empty when none reported.
- `count` (number): How many stations reported.
- `maximum` (number): The highest reading returned.
- `measure` (text): The measure read, e.g. 'air_temperature'.
- `minimum` (number): The lowest reading returned.
- `readings` (list): One reading per station, by station name.
- `timestamp` (text): When the readings were taken, in Singapore time (ISO 8601).
- `unit` (text): The unit of every value: '°C', 'mm' (rain in the last 5 minutes), '%', 'knots' or 'degrees' (where the wind comes from).

**Example output**

```json
{
  "average": 28.0,
  "count": 2,
  "maximum": 28.4,
  "measure": "air_temperature",
  "minimum": 27.6,
  "readings": [
    {
      "latitude": 1.3793,
      "longitude": 103.85,
      "station_id": "S109",
      "station_name": "Ang Mo Kio Avenue 5",
      "value": 28.4
    },
    {
      "latitude": 1.2504,
      "longitude": 103.8275,
      "station_id": "S60",
      "station_name": "Artillery Avenue (Sentosa)",
      "value": 27.6
    }
  ],
  "timestamp": "2026-10-17T02:23:00+08:00",
  "unit": "\u00b0C"
}
```

### Get two-hour forecast

Get NEA's two-hour weather forecast for each of Singapore's 47 forecast areas, such as Bedok or Jurong West, with the period it covers. Narrow it to one area by name. No API key required.

**Inputs**

- Area (`area`, text): Keep only areas whose name contains this, e.g. Bedok. Leave it blank for all 47 areas.
- At (`at`, date and time): A past moment to look up instead of the latest data, in Singapore time. Leave it blank for the latest. A day on its own means the end of that day.

**Outputs**

- `count` (number): How many areas were returned.
- `forecasts` (list): One forecast per area, in NEA's order.
- `issued_at` (text): When NEA issued this data, in Singapore time (ISO 8601).
- `valid_from` (text): When the forecast period starts (ISO 8601).
- `valid_period` (text): The period in words, e.g. '2.00 am to 4.00 am'.
- `valid_to` (text): When the forecast period ends (ISO 8601).

**Example output**

```json
{
  "count": 1,
  "forecasts": [
    {
      "area": "Bedok",
      "forecast": "Cloudy",
      "latitude": 1.321,
      "longitude": 103.924
    }
  ],
  "issued_at": "2026-10-17T02:07:28+08:00",
  "valid_from": "2026-10-17T02:00:00+08:00",
  "valid_period": "2.00 am to 4.00 am",
  "valid_to": "2026-10-17T04:00:00+08:00"
}
```

### Get UV index

Get Singapore's UV index: the latest hourly value with its category (Low, Moderate, High, Very high or Extreme) and every hour so far today. No API key required.

**Inputs**

- At (`at`, date and time): A past moment to look up instead of the latest data, in Singapore time. Leave it blank for the latest. A day on its own means the end of that day.

**Outputs**

- `category` (text): Its category: 'Low' (0-2), 'Moderate' (3-5), 'High' (6-7), 'Very high' (8-10) or 'Extreme' (11 and up).
- `count` (number): How many hourly values were returned.
- `hour` (text): The hour the latest value is for (ISO 8601).
- `hourly` (list): Every hourly value so far, earliest first.
- `issued_at` (text): When NEA issued this data, in Singapore time (ISO 8601).
- `uv_index` (number): The latest hourly UV index. Empty when NEA has none.

**Example output**

```json
{
  "category": "High",
  "count": 2,
  "hour": "2026-10-16T13:00:00+08:00",
  "hourly": [
    {
      "hour": "2026-10-16T12:00:00+08:00",
      "value": 5.0
    },
    {
      "hour": "2026-10-16T13:00:00+08:00",
      "value": 6.0
    }
  ],
  "issued_at": "2026-10-16T13:11:06+08:00",
  "uv_index": 6.0
}
```
