NaviSightNAVISIGHT
Fleet Dashboard
V1 Stable

Navisight Underwriting API

Weather-dimension risk scoring for marine insurers — a single call returns the CVRS Voyage Severity Index, per-dimension physics breakdown, and (on request) 31-member ensemble tail risk and a 20-year ERA5 availability backtest. Complementary to compliance/sanctions (Windward) and trade-flow (Kpler) data — this API is the weather signal underneath a hull or cargo policy.

0.25°

Weather grid resolution

47yr

ERA5 historical reanalysis

~210ms

Median response latency

Endpoints

POST/api/v1/underwriting/voyage-risk

Voyage risk

Score a completed voyage against collocated ERA5 weather — routes the vessel with the CVRS engine and returns the Voyage Severity Index, seven risk sub-scores, and physical conditions.

POST/api/v1/underwriting/route-risk

Route risk

Score a client-supplied track against live forecast weather without routing — for scoring a planned voyage you already have waypoints for.

POST/api/v1/underwriting/historical

Historical availability

ERA5 reanalysis backtest for a route and vessel — the share of historical departures in a given month that would have completed inside the vessel's stated limits.

GET/api/v1/underwriting/health

Health

Per-model weather-cycle freshness and API status — gate a request on this before spending it on a stale forecast cycle.

Authentication

Every request authenticates with an API key in the X-API-Key header. A missing or invalid key returns 401; a deployment with no key configured returns 503 rather than a misleading 401, so a caller doesn't go hunting for a bad credential when the API simply isn't enabled yet.

600 req / min per key. Contact sales for a higher-volume enterprise limit.

Example — POST /voyage-risk

import os, requests

resp = requests.post(
    "https://navisight.io/api/v1/underwriting/voyage-risk",
    headers={
        "X-API-Key": os.environ["NAVISIGHT_UNDERWRITING_KEY"],
        "Content-Type": "application/json",
    },
    json={
      "vessel": {
        "imo": "9375147",
        "name": "Example Hull",
        "type": "cargo_small",
        "loa_m": 99,
        "beam_m": 16,
        "draft_m": 6.2,
        "cruising_speed_kts": 12.5,
        "max_wave_m": 4.5,
        "max_wind_kts": 40
      },
      "voyage": {
        "origin": {
          "lat": 25.7617,
          "lon": -80.1918,
          "name": "Miami, FL"
        },
        "destination": {
          "lat": 32.3078,
          "lon": -64.7505,
          "name": "St. George's, Bermuda"
        },
        "departure_utc": "2026-09-15T08:00:00Z"
      },
      "options": {
        "ensemble_routing": true,
        "include_historical_baseline": true,
        "include_compliance_check": true
      }
    },
    timeout=30,
)
resp.raise_for_status()
result = resp.json()
vsi = result["voyage_severity_index"]
print(f"VSI {vsi['score']} / 100 -- {vsi['band']}")
Example response (abridged)+
{
  "voyage_id": "vy_9f2c1e",
  "computed_at_utc": "2026-08-29T14:22:01Z",
  "api_version": "1.0.0",
  "voyage_severity_index": {
    "score": 41.3,
    "band": "Caution",
    "confidence_interval": [
      33.8,
      52.1
    ],
    "percentile_rank": 62,
    "description": "Caution (41.3/100). Elevated sea-state exposure crossing the Gulf Stream; within vessel limits."
  },
  "risk_dimensions": {
    "sea_state": {
      "score": 48.2,
      "weight": 0.3,
      "description": "..."
    },
    "wind": {
      "score": 35,
      "weight": 0.25,
      "description": "..."
    },
    "drift": {
      "score": 44.6,
      "weight": 0.1,
      "description": "..."
    }
  },
  "physical_conditions": {
    "peak_hs_m": 3.1,
    "avg_hs_m": 1.6,
    "peak_wind_kts": 28.4,
    "avg_wind_kts": 14.2
  },
  "ensemble_analysis": {
    "members": 31,
    "p_violation": {
      "wave": 0.09,
      "wind": 0.02,
      "swell": 0.01,
      "any": 0.1
    }
  },
  "route_summary": {
    "distance_nm": 1042.6,
    "estimated_transit_h": 83.4,
    "eta_p50_utc": "2026-09-18T19:30:00Z"
  },
  "metadata": {
    "weather_source": "tile_server",
    "disclaimer": "..."
  }
}

Pricing

Per-query

$0.40/voyage scored

Pay per MMSI per query. No minimum commitment — for brokers and syndicates evaluating individual risks.

Enterprise

from $48,000/yr

Unlimited queries, dedicated rate limit, portfolio-level reporting. For P&I clubs and Lloyd's syndicates scoring a full book.

Response schema — voyage-risk

FieldTypeDescription
voyage_idstringUnique identifier for this scoring run.
+voyage_severity_indexobject0-100 CVRS composite (physics + geometry only, excludes the empirically-calibrated casualty layer — see Methodology below).
risk_dimensionsobjectSeven CVRS sub-scores: sea_state, wind, drift, traffic, grounding, seasonal, regulatory — each { score, weight, description }.
physical_conditionsobjectRaw peak/avg Hs, wind, swell, current — checkable against buoy or onboard observation.
+ensemble_analysisobject | null31-member GEFS (+ ECMWF ENS when available) fan-out: P(Violation), CVaR-95, VSI distribution. Null when ensemble_routing was off.
historical_baselineobject | null20-year ERA5 availability backtest; present only when include_historical_baseline was requested.
complianceobject | nullECA/SECA transits, speed restrictions, ATBAs, protected areas, TSS, Polar Code applicability.
route_summaryobjectOrigin/destination, distance, transit hours, ETA P50/P90, segment and leg counts.
metadataobjectrequest_id, weather_data_age_h, weather_source, methodology, disclaimer.

The Voyage Severity Index reported here is the CVRS weighted sum of seven physics- and geometry-derived sub-scores, computed over the 'safest' routing objective. It deliberately excludes the empirically-calibrated casualty layer and Notices-to-Mariners proximity bump the consumer product's headline score includes, so every component traces to a forecast field or a chart feature.