Guides
Webhooks
Get notified when a new forecast run is ready.
Overview
Weather Ruse fires a webhook event each time a new NWP model run completes ingestion and is ready to serve. Subscribe to these events to trigger your pipeline — no polling needed.
Webhooks are powered by Svix for guaranteed delivery with automatic retries.
Event types
| Event | When fired |
|---|---|
forecast.run.ready | A new model run finished ingestion and is live |
forecast.run.ready payload
{
"event": "forecast.run.ready",
"model": "ecmwf",
"run_time": "2025-06-20T00:00:00Z",
"available_at": "2025-06-20T05:32:00Z",
"horizon_hours": 240,
"region": "global"
}
Setting up a webhook
- Go to console.weather-ruse.com/webhooks
- Click Add endpoint
- Enter your HTTPS URL
- Select
forecast.run.ready - Save — delivery starts immediately on the next run
Verifying signatures
Each delivery includes a Svix-Signature header. Verify it to ensure the request is genuine:
import { Webhook } from "svix";
const wh = new Webhook(process.env.WEBHOOK_SECRET);
export async function POST(req: Request) {
const body = await req.text();
const headers = {
"svix-id": req.headers.get("svix-id")!,
"svix-timestamp": req.headers.get("svix-timestamp")!,
"svix-signature": req.headers.get("svix-signature")!,
};
const event = wh.verify(body, headers);
console.log("Verified event:", event);
}
from svix.webhooks import Webhook
wh = Webhook(os.environ["WEBHOOK_SECRET"])
event = wh.verify(body, {
"svix-id": request.headers["svix-id"],
"svix-timestamp": request.headers["svix-timestamp"],
"svix-signature": request.headers["svix-signature"],
})
Retry policy
Svix retries failed deliveries with exponential backoff:
| Attempt | Delay |
|---|---|
| 1 | Immediate |
| 2 | 5 minutes |
| 3 | 30 minutes |
| 4 | 2 hours |
| 5 | 5 hours |
Your endpoint must return a 2xx response within 30 seconds or the delivery is considered failed.
Model run schedule
| Model | Runs per day | Approx. ingestion delay |
|---|---|---|
| GFS | 4 | ~2 h after run time |
| ECMWF | 2 | ~4 h after run time |
| HRRR | 24 | ~20 min after run time |
| NAM | 4 | ~1.5 h after run time |
| ICON-EU | 8 | ~1 h after run time |
| AROME | 8 | ~1 h after run time |