What the monitoring system computed for each National Hurricane Center (NHC) advisory and each day of observed rainfall, with the data behind every value. The page updates after each run of the system: every 6 hours, after each NHC advisory, and when each new rainfall forecast (CHIRPS-GEFS) and observation (IMERG) arrives. The trigger is defined on the 2026 framework page (in French).
This page and its data are for information only. Official notices of activation are sent by email from the OCHA Centre for Humanitarian Data, as set out in the framework’s monitoring and activation protocol.
Data as of 5 Nov 2026, 10:23 UTC. The page and its files are refreshed after each run of the monitoring system, about every 6 hours.
Machine-readable: data/index.json (current state) · data/datapackage.json (the tables and their fields) · llms.txt (guide for scripts and AI assistants).
Once a trigger is reached for a storm, it stays reached until the end of that storm, even if later advisories no longer meet the conditions. The framework, written in French, names the three stages Mobilisation, Action and Réponse précoce; this page calls the last one Early response.
The two Action conditions based on DGPC alerts (orange in at least 6 departments; red confirmed by an NHC Hurricane Warning) are not monitored here: there is no feed of DGPC alerts. See Method and limitations.
Every North Atlantic storm the NHC has issued advisories for since 1 Aug 2026. Information emails only go out for storms within 1,000 km of Haiti.
| Storm | Advisories | First advisory | Last advisory | Min. distance | Mobilisation | Action | Early response |
|---|
Pick a storm, then an NHC advisory. The map shows what the advisory forecast; the cards on the right show how each trigger condition was evaluated.
—
| Advisory (UTC) | Closest pass | Cutoff | Rain ≤ 120 h | People 64 kt ≤ 120 h | Mobilisation | Rain ≤ 72 h | People 64 kt ≤ 72 h | Action | Data |
|---|
—
| IMERG through | 2-day rain (window max.) | Rain counts | People 64 kt observed | Early response |
|---|
These series arrive even when there is no storm. Rainfall only counts for the trigger on the days a storm is forecast (or observed) within 230 km of Haiti: from the first to the last such day, plus the day after (the shaded days). Under each chart, each storm’s closest distance to Haiti that day shows which days those are.
—
All the data on this page are public static files, updated at every
run of the system. There is no account and no key: each file has a fixed
address that a browser, curl, Python or R can read
directly. Paths below are relative to
https://ocha-dap.github.io/ds-aa-hti-hurricanes/2026/suivi/.
For scripts and AI assistants,
llms.txt describes these files on
one plain-text page, with the current status and the most common ways to
misread them.
| File | Contents |
|---|---|
data/index.json |
Entry point: thresholds, freshness of each source, list of storms with their latest advisory and triggers, latest CHIRPS-GEFS forecast and the last 45 days of IMERG. |
data/storms/{ATCF}.json |
One storm (e.g. AL052026): each advisory with its
values and the path of its file, the observed track and swath, the
IMERG days and the observed rainfall window. |
data/advisories/{ATCF}/{YYYY-MM-DDTHHMMZ}.geojson |
One NHC advisory, as GeoJSON (opens in QGIS): forecast track
points, 64 kt wind zones capped at 120 h and 72 h (already observed
area removed), observed swath; the advisory block gives
the cutoff, the rainfall windows, the CHIRPS-GEFS series used and
the result of each condition. Geometries are simplified for display
(≈ 100 m): the exact geometries are in data/buffers/. |
data/buffers/fcast_64kt.parquet |
Exact 64 kt wind zones (GeoParquet, EPSG:4326, full
precision), as the system computed them. For each advisory and each
stage, three layers (layer): the forecast zone capped at
120 h or 72 h, the observed swath removed from it, and the
difference, in which the exposed population
(exp_fcast_120h, exp_fcast_72h) is counted
within the boundary geo/hti_adm0.parquet. |
data/buffers/obsv_64kt_swaths.parquet |
Every cumulative observed 64 kt swath of the season’s storms, exact, as the storms database holds it, with the population counted in it. |
data/fcast_monitoring.csv |
One row per advisory: every forecast value and result. |
data/obsv_monitoring.csv |
One row per storm and IMERG day: observed rainfall and winds. |
data/fcast_monitoring.parquet,
data/obsv_monitoring.parquet |
The same two tables in Parquet, typed (UTC dates, numbers, booleans), for scripts. |
data/rain/chirps_gefs.csv,
data/rain/imerg.csv |
Daily national mean rainfall and 2-day total, for every CHIRPS-GEFS forecast and every IMERG day. |
data/geo/hti.geojson |
Outline of Haiti and the 230 km and 1,000 km zones (simplified). |
data/geo/hti_adm0.parquet |
The exact boundary within which exposed population is counted (FieldMaps). |
data/datapackage.json |
Every file with a description of each of its fields, its size and its checksum (Frictionless Data Package format). |
data/manifest.json |
SHA-256 checksum and size of every file, and generation time. |
For the whole season at once, read the Parquet files; for the
advisory issued at a specific date and time, read
data/storms/{ATCF}.json: each advisory is listed there with
its issue_time and the path of its file. For example:
# Whole season: recorded values and exact wind zones
import io, requests, pandas as pd, geopandas as gpd
base = "https://ocha-dap.github.io/ds-aa-hti-hurricanes/2026/suivi/data/"
rows = pd.read_parquet(base + "fcast_monitoring.parquet")
get = lambda f: io.BytesIO(requests.get(base + f).content)
zones = gpd.read_parquet(get("buffers/fcast_64kt.parquet"))
action = zones[(zones.stage == "action") & (zones.layer == "fcastonly")]
# Every advisory of one storm, then the one issued at a given time
curl -s https://ocha-dap.github.io/ds-aa-hti-hurricanes/2026/suivi/data/storms/AL042026.json | jq '.advisories[] | {issue_time, file}'
import requests
base = "https://ocha-dap.github.io/ds-aa-hti-hurricanes/2026/suivi/data/"
storm = requests.get(base + "storms/AL042026.json").json()
adv = next(a for a in storm["advisories"] if a["issue_time"] == "2026-08-28T15:00:00Z")
fc = requests.get(base + adv["file"]).json() # GeoJSON
print(fc["advisory"]["stages"]["action"]) # rainfall, winds, result
import geopandas as gpd # the wind zones
gdf = gpd.GeoDataFrame.from_features(fc["features"], crs=4326)
| Field | Meaning |
|---|---|
issue_time | Issue time of the NHC advisory (UTC). |
hours_to_closest_pass | Hours between the advisory and the closest pass to Haiti that this advisory forecasts. |
past_cutoff | True if that pass is forecast less than 48 h away: the advisory can no longer trigger (cutoff). |
rain_window_start, rain_window_end | Days the storm is forecast within 230 km of Haiti within the stage’s limit (120 h or 72 h), plus the following day. Empty if the storm is not forecast there. |
rain_eligible | True if a window exists: forecast rainfall can then count for the trigger. Empty (null) for the few advisories whose window could not be rebuilt. |
rain_120h, rain_72h / rain_2day_max_mm | Highest 2-day total of national mean rainfall (CHIRPS-GEFS) over the window, in mm. Empty without a window. |
sum_2day_mm | 2-day total assigned to the second day: rainfall on day D−1 + rainfall on day D. |
in_window_mobilisation, in_window_action, in_window | True if that day is in the window where rainfall counts. |
exp_fcast_120h, exp_fcast_72h | People in Haiti inside the forecast ≥ 64 kt wind zone up to 120 h / 72 h, excluding the area already observed (WorldPop 2026). |
exp_obsv, obsv_exp | People in Haiti inside the ≥ 64 kt wind swath already observed. |
exp_total_120h, exp_total_72h | Sum of the two: the wind condition is met if it is above 0. |
rain_trigger_*, exp_trigger_* | Rainfall or wind condition met, before the cutoff. |
mobilisation_trigger, action_trigger, obsv_trigger | Stage triggered by this advisory (or this day), cutoff included. obsv is Early response. |
rainfall_relevant | Observations: true while the IMERG day is in the window when the storm was within 230 km. |
layer | Exact zones: fcast_capped, the ≥ 64 kt wind zone of the forecast points up to 120 h or 72 h; obsv_swath_subtracted, the observed swath at the exact advisory time, removed from that zone (empty if there was none); fcastonly, the difference, in which population is counted. |
source | evaluated: zone saved by the system when it evaluated the advisory. rebuilt: advisory evaluated before the system saved its zones, recomputed once with the same function. none: can no longer be rebuilt (advisories evaluated before 22 September 2026 whose time changed in the database); no geometry. |
pop_exposed_hti, pop_exposed_recorded | People counted in the fcastonly zone, and the value recorded by the monitoring; identical when source is evaluated. |
dist_days | The storm’s closest distance to Haiti (km) on each UTC day, from the same 30-minute track as the trigger: in each advisory file (forecast track up to 120 h; older files may not have it), in storms/{ATCF}.json under obsv (observed track), and in index.json under chirps_gefs_latest.storms (latest advisory of each active storm, with its rainfall windows) and imerg_recent_storms. A rainfall window runs from the first to the last day closer than 230 km, plus the day after. |
rebuilt.differences | Tracks and rainfall windows are recomputed for the page with the same function as the monitoring; any difference from the recorded values is listed here (normally empty). geometry_identical_to_evaluated says whether the recomputed zone is identical, coordinate for coordinate, to the saved one. |
ds-storms-pipeline). The published values are those the
monitoring system recorded at evaluation time.