{"openapi":"3.1.0","info":{"title":"Weather Ensemble","version":"1.0.0","summary":"Multi model weather comparison with spread and agreement, paid per call over x402.","description":"Single model forecasts are free everywhere. This API sells the disagreement between the models: per hour a median with a p15/p85 band, the full spread, an agreement score, rain probability from pooled ensemble members, a frost read, and the official DWD warnings in force.\n\nTwelve deterministic models from eleven national weather services are compared for one coordinate, hour by hour, up to seven days ahead. Rain probability comes from pooled ensemble members, not from a single run. Official DWD warnings travel with the answer, each with its validity window. Every source is named in the response.\n\nNo signup, no API key, no dashboard: every call is settled in USDC over the x402 protocol.","contact":{"name":"Die Netzhandwerker","url":"https://netzhandwerker.de"}},"servers":[{"url":"https://ensemble.netzhandwerker.de"}],"paths":{"/ensemble":{"post":{"summary":"Compare every major weather model hour by hour and return spread, model agreement and ensemble rain probability instead of one model opinion.","description":"Single models are everywhere. This is the disagreement between them: per hour a median with a p15/p85 band, the full min/max spread, how many models still carry that hour, an agreement score, rain probability derived from pooled ensemble members rather than one deterministic run, a frost assessment, and the official DWD warnings in force for the point.\n\nPrice: 0.005 USDC per call, settled over x402 on Base Mainnet.","operationId":"weather_ensemble","tags":["ensemble"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["lat","lon"],"properties":{"lat":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees."},"lon":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees."},"hours":{"type":"integer","minimum":1,"maximum":168,"default":24,"description":"Forecast hours, up to 168 (seven days). Short range models drop out beyond their own horizon; the per hour \"models\" count shows it."},"variables":{"type":"array","items":{"type":"string","enum":["temperature_2m","apparent_temperature","dew_point_2m","relative_humidity_2m","precipitation","snowfall","cloud_cover","wind_speed_10m","wind_gusts_10m","surface_pressure","pressure_msl","shortwave_radiation","cape","wind_direction_10m","weather_code"]},"default":["temperature_2m","precipitation","wind_speed_10m"],"maxItems":8,"description":"Which variables to compare. wind_direction_10m is aggregated as a circular mean with a directional consensus, weather_code as a majority vote; every other variable gets median, p15, p85, min, max and spread."},"models":{"type":"array","items":{"type":"string","enum":["icon_d2","icon_eu","knmi_harmonie_arome_netherlands","dmi_seamless","meteofrance_seamless","ukmo_seamless","ecmwf_ifs025","ecmwf_aifs025_single","gfs_seamless","gem_seamless","jma_seamless","cma_grapes_global"]},"default":["icon_d2","icon_eu","knmi_harmonie_arome_netherlands","dmi_seamless","meteofrance_seamless","ukmo_seamless","ecmwf_ifs025","ecmwf_aifs025_single","gfs_seamless","gem_seamless","jma_seamless","cma_grapes_global"],"minItems":2,"description":"Restrict the comparison to a subset of the twelve models. At least two, because a comparison of one model is just a forecast."},"timezone":{"type":"string","default":"UTC","description":"IANA zone name for the returned timestamps, for example Europe/Berlin."}}},"example":{"lat":52.2129,"lon":7.0378,"hours":48,"variables":["temperature_2m","precipitation","wind_speed_10m"]}}}},"responses":{"200":{"description":"Model comparison with spread, agreement score, ensemble rain probability, frost read and DWD warnings","content":{"application/json":{"schema":{"type":"object"},"example":{"lat":52.2129,"lon":7.0378,"agreement":{"score":78,"scale":"0 = the models contradict each other, 100 = they say the same thing","mean_spread_k":1.65,"interpretation":"leichte Abweichungen zwischen den Modellen","per_day":[{"date":"2026-08-06","mean_spread_k":1.2,"score":90}]},"models":{"count":11,"used":[{"id":"icon_d2","name":"ICON-D2","org":"Deutscher Wetterdienst","resolution":"2 km"}],"dropped":[]},"precipitation_probability":{"basis":"ensemble_members","members":111,"threshold_mm":0.1},"frost":{"risk_level":"kein","probability":0,"air_frost":{"expected":false,"hours":0}},"warnings":{"count":1,"active_count":1,"max_severity":"moderate","items":[{"event":"STURMBÖEN","validity":{"onset":"2026-08-06T04:00:00+00:00","expires":"2026-08-06T19:00:00+00:00","active_now":true}}]},"hourly":[{"time":"2026-08-06T12:00","temperature_2m":{"median":21.4,"p15":20.6,"p85":22.3,"min":20.1,"max":22.8,"spread":2.7,"models":11},"precipitation_probability":{"percent":25,"basis":"ensemble_members","members":111},"agreement":0.86,"models":11}],"sources":[{"name":"Nationale Wetterdienste","role":"Operators of the compared forecast models"}]}}}},"400":{"description":"Invalid coordinates, hours, variables or models. Not charged."},"402":{"description":"Payment required. Retry with a PAYMENT-SIGNATURE header."},"429":{"description":"Too many unsettled requests from this address. Not charged."},"502":{"description":"Upstream weather service unreachable. Not charged."}},"x-x402":{"price":{"amount":"5000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","display":"$0.005"}}}},"/warnungen":{"post":{"summary":"Official DWD severe weather warnings in force for one point in Germany, each with its validity window.","description":"The warnings the Deutscher Wetterdienst has actually issued for the warn cell containing the coordinate, in German and English, with severity, urgency, certainty and an explicit effective/onset/expires window plus whether the warning is active right now.\n\nPrice: 0.005 USDC per call, settled over x402 on Base Mainnet.","operationId":"weather_warnings","tags":["ensemble"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["lat","lon"],"properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180}}},"example":{"lat":52.2129,"lon":7.0378}}}},"responses":{"200":{"description":"Official DWD warnings with their validity window","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid coordinates, hours, variables or models. Not charged."},"402":{"description":"Payment required. Retry with a PAYMENT-SIGNATURE header."},"429":{"description":"Too many unsettled requests from this address. Not charged."},"502":{"description":"Upstream weather service unreachable. Not charged."}},"x-x402":{"price":{"amount":"5000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","network":"eip155:8453","display":"$0.005"}}}},"/models":{"get":{"summary":"The twelve compared models with operator and grid resolution, no payment required","responses":{"200":{"description":"ok"}}}},"/health":{"get":{"summary":"Service health, no payment required","responses":{"200":{"description":"ok"}}}},"/pricing":{"get":{"summary":"Machine readable price list, no payment required","responses":{"200":{"description":"ok"}}}}},"x-service":{"slug":"wetter-ensemble","tags":["weather-ensemble","model-agreement","forecast-spread","multi-model","rain-probability","frost-warning","dwd-warnings","agent-tools","energy-forecasting","logistics","agriculture"],"pitch":"Single model forecasts are free everywhere. This API sells the disagreement between the models: per hour a median with a p15/p85 band, the full spread, an agreement score, rain probability from pooled ensemble members, a frost read, and the official DWD warnings in force.","payment_protocol":"x402","models_compared":12,"max_forecast_hours":168,"endpoint_count":5,"paid_endpoint_count":2,"buyers":["energy trading and dispatch agents","logistics and routing agents","agriculture and field operation agents"]}}