> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usecroma.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SIATA Geoportal

> Weather, river levels with flood thresholds, rainfall, air quality, forecasts, alerts, seismic events and cameras for the Aburrá Valley (Medellín).

Queries the SIATA geoportal (Sistema de Alerta Temprana de Medellín y el Valle de
Aburrá) for everything its station networks publish: weather with a 12-hour
series and the UV index, river, stream and storm-sewer levels with flood
thresholds and the source's alert colours, rainfall accumulated over seven
windows plus monthly totals, air quality per pollutant with the numeric ICA
index, the citizen PM2.5 sensor network, the two-day forecast per
municipality, official notices, the last seismic events and the camera
network's latest snapshots.

This source supersedes [SIATA](/colombia/siata), which is deprecated.

## Weather

`POST /co/siata-geoportal/weather/v1`

| Field          | Type   | Notes                                                                                                            |
| -------------- | ------ | ---------------------------------------------------------------------------------------------------------------- |
| `latitude`     | number | Optional. -90 to 90. Must be sent together with `longitude`.                                                     |
| `longitude`    | number | Optional. -180 to 180. Must be sent together with `latitude`.                                                    |
| `radius_km`    | number | Optional. Radius in km around the point, 0-100. Default `10`.                                                    |
| `municipality` | string | Optional. Keeps only the stations in that municipality, e.g. `Medellín`, `Itagüí`. Accents and case are ignored. |
| `station_code` | string | Optional. Returns only the station with that code, e.g. `520`.                                                   |

```bash theme={"dark"}
curl https://api.croma.run/co/siata-geoportal/weather/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "latitude": 6.2442, "longitude": -75.5812, "radius_km": 5 }'
```

All fields are optional. An empty body returns every station; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated; `municipality` and `station_code` narrow it further. Without a location filter, `distance_km` is `null` on every station.

| Field                                                                                                                        | Notes                                                                                                                                                                                              |
| ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `stations[].temperature_c`, `humidity_pct`, `wind_speed_ms`, `wind_direction_deg`, `wind_direction_cardinal`, `pressure_hpa` | The station's latest readings. `null` when the station has not reported.                                                                                                                           |
| `stations[].series_12h`                                                                                                      | Hourly temperature and humidity over the last 12 hours, oldest first, each with its ISO timestamp `at`.                                                                                            |
| `stations[].updated_at`                                                                                                      | ISO timestamp of the station's last update at the source.                                                                                                                                          |
| `uv`                                                                                                                         | The valley's UV reading: `index`, the source's `category` (`Bajo`, `Moderado`, `Alto`, ...), `temperature_c`, `measured_at`, and today's hourly `series`. `null` when the sensor has not reported. |

Readings refresh at the source every five minutes. The response is cached for one minute.

## Weather station series

`POST /co/siata-geoportal/weather-series/v1`

| Field          | Type   | Notes                                                                                                                 |
| -------------- | ------ | --------------------------------------------------------------------------------------------------------------------- |
| `station_code` | string | **Required.** Station code, e.g. `202`. Codes come from the `weather` endpoint.                                       |
| `window`       | enum   | `1h` for the last hour at one-minute resolution, `6h` for the last six hours at five-minute resolution. Default `1h`. |

```bash theme={"dark"}
curl https://api.croma.run/co/siata-geoportal/weather-series/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "station_code": "202", "window": "1h" }'
```

| Field                     | Notes                                                                                                                                                                                                                                                                   |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `found`                   | `false` when the source has no station with that code. Nothing else is returned in that case.                                                                                                                                                                           |
| `points[]`                | Readings over the window, oldest first: `at` (ISO timestamp), `temperature_c`, `humidity_pct`, `wind_speed_ms`, `pressure_hpa`. One point per minute for `1h`, one per five minutes for `6h` (`resolution_minutes`). A variable the station does not measure is `null`. |
| `mean`, `mean_3h`         | The source's mean of each variable over the whole window, and over the last three hours (only with `6h`).                                                                                                                                                               |
| `temperature_percentiles` | The station's temperature percentiles (`p10` to `p90`) as the source reports them, for context.                                                                                                                                                                         |

Station codes come from the `weather` endpoint. The response is cached for one minute.

## River levels

`POST /co/siata-geoportal/river-levels/v1`

| Field            | Type    | Notes                                                                                                                      |
| ---------------- | ------- | -------------------------------------------------------------------------------------------------------------------------- |
| `latitude`       | number  | Optional. -90 to 90. Must be sent together with `longitude`.                                                               |
| `longitude`      | number  | Optional. -180 to 180. Must be sent together with `latitude`.                                                              |
| `radius_km`      | number  | Optional. Radius in km around the point, 0-100. Default `10`.                                                              |
| `municipality`   | string  | Optional. Keeps only the stations in that municipality, e.g. `Medellín`, `Itagüí`. Accents and case are ignored.           |
| `station_code`   | string  | Optional. Returns only the station with that code, e.g. `520`.                                                             |
| `include_series` | boolean | Optional. When `true`, each station carries `series_3h`, one reading per minute for the last three hours. Default `false`. |

```bash theme={"dark"}
curl https://api.croma.run/co/siata-geoportal/river-levels/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "latitude": 6.2442, "longitude": -75.5812, "radius_km": 5 }'
```

All fields are optional. An empty body returns every station; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated; `municipality` and `station_code` narrow it further. Without a location filter, `distance_km` is `null` on every station. `include_series` adds `series_3h` to each station.

| Field                                          | Notes                                                                                                                                                                                                                                    |
| ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `stations[].kind`                              | `river` for a river or stream gauge, `sewer` for a storm-sewer sensor.                                                                                                                                                                   |
| `stations[].level_m`, `measured_at`            | Latest water level in metres and its ISO timestamp. `null` when the station has not reported.                                                                                                                                            |
| `stations[].thresholds`                        | The station's flood thresholds in metres: `safe_m`, `caution_m`, `minor_flood_m`, `major_flood_m`. `null` for sewer sensors.                                                                                                             |
| `stations[].status`                            | Where the latest level sits against those thresholds: `normal`, `elevated`, `caution`, `minor_flood` or `major_flood`. `null` when either is missing.                                                                                    |
| `stations[].max_level_3h_m`, `mean_level_3h_m` | Highest and mean level over the last three hours.                                                                                                                                                                                        |
| `stations[].series_3h`                         | One reading per minute over the last three hours, oldest first. Only with `include_series`; `null` otherwise.                                                                                                                            |
| `stations[].alert_color`, `alert_level`        | The source's own traffic light (`green`, `yellow`, `orange`, `red`) and alert level, `0` (normal) to `3`. `null` when not assessed.                                                                                                      |
| `stations[].windows`                           | The representative level over each trailing window (`last_30m`, `last_1h`, `last_3h`, `last_24h`, `last_72h`, `last_30d`), each with its own `level_m`, `measured_at` and `alert_color`.                                                 |
| `stations[].basin`, `land_cover_pct`           | Morphology of the basin the gauge drains (area, perimeter, channel length, elevations, slopes, drainage density, time of concentration, urbanised share) and its land cover in percent. `null` when the source has none for the station. |
| `advisories`                                   | Operational notices the source is currently showing for these layers, as plain text. Empty when there are none.                                                                                                                          |

Levels and thresholds refresh at the source every five minutes; alert colours, windows and sewer readings every 15 minutes to an hour. The response is cached for one minute.

## Rainfall

`POST /co/siata-geoportal/rainfall/v1`

| Field          | Type   | Notes                                                                                                            |
| -------------- | ------ | ---------------------------------------------------------------------------------------------------------------- |
| `latitude`     | number | Optional. -90 to 90. Must be sent together with `longitude`.                                                     |
| `longitude`    | number | Optional. -180 to 180. Must be sent together with `latitude`.                                                    |
| `radius_km`    | number | Optional. Radius in km around the point, 0-100. Default `10`.                                                    |
| `municipality` | string | Optional. Keeps only the stations in that municipality, e.g. `Medellín`, `Itagüí`. Accents and case are ignored. |
| `station_code` | string | Optional. Returns only the station with that code, e.g. `520`.                                                   |

```bash theme={"dark"}
curl https://api.croma.run/co/siata-geoportal/rainfall/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "latitude": 6.2442, "longitude": -75.5812, "radius_km": 5 }'
```

All fields are optional. An empty body returns every station; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated; `municipality` and `station_code` narrow it further. Without a location filter, `distance_km` is `null` on every station.

| Field                       | Notes                                                                                                                                                                       |
| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `stations[].is_raining`     | Whether the gauge is registering rain right now. `extreme_rain` and `extreme_category` carry the source's extreme-rain flag and category when it raises one.                |
| `stations[].accumulated_mm` | Rain accumulated over each trailing window: `last_5m`, `last_30m`, `last_1h`, `last_3h`, `last_24h`, `last_72h`, `last_30d`. `null` when the gauge has not reported.        |
| `stations[].monthly`        | One entry per month of the current year the gauge has data for, as `month` (`YYYY-MM`), `total_mm` and `data_availability_pct` (the share of the month the gauge reported). |
| `stations[].sub_basin`      | The stream or river basin the gauge sits in. `village` and `district` are the rural vereda and corregimiento when the gauge is outside the urban area.                      |
| `advisories`                | Operational notices the source is currently showing for this layer, as plain text.                                                                                          |

Rain flags refresh at the source every five minutes, accumulations every 15. The response is cached for one minute.

## Air quality

`POST /co/siata-geoportal/air-quality/v1`

| Field          | Type   | Notes                                                                                                            |
| -------------- | ------ | ---------------------------------------------------------------------------------------------------------------- |
| `latitude`     | number | Optional. -90 to 90. Must be sent together with `longitude`.                                                     |
| `longitude`    | number | Optional. -180 to 180. Must be sent together with `latitude`.                                                    |
| `radius_km`    | number | Optional. Radius in km around the point, 0-100. Default `10`.                                                    |
| `municipality` | string | Optional. Keeps only the stations in that municipality, e.g. `Medellín`, `Itagüí`. Accents and case are ignored. |
| `station_code` | string | Optional. Returns only the station with that code, e.g. `520`.                                                   |

```bash theme={"dark"}
curl https://api.croma.run/co/siata-geoportal/air-quality/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "municipality": "Medellín" }'
```

All fields are optional. An empty body returns every station; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated; `municipality` and `station_code` narrow it further. Without a location filter, `distance_km` is `null` on every station.

| Field                                             | Notes                                                                                                                                                                                                                                              |
| ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `stations[].pm25`, `pm10`                         | 24-hour particulate readings as `{ concentration, unit, index, category, window_start, window_end }`, `unit` = `ug/m3`.                                                                                                                            |
| `stations[].o3_8h`, `no2_1h`, `so2_1h`, `co_8h`   | Gas readings over the window in the field name, `unit` = `ppb`.                                                                                                                                                                                    |
| `...index`, `...category`                         | Colombia's air-quality index (ICA) for the reading and its category: `Buena` (0-50), `Moderada` (51-100), `Dañina a la salud de grupos sensibles` (101-150), `Dañina a la salud` (151-200), `Muy dañina a la salud` (201-300), `Peligrosa` (301+). |
| `stations[].dominant_pollutant`, `dominant_index` | The pollutant with the highest index at the station (`PM2.5`, `PM10`, `O3`, `NO2`, `SO2` or `CO`) and that index.                                                                                                                                  |
| `stations[].station_short`                        | The source's short station id, e.g. `BAR-TORR`.                                                                                                                                                                                                    |

A pollutant the station does not measure is `null`. Readings refresh at the source hourly. The response is cached for one minute.

## Citizen air sensors

`POST /co/siata-geoportal/citizen-sensors/v1`

| Field          | Type   | Notes                                                                                                            |
| -------------- | ------ | ---------------------------------------------------------------------------------------------------------------- |
| `latitude`     | number | Optional. -90 to 90. Must be sent together with `longitude`.                                                     |
| `longitude`    | number | Optional. -180 to 180. Must be sent together with `latitude`.                                                    |
| `radius_km`    | number | Optional. Radius in km around the point, 0-100. Default `10`.                                                    |
| `municipality` | string | Optional. Keeps only the stations in that municipality, e.g. `Medellín`, `Itagüí`. Accents and case are ignored. |
| `station_code` | string | Optional. Returns only the station with that code, e.g. `520`.                                                   |

```bash theme={"dark"}
curl https://api.croma.run/co/siata-geoportal/citizen-sensors/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "latitude": 6.2442, "longitude": -75.5812, "radius_km": 3 }'
```

All fields are optional. An empty body returns every station; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated; `municipality` and `station_code` narrow it further. Without a location filter, `distance_km` is `null` on every station.

| Field                               | Notes                                                                                                                                 |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `sensors[].pm25_1h`                 | PM2.5 over the last hour, in ug/m3.                                                                                                   |
| `sensors[].index_daily`, `category` | The daily PM2.5 air-quality index (ICA) and its category.                                                                             |
| `sensors[].available`               | Whether the sensor is currently reporting. `data_recovery_24h_pct` and `data_recovery_15d_pct` say how complete its recent record is. |

These are low-cost sensors run by volunteers; treat them as indicative and use `air-quality` for the reference network. Readings refresh at the source hourly. The response is cached for one minute.

## Forecast

`POST /co/siata-geoportal/forecast/v1`

| Field          | Type   | Notes                                                                                                                                                                                      |
| -------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `municipality` | string | Optional. One of the valley's municipalities, e.g. `Medellín`, `Bello`, `Itagüí`, or one of Medellín's zones (`Centro`, `Occidente`, `Oriente`, `Palmitas`). Accents and case are ignored. |

```bash theme={"dark"}
curl https://api.croma.run/co/siata-geoportal/forecast/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "municipality": "Medellín" }'
```

Without `municipality` the response carries every zone the source forecasts: the ten municipalities of the valley, with Medellín split into `Centro`, `Occidente`, `Oriente` and `Palmitas` (`zone`).

| Field               | Notes                                                                                                                                                                                                                             |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `zones[].issued_at` | ISO timestamp of the forecast run.                                                                                                                                                                                                |
| `zones[].days[]`    | Today and tomorrow: `date`, `temperature_max_c`, `temperature_min_c` and `rain`, the likelihood of rain per part of the day (`early_morning`, `morning`, `afternoon`, `night`) as the source words it: `BAJA`, `MEDIA` or `ALTA`. |

The source issues the forecast once a day, around 09:30 local time. The response is cached for one minute.

## Alerts

`POST /co/siata-geoportal/alerts/v1`

| Field          | Type    | Notes                                                                                    |
| -------------- | ------- | ---------------------------------------------------------------------------------------- |
| `include_past` | boolean | Optional. When `true`, returns past notices as well as the active ones. Default `false`. |

```bash theme={"dark"}
curl https://api.croma.run/co/siata-geoportal/alerts/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "include_past": true }'
```

| Field      | Notes                                                                                                                                                                                                                                              |
| ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `alerts[]` | Official notices from the early-warning system, most recent first: `id`, `title`, `description` (plain text), `start_date`, `end_date`, `is_active` and `audience` (who the source addresses it to, e.g. `citizen`). Empty when nothing is active. |

The response is cached for one minute.

## Seismic events

`POST /co/siata-geoportal/seismic-events/v1`

| Field          | Type   | Notes                                                                                                            |
| -------------- | ------ | ---------------------------------------------------------------------------------------------------------------- |
| `latitude`     | number | Optional. -90 to 90. Must be sent together with `longitude`.                                                     |
| `longitude`    | number | Optional. -180 to 180. Must be sent together with `latitude`.                                                    |
| `radius_km`    | number | Optional. Radius in km around the point, 0-100. Default `10`.                                                    |
| `municipality` | string | Optional. Keeps only the stations in that municipality, e.g. `Medellín`, `Itagüí`. Accents and case are ignored. |
| `station_code` | string | Optional. Returns only the station with that code, e.g. `520`.                                                   |

```bash theme={"dark"}
curl https://api.croma.run/co/siata-geoportal/seismic-events/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

All fields are optional. An empty body returns every station; `latitude` + `longitude` narrows the response to nearby stations, **sorted nearest first** with `distance_km` populated; `municipality` and `station_code` narrow it further. Without a location filter, `distance_km` is `null` on every station.

| Field                 | Notes                                                                                                                                                                                                                                                                                                                          |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `stations[].kind`     | `accelerograph` or `seismograph`, with the station's `sensor` and `technology`.                                                                                                                                                                                                                                                |
| `stations[].events[]` | The last events the station recorded, most recent first: `occurred_at`, `magnitude`, `epicenter`, `depth_km`, the epicentre's `latitude` and `longitude`, and what the station measured: `peak_acceleration_cm_s2` and `intensity_mmi` (Modified Mercalli, e.g. `IV`) on accelerographs, `peak_velocity_cm_s` on seismographs. |

The source updates this when an event is recorded. The response is cached for one minute.

## Cameras

`POST /co/siata-geoportal/cameras/v1`

| Field       | Type   | Notes                                                         |
| ----------- | ------ | ------------------------------------------------------------- |
| `latitude`  | number | Optional. -90 to 90. Must be sent together with `longitude`.  |
| `longitude` | number | Optional. -180 to 180. Must be sent together with `latitude`. |
| `radius_km` | number | Optional. Radius in km around the point, 0-100. Default `10`. |
| `type`      | string | Optional. `nivel`, `cielo`, `deprimido` or `capa_limite`.     |

```bash theme={"dark"}
curl https://api.croma.run/co/siata-geoportal/cameras/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "type": "nivel",
        "latitude": 6.2442,
        "longitude": -75.5812,
        "radius_km": 5
      }'
```

All fields are optional. `latitude` + `longitude` (with `radius_km`) return the nearby cameras nearest first with `distance_km`; `type` keeps one kind.

| Field                    | Notes                                                                                                                                                  |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `cameras[].type`         | `nivel` (pointed at a river gauge), `cielo` (sky), `deprimido` (underpass) or `capa_limite` (boundary layer), with the source's label in `type_label`. |
| `cameras[].snapshot_url` | The latest still from the camera. The source refreshes it about every minute; fetch it when you need it rather than storing the URL's content.         |

The response is cached for one minute.

<Note>
  Coverage is the Medellín metropolitan area (Valle de Aburrá) only. Points
  outside the valley return empty arrays rather than an error.
</Note>

<Card title="Full reference" icon="code" href="/api-reference/overview">
  Schemas, all response fields, and an interactive playground.
</Card>
