{"weather":{"Lagos":{"temperature_c":30.0,"humidity_pct":74.0,"precipitation_mm":0.2,"wind_speed_kmh":11.8,"description":"Moderate drizzle","timestamp":"2026-10-23T14:00:00+00:00","feels_like_c":35.4,"pressure_hpa":1009.3,"cloud_cover_pct":34.0,"wind_direction_deg":204.0,"is_day":true,"icon":"drizzle","wmo_code":53,"source":"Open-Meteo","forecast":[{"date":"2026-10-23","temp_max_c":30.5,"temp_min_c":27.0,"precipitation_mm":2.8,"precipitation_probability_pct":97.0,"description":"Moderate drizzle","icon":"drizzle"},{"date":"2026-10-24","temp_max_c":30.7,"temp_min_c":25.8,"precipitation_mm":2.8,"precipitation_probability_pct":82.0,"description":"Moderate drizzle","icon":"drizzle"},{"date":"2026-10-25","temp_max_c":30.0,"temp_min_c":26.5,"precipitation_mm":3.8,"precipitation_probability_pct":93.0,"description":"Slight rain showers","icon":"rain"},{"date":"2026-10-26","temp_max_c":28.9,"temp_min_c":24.8,"precipitation_mm":3.6,"precipitation_probability_pct":76.0,"description":"Slight rain showers","icon":"rain"},{"date":"2026-10-27","temp_max_c":28.4,"temp_min_c":25.4,"precipitation_mm":5.7,"precipitation_probability_pct":100.0,"description":"Moderate drizzle","icon":"drizzle"},{"date":"2026-10-28","temp_max_c":30.1,"temp_min_c":25.3,"precipitation_mm":3.3,"precipitation_probability_pct":96.0,"description":"Moderate drizzle","icon":"drizzle"},{"date":"2026-10-29","temp_max_c":30.9,"temp_min_c":25.3,"precipitation_mm":6.6,"precipitation_probability_pct":82.0,"description":"Dense drizzle","icon":"drizzle"}]},"Accra":{"temperature_c":30.6,"humidity_pct":67.0,"precipitation_mm":0.1,"wind_speed_kmh":15.9,"description":"Light drizzle","timestamp":"2026-10-23T14:00:00+00:00","feels_like_c":35.2,"pressure_hpa":1004.4,"cloud_cover_pct":24.0,"wind_direction_deg":185.0,"is_day":true,"icon":"drizzle","wmo_code":51,"source":"Open-Meteo","forecast":[{"date":"2026-10-23","temp_max_c":31.8,"temp_min_c":26.1,"precipitation_mm":1.5,"precipitation_probability_pct":100.0,"description":"Moderate drizzle","icon":"drizzle"},{"date":"2026-10-24","temp_max_c":31.5,"temp_min_c":25.3,"precipitation_mm":2.2,"precipitation_probability_pct":98.0,"description":"Moderate drizzle","icon":"drizzle"},{"date":"2026-10-25","temp_max_c":31.7,"temp_min_c":24.9,"precipitation_mm":5.3,"precipitation_probability_pct":99.0,"description":"Slight rain showers","icon":"rain"},{"date":"2026-10-26","temp_max_c":30.8,"temp_min_c":24.8,"precipitation_mm":0.6,"precipitation_probability_pct":92.0,"description":"Light drizzle","icon":"drizzle"},{"date":"2026-10-27","temp_max_c":30.4,"temp_min_c":23.8,"precipitation_mm":11.7,"precipitation_probability_pct":100.0,"description":"Slight rain showers","icon":"rain"},{"date":"2026-10-28","temp_max_c":30.2,"temp_min_c":23.2,"precipitation_mm":2.4,"precipitation_probability_pct":100.0,"description":"Moderate drizzle","icon":"drizzle"},{"date":"2026-10-29","temp_max_c":31.5,"temp_min_c":24.1,"precipitation_mm":9.6,"precipitation_probability_pct":98.0,"description":"Dense drizzle","icon":"drizzle"}]},"Dakar":{"temperature_c":31.1,"humidity_pct":73.0,"precipitation_mm":0.0,"wind_speed_kmh":26.4,"description":"Mainly clear","timestamp":"2026-10-23T14:00:00+00:00","feels_like_c":35.8,"pressure_hpa":1006.9,"cloud_cover_pct":41.0,"wind_direction_deg":8.0,"is_day":true,"icon":"clear","wmo_code":1,"source":"Open-Meteo","forecast":[{"date":"2026-10-23","temp_max_c":31.5,"temp_min_c":28.1,"precipitation_mm":0.0,"precipitation_probability_pct":0.0,"description":"Overcast clouds","icon":"cloud"},{"date":"2026-10-24","temp_max_c":36.0,"temp_min_c":28.1,"precipitation_mm":0.0,"precipitation_probability_pct":0.0,"description":"Overcast clouds","icon":"cloud"},{"date":"2026-10-25","temp_max_c":33.4,"temp_min_c":27.3,"precipitation_mm":0.0,"precipitation_probability_pct":4.0,"description":"Overcast clouds","icon":"cloud"},{"date":"2026-10-26","temp_max_c":31.0,"temp_min_c":27.5,"precipitation_mm":0.0,"precipitation_probability_pct":0.0,"description":"Mainly clear","icon":"clear"},{"date":"2026-10-27","temp_max_c":33.4,"temp_min_c":27.3,"precipitation_mm":0.0,"precipitation_probability_pct":2.0,"description":"Partly cloudy","icon":"cloud"},{"date":"2026-10-28","temp_max_c":35.8,"temp_min_c":26.1,"precipitation_mm":0.0,"precipitation_probability_pct":0.0,"description":"Overcast clouds","icon":"cloud"},{"date":"2026-10-29","temp_max_c":31.7,"temp_min_c":24.7,"precipitation_mm":0.0,"precipitation_probability_pct":0.0,"description":"Overcast clouds","icon":"cloud"}]},"Cairo":{"temperature_c":30.2,"humidity_pct":47.0,"precipitation_mm":0.0,"wind_speed_kmh":13.8,"description":"Partly cloudy","timestamp":"2026-10-23T14:00:00+00:00","feels_like_c":31.0,"pressure_hpa":1010.8,"cloud_cover_pct":68.0,"wind_direction_deg":9.0,"is_day":true,"icon":"cloud","wmo_code":2,"source":"Open-Meteo","forecast":[{"date":"2026-10-23","temp_max_c":30.4,"temp_min_c":20.3,"precipitation_mm":0.0,"precipitation_probability_pct":0.0,"description":"Partly cloudy","icon":"cloud"},{"date":"2026-10-24","temp_max_c":30.0,"temp_min_c":18.9,"precipitation_mm":0.0,"precipitation_probability_pct":0.0,"description":"Partly cloudy","icon":"cloud"},{"date":"2026-10-25","temp_max_c":28.4,"temp_min_c":18.0,"precipitation_mm":0.0,"precipitation_probability_pct":0.0,"description":"Overcast clouds","icon":"cloud"},{"date":"2026-10-26","temp_max_c":26.8,"temp_min_c":18.2,"precipitation_mm":0.0,"precipitation_probability_pct":0.0,"description":"Overcast clouds","icon":"cloud"},{"date":"2026-10-27","temp_max_c":28.7,"temp_min_c":17.5,"precipitation_mm":0.0,"precipitation_probability_pct":0.0,"description":"Partly cloudy","icon":"cloud"},{"date":"2026-10-28","temp_max_c":26.5,"temp_min_c":18.1,"precipitation_mm":0.0,"precipitation_probability_pct":3.0,"description":"Overcast clouds","icon":"cloud"},{"date":"2026-10-29","temp_max_c":25.9,"temp_min_c":16.1,"precipitation_mm":0.0,"precipitation_probability_pct":3.0,"description":"Overcast clouds","icon":"cloud"}]},"Nairobi":{"temperature_c":27.9,"humidity_pct":31.0,"precipitation_mm":0.0,"wind_speed_kmh":16.4,"description":"Mainly clear","timestamp":"2026-10-23T14:00:00+00:00","feels_like_c":25.2,"pressure_hpa":839.4,"cloud_cover_pct":45.0,"wind_direction_deg":71.0,"is_day":true,"icon":"clear","wmo_code":1,"source":"Open-Meteo","forecast":[{"date":"2026-10-23","temp_max_c":30.4,"temp_min_c":16.7,"precipitation_mm":1.0,"precipitation_probability_pct":20.0,"description":"Light drizzle","icon":"drizzle"},{"date":"2026-10-24","temp_max_c":28.9,"temp_min_c":16.8,"precipitation_mm":3.2,"precipitation_probability_pct":51.0,"description":"Dense drizzle","icon":"drizzle"},{"date":"2026-10-25","temp_max_c":29.3,"temp_min_c":17.0,"precipitation_mm":0.2,"precipitation_probability_pct":67.0,"description":"Light drizzle","icon":"drizzle"},{"date":"2026-10-26","temp_max_c":28.0,"temp_min_c":16.4,"precipitation_mm":14.0,"precipitation_probability_pct":96.0,"description":"Moderate rain showers","icon":"rain"},{"date":"2026-10-27","temp_max_c":24.1,"temp_min_c":16.4,"precipitation_mm":9.6,"precipitation_probability_pct":98.0,"description":"Moderate drizzle","icon":"drizzle"},{"date":"2026-10-28","temp_max_c":26.0,"temp_min_c":15.9,"precipitation_mm":8.3,"precipitation_probability_pct":94.0,"description":"Dense drizzle","icon":"drizzle"},{"date":"2026-10-29","temp_max_c":23.9,"temp_min_c":15.7,"precipitation_mm":16.1,"precipitation_probability_pct":89.0,"description":"Slight rain showers","icon":"rain"}]},"Johannesburg":{"temperature_c":27.7,"humidity_pct":14.0,"precipitation_mm":0.0,"wind_speed_kmh":13.1,"description":"Clear sky","timestamp":"2026-10-23T14:00:00+00:00","feels_like_c":23.4,"pressure_hpa":837.0,"cloud_cover_pct":0.0,"wind_direction_deg":212.0,"is_day":true,"icon":"clear","wmo_code":0,"source":"Open-Meteo","forecast":[{"date":"2026-10-23","temp_max_c":28.5,"temp_min_c":13.4,"precipitation_mm":0.0,"precipitation_probability_pct":0.0,"description":"Unknown conditions","icon":"cloud"},{"date":"2026-10-24","temp_max_c":29.1,"temp_min_c":13.8,"precipitation_mm":0.0,"precipitation_probability_pct":0.0,"description":"Mainly clear","icon":"clear"},{"date":"2026-10-25","temp_max_c":29.3,"temp_min_c":15.3,"precipitation_mm":0.0,"precipitation_probability_pct":2.0,"description":"Mainly clear","icon":"clear"},{"date":"2026-10-26","temp_max_c":30.5,"temp_min_c":18.3,"precipitation_mm":0.0,"precipitation_probability_pct":8.0,"description":"Partly cloudy","icon":"cloud"},{"date":"2026-10-27","temp_max_c":29.0,"temp_min_c":16.7,"precipitation_mm":1.2,"precipitation_probability_pct":41.0,"description":"Light drizzle","icon":"drizzle"},{"date":"2026-10-28","temp_max_c":28.9,"temp_min_c":15.1,"precipitation_mm":0.0,"precipitation_probability_pct":27.0,"description":"Partly cloudy","icon":"cloud"},{"date":"2026-10-29","temp_max_c":32.0,"temp_min_c":16.3,"precipitation_mm":0.0,"precipitation_probability_pct":4.0,"description":"Mainly clear","icon":"clear"}]}},"prices":{"Lagos":{"maize":330,"wheat":425,"rice":520,"currency":"USD/tonne","basis":"Import-parity Gulf landed cost, port of Lagos; diesel and FX premium included","method":"reference-baseline","vintage":"2024-12","local":{"currency":"NGN","rate_per_usd":1324.6032,"maize":437119.0,"wheat":562956.0,"rice":688794.0},"fx_as_of":"Fri, 23 Oct 2026 00:02:31 +0000"},"Accra":{"maize":305,"wheat":405,"rice":545,"currency":"USD/tonne","basis":"Tema port arrivals plus Tema-Tamale freight, lower Rhine basis than Nigeria","method":"reference-baseline","vintage":"2024-12","local":{"currency":"GHS","rate_per_usd":11.6593,"maize":3556.0,"wheat":4722.0,"rice":6354.0},"fx_as_of":"Fri, 23 Oct 2026 00:02:31 +0000"},"Dakar":{"maize":345,"wheat":410,"rice":565,"currency":"USD/tonne","basis":"Senegal river-valley production plus Sahel freight; thiacland premium for local rice","method":"reference-baseline","vintage":"2024-12","local":{"currency":"XOF","rate_per_usd":584.8214,"maize":201763.0,"wheat":239777.0,"rice":330424.0},"fx_as_of":"Fri, 23 Oct 2026 00:02:31 +0000"},"Cairo":{"maize":335,"wheat":390,"rice":545,"currency":"USD/tonne","basis":"Domestic soft-wheat production and Nile import logistics","method":"reference-baseline","vintage":"2024-12","local":{"currency":"EGP","rate_per_usd":55.2156,"maize":18497.0,"wheat":21534.0,"rice":30092.0},"fx_as_of":"Fri, 23 Oct 2026 00:02:31 +0000"},"Nairobi":{"maize":285,"wheat":435,"rice":530,"currency":"USD/tonne","basis":"Kenyan production year surplus plus Mombasa import parity for wheat","method":"reference-baseline","vintage":"2024-12","local":{"currency":"KES","rate_per_usd":129.8666,"maize":37012.0,"wheat":56492.0,"rice":68829.0},"fx_as_of":"Fri, 23 Oct 2026 00:02:31 +0000"},"Johannesburg":{"maize":265,"wheat":395,"rice":505,"currency":"USD/tonne","basis":"Net-exporter basis: SAFEX-linked domestic maize, Durban import parity for rice","method":"reference-baseline","vintage":"2024-12","local":{"currency":"ZAR","rate_per_usd":16.4953,"maize":4371.0,"wheat":6516.0,"rice":8330.0},"fx_as_of":"Fri, 23 Oct 2026 00:02:31 +0000"}},"risk":{"Lagos":{"drought_risk":"LOW","flood_risk":"MEDIUM","score":28,"updated":"2026-10-23T12:02:38.852169+00:00","drivers":["90-day rainfall z-score +0.64 against the seasonal baseline","551.9 mm received vs 480.8 mm expected for this season","2-day dry spell in the last 30 days","wettest day 26.4 mm (95th percentile 16.5 mm)","1 heavy-rain days vs 0.53 expected","15.4 mm in the last 3 days"],"components":{"drought":{"level":"LOW","weight":12,"precip_recent_mm":551.9,"precip_expected_mm":480.8,"precip_deficit_pct":0.0,"precip_zscore":0.64},"flood":{"level":"MEDIUM","weight":45,"heavy_days_recent":1,"heavy_days_expected":0.53,"max_daily_mm":26.4,"max_daily_p95_mm":16.5,"rain_3day_mm":15.4,"rain_3day_p95_mm":38.9,"max_dry_spell_days":2},"alerts":[]},"method":{"drought":"90-day rainfall vs the seasonal baseline (ERA5 daily)","flood":"30-day heavy-rain days (>= 25 mm) vs expected","alerts":"GDACS official alerts"},"history_days":1827},"Accra":{"drought_risk":"MEDIUM","flood_risk":"LOW","score":28,"updated":"2026-10-23T12:02:38.852194+00:00","drivers":["90-day rainfall z-score -1.33 against the seasonal baseline","169.1 mm received vs 285.3 mm expected for this season","5-day dry spell in the last 30 days","temperature +1.6 °C above the seasonal baseline","wettest day 8.8 mm (95th percentile 11.4 mm)","0 heavy-rain days vs 0.25 expected","3.3 mm in the last 3 days"],"components":{"drought":{"level":"MEDIUM","weight":45,"precip_recent_mm":169.1,"precip_expected_mm":285.3,"precip_deficit_pct":40.7,"precip_zscore":-1.33},"flood":{"level":"LOW","weight":12,"heavy_days_recent":0,"heavy_days_expected":0.25,"max_daily_mm":8.8,"max_daily_p95_mm":11.4,"rain_3day_mm":3.3,"rain_3day_p95_mm":26.7,"max_dry_spell_days":5},"alerts":[]},"method":{"drought":"90-day rainfall vs the seasonal baseline (ERA5 daily)","flood":"30-day heavy-rain days (>= 25 mm) vs expected","alerts":"GDACS official alerts"},"history_days":1827},"Dakar":{"drought_risk":"LOW","flood_risk":"HIGH","score":47,"updated":"2026-10-23T12:02:38.852212+00:00","drivers":["90-day rainfall z-score -0.41 against the seasonal baseline","312.0 mm received vs 346.4 mm expected for this season","7-day dry spell in the last 30 days","wettest day 46.8 mm (95th percentile 5.9 mm)","1 heavy-rain days vs 0.16 expected","0.0 mm in the last 3 days"],"components":{"drought":{"level":"LOW","weight":12,"precip_recent_mm":312.0,"precip_expected_mm":346.4,"precip_deficit_pct":9.9,"precip_zscore":-0.41},"flood":{"level":"HIGH","weight":82,"heavy_days_recent":1,"heavy_days_expected":0.16,"max_daily_mm":46.8,"max_daily_p95_mm":5.9,"rain_3day_mm":0.0,"rain_3day_p95_mm":19.6,"max_dry_spell_days":7},"alerts":[]},"method":{"drought":"90-day rainfall vs the seasonal baseline (ERA5 daily)","flood":"30-day heavy-rain days (>= 25 mm) vs expected","alerts":"GDACS official alerts"},"history_days":1827},"Cairo":{"drought_risk":"LOW","flood_risk":"LOW","score":12,"updated":"2026-10-23T12:02:38.852234+00:00","drivers":["90-day rainfall z-score +2.45 against the seasonal baseline","0.8 mm received vs 0.2 mm expected for this season","30-day dry spell in the last 30 days","wettest day 0.8 mm (95th percentile 0.3 mm)","0.8 mm in the last 3 days"],"components":{"drought":{"level":"LOW","weight":12,"precip_recent_mm":0.8,"precip_expected_mm":0.2,"precip_deficit_pct":0.0,"precip_zscore":2.45},"flood":{"level":"LOW","weight":12,"heavy_days_recent":0,"heavy_days_expected":0.0,"max_daily_mm":0.8,"max_daily_p95_mm":0.3,"rain_3day_mm":0.8,"rain_3day_p95_mm":1.2,"max_dry_spell_days":30},"alerts":[]},"method":{"drought":"90-day rainfall vs the seasonal baseline (ERA5 daily)","flood":"30-day heavy-rain days (>= 25 mm) vs expected","alerts":"GDACS official alerts"},"history_days":1827},"Nairobi":{"drought_risk":"LOW","flood_risk":"LOW","score":12,"updated":"2026-10-23T12:02:38.852249+00:00","drivers":["90-day rainfall z-score +1.70 against the seasonal baseline","96.6 mm received vs 70.5 mm expected for this season","5-day dry spell in the last 30 days","wettest day 12.1 mm (95th percentile 9.0 mm)","0 heavy-rain days vs 0.08 expected","4.1 mm in the last 3 days"],"components":{"drought":{"level":"LOW","weight":12,"precip_recent_mm":96.6,"precip_expected_mm":70.5,"precip_deficit_pct":0.0,"precip_zscore":1.7},"flood":{"level":"LOW","weight":12,"heavy_days_recent":0,"heavy_days_expected":0.08,"max_daily_mm":12.1,"max_daily_p95_mm":9.0,"rain_3day_mm":4.1,"rain_3day_p95_mm":21.7,"max_dry_spell_days":5},"alerts":[]},"method":{"drought":"90-day rainfall vs the seasonal baseline (ERA5 daily)","flood":"30-day heavy-rain days (>= 25 mm) vs expected","alerts":"GDACS official alerts"},"history_days":1827},"Johannesburg":{"drought_risk":"LOW","flood_risk":"HIGH","score":47,"updated":"2026-10-23T12:02:38.852265+00:00","drivers":["90-day rainfall z-score +6.17 against the seasonal baseline","165.3 mm received vs 37.6 mm expected for this season","10-day dry spell in the last 30 days","wettest day 38.2 mm (95th percentile 11.2 mm)","1 heavy-rain days vs 0.25 expected","0.2 mm in the last 3 days"],"components":{"drought":{"level":"LOW","weight":12,"precip_recent_mm":165.3,"precip_expected_mm":37.6,"precip_deficit_pct":0.0,"precip_zscore":6.17},"flood":{"level":"HIGH","weight":82,"heavy_days_recent":1,"heavy_days_expected":0.25,"max_daily_mm":38.2,"max_daily_p95_mm":11.2,"rain_3day_mm":0.2,"rain_3day_p95_mm":27.2,"max_dry_spell_days":10},"alerts":[]},"method":{"drought":"90-day rainfall vs the seasonal baseline (ERA5 daily)","flood":"30-day heavy-rain days (>= 25 mm) vs expected","alerts":"GDACS official alerts"},"history_days":1827}},"meta":{"generated_at":"2026-10-23T14:12:15.479213+00:00","weather":{"provider":"open-meteo","label":"Open-Meteo (live)","status":"live","as_of":"2026-10-23T14:00:00+00:00","fetched_at":"2026-10-23T14:11:08.463717+00:00","detail":null,"cached":true,"age_s":65.1},"prices":{"provider":"reference-baseline","label":"Reference baseline (FAO / World Bank) · live FX","status":"live","as_of":"2024-12","fetched_at":"2026-10-23T14:02:57.369231+00:00","detail":null,"cached":true,"age_s":558.1},"risk":{"provider":"era5+gdacs","label":"Computed from ERA5 daily climate history + GDACS alerts","status":"live","as_of":"2026-10-23T06:02:32.202504+00:00","fetched_at":"2026-10-23T12:02:38.852110+00:00","detail":"0 monitored events of 25 in feed","cached":true,"age_s":7776.6},"providers":[{"provider":"prices","ok":true,"latency_ms":0.043000000000000003,"message":null,"checked_at":"2026-10-23T14:02:57.327658+00:00","consecutive_failures":0},{"provider":"risk","ok":true,"latency_ms":0.033,"message":"0 monitored events of 25 in feed","checked_at":"2026-10-23T14:02:57.330895+00:00","consecutive_failures":0},{"provider":"weather","ok":true,"latency_ms":0.082,"message":null,"checked_at":"2026-10-23T14:11:08.344680+00:00","consecutive_failures":0}],"stations":[{"key":"Lagos","name":"Lagos","country":"Nigeria","iso3":"NGA","currency":"NGN","lat":6.5244,"lon":3.3792,"tz":"Africa/Lagos","flag":"🇳🇬"},{"key":"Accra","name":"Accra","country":"Ghana","iso3":"GHA","currency":"GHS","lat":5.6037,"lon":-0.187,"tz":"Africa/Accra","flag":"🇬🇭"},{"key":"Dakar","name":"Dakar","country":"Senegal","iso3":"SEN","currency":"XOF","lat":14.7167,"lon":-17.4677,"tz":"Africa/Dakar","flag":"🇸🇳"},{"key":"Cairo","name":"Cairo","country":"Egypt","iso3":"EGY","currency":"EGP","lat":30.0444,"lon":31.2357,"tz":"Africa/Cairo","flag":"🇪🇬"},{"key":"Nairobi","name":"Nairobi","country":"Kenya","iso3":"KEN","currency":"KES","lat":-1.2921,"lon":36.8219,"tz":"Africa/Nairobi","flag":"🇰🇪"},{"key":"Johannesburg","name":"Johannesburg","country":"South Africa","iso3":"ZAF","currency":"ZAR","lat":-26.2041,"lon":28.0473,"tz":"Africa/Johannesburg","flag":"🇿🇦"}]}}