---
title: "Weather-Disruption-Risk index across the forecast horizon (Sugra derived)"
method: GET
path: "/api/v2/transport/disruption-risk/forecast"
tags: ["Transportation"]
---

# Weather-Disruption-Risk index across the forecast horizon (Sugra derived)

`GET /api/v2/transport/disruption-risk/forecast`

The conditions-based Weather-Disruption-Risk index computed hour by hour across the forecast horizon for any coordinate worldwide or any reporting airport, with the first crossing into high and into severe called out. Same seven factors, same published thresholds and same MAX-dominant combination as the nowcast; only the inputs move to their forecast equivalents. Every value is a FORECAST and carries uncertainty that grows with lead. This is NOT a delay probability.

## Query parameters

- `lat` number, nullable — Latitude, decimal degrees.
- `lon` number, nullable — Longitude, decimal degrees.
- `airport` string, nullable — ICAO or IATA airport code to score instead of a coordinate, e.g. EGLL or LHR.
- `hours` integer — Forecast horizon in hours, at hourly steps.

## Response `200`

Successful Response

- EnvelopeDisruptionRiskForecastFeed
  - `data` DisruptionRiskForecastFeed, required
    - `location` ForecastLocation, required
      - `requested` ForecastRequestedLocation, required
        - `lat` number, nullable
        - `lon` number, nullable
        - `airport` string, nullable
        - `hours` integer, required — Requested horizon in hours.
      - `resolved` DisruptionResolvedLocation, required
        - `lat` number, required
        - `lon` number, required — Longitude normalized to [-180, 180).
        - `method` string, required — How the coordinate was resolved: coordinates | airport_metar | airport_catalog.
        - `airport` DisruptionAirport
          - `code` string, required — The airport code as resolved, upper-cased.
          - `name` string, nullable — Airport name; null when the code was matched against a current report.
          - `source` string, required — Where the coordinate came from: noaa-awc-metar | ourairports.
    - `issued_at` string, nullable — Valid time of the first step - the earliest hour this forecast describes.
    - `summary` DisruptionRiskForecastSummary, required
      - `horizon_hours` integer, required
      - `step_hours` integer, required
      - `steps` integer, required — Steps returned, including any that could not be scored.
      - `steps_scored` integer, required
      - `peak` DisruptionRiskCrossing
        - `lead_hours` integer, required
        - `valid_time` string, required
        - `index` number, required
        - `band` string, required
        - `dominant_driver` string, nullable
      - `first_high_crossing` DisruptionRiskCrossing
        - `lead_hours` integer, required
        - `valid_time` string, required
        - `index` number, required
        - `band` string, required
        - `dominant_driver` string, nullable
      - `first_severe_crossing` DisruptionRiskCrossing
        - `lead_hours` integer, required
        - `valid_time` string, required
        - `index` number, required
        - `band` string, required
        - `dominant_driver` string, nullable
    - `series` DisruptionRiskStep[] — Hourly steps, ascending by lead.
      - `lead_hours` integer, required — Hours ahead of the current hour.
      - `valid_time` string, required — Valid time of this step, ISO 8601 UTC.
      - `index` number, nullable — Forecast index 0-100, or null when fewer than two factors could be evaluated at this step. A null step is KEPT, never dropped.
      - `band` string, nullable — low | moderate | high | severe; null with a null index.
      - `dominant_driver` string, nullable
      - `components_count` integer, required
      - `factors` ForecastStepFactors, required
        - `flight_category` ForecastFlightCategoryFactor
          - `score` number, required
          - `category` string, required — NOAA flight category at this step.
          - `derivation` string, required — Always sugra-computed: a TAF carries no flight category, so it is derived from the period ceiling and visibility.
          - `station` string, nullable — Station whose TAF was used.
          - `distance_km` number, nullable
          - `base_category` string, nullable — The prevailing group's category, before any overlay.
          - `raised_by` ForecastFlightCategoryOverlay
            - `change` string, required — TAF change group that raised the category: TEMPO | PROB.
            - `from` string, nullable
            - `to` string, nullable
        - `wind` ForecastWindFactor
          - `score` number, required
          - `wind_speed_kt` number, required — Forecast 10 m wind, knots (knots at source).
        - `gust` ForecastGustFactor
          - `score` number, required
          - `wind_gust_kt` number, required
          - `gust_spread_kt` number, nullable
        - `precipitation` ForecastPrecipitationFactor
          - `score` number, required
          - `rate_mm_h` number, nullable — Forecast precipitation rate, mm per hour.
        - `convection` ForecastConvectionFactor
          - `score` number, required
          - `cape_jkg` number, nullable — Convective available potential energy, J/kg. Potential, not realisation.
          - `advisory` ConvectiveAdvisoryRef
            - `advisory_type` string, nullable
            - `hazard` string, nullable
            - `valid_from` string, nullable
            - `valid_to` string, nullable
            - `distance_km` number, nullable — 0 when the point falls inside the advisory polygon; otherwise the distance to the advisory centroid.
        - `wave` ForecastWaveFactor
          - `score` number, required
          - `wave_height_m` number, nullable
          - `wave_period_s` number, nullable
        - `hazard_overlay` ForecastHazardOverlayFactor
          - `score` number, required
          - `events` ForecastHazardEvent[] — Only events that scored above zero, worst first.
            - `event_type` string, required
            - `event_id` string, nullable
            - `place` string, nullable
            - `severity` string, nullable
            - `distance_km` number, required
            - `influence_radius_km` number, required — Scoring influence radius. NOT an official warning area.
            - `positioning` string, required — forecast_polygon when the advisory published a forecast geometry valid at this step, observed_position_held otherwise.
            - `forecast_valid_time` string, nullable — Valid time of the forecast polygon used, when one was.
            - `lead_confidence` number, required — Confidence multiplier applied at this lead. 1.0 for a real forecast geometry; decays linearly for a held observed position.
            - `score` number, required — Severity after distance decay and lead confidence.
          - `feeds_read` integer, required
          - `feeds_total` integer, required
      - `unavailable_factors` object — Factor name to the reason it could not be evaluated at this step. An absent factor is excluded from the combination, never scored as zero.
    - `thresholds` object — The complete published threshold set, including the forecast-only additions (CAPE curve, hazard lead confidence, TAF category resolution), echoed so any step can be reproduced.
    - `methodology` string, required
    - `attribution` DisruptionAttribution, required
      - `attribution` DisruptionAttributionEntry[] — The Sugra-derived entry first (no sovereign shield), then every base source that actually contributed to this point.
        - `registry_key` string, required
        - `source_name` string, required
        - `licence` string, nullable
        - `citation` string, nullable — Modified-form citation; absent on the Sugra-derived entry itself.
        - `disclaimer` string, required
      - `effective_reexport` string, required — Most-restrictive re-export verdict across the contributing bases.
    - `disclaimer` string, required
  - `meta` SugraMeta, required — Metadata attached to every /api/v1/* response envelope.
    - `endpoint` string, required — Requested endpoint path.
    - `data_time` string, required — ISO 8601 UTC timestamp of the source data, not of the request.
    - `response_time` string, required — ISO 8601 UTC timestamp when this response was produced.
    - `provider` string, required — API name and version.
    - `source` string, nullable — Identifier of the primary upstream source used for this response.
    - `attribution` string, nullable — Human-readable attribution mandated by an upstream source (e.g. a securities regulator or self-regulatory organization). Present only on responses whose source requires the owner and source to be clearly identified. Do not remove or alter it when using the response.
    - `fallback_used` boolean, nullable — True when the primary source failed and a fallback produced the data.
    - `fallback_chain` string[], nullable — Ordered list of sources attempted, in the order they were tried.
    - `cached` boolean, nullable — True when this response was served from the internal cache.
    - `stale` boolean, nullable — True when the cached response was returned after the upstream rate-limited or errored. Clients can use this to detect degraded data.

## Other responses

- `401` — Missing or invalid `x-api-key` header.
- `422` — Validation Error
- `429` — Daily rate limit exceeded. Check `X-RateLimit-Reset` for the next window.
- `503` — Upstream source is temporarily unavailable. Retry after a short delay.

---

[API](https://skmtc.net/sugra/apis/sugra-api.md) · [All operations](https://skmtc.net/sugra/apis/sugra-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/sugra/sugra-api/versions/4e2740743eb4/schema)
