ArgoRoute doesn't just draw lines on a map. Every route returns a depth profile, a risk assessment, the weakest link in its data and every charted hazard it passes — and a second endpoint turns the same indexes into a live instrument at the helm.
Every route is checked against the vessel class: the furthest it gets from shore and the least water under the keel. The API issues a strict risk level (Safe, Caution, HighRisk, ExtremeHazard) with human-readable advisories, instead of refusing the request.
The geometry is a [lon, lat, depth] array and comes with a continuous depth profile by distance run, for a live cross-section of the seabed under the whole voyage. Offshore, where samples are 138 km apart, the profile says so rather than drawing a smooth fiction.
The finished route is walked past 169,041 charted rocks, wrecks and reefs. Everything within 500 m is listed with distance, bearing and compass point, the nearest first, and the top five become advisories: "at 9.4 nm: 410 m from charted rock, bearing 249° WSW".
The data_confidence block names the weakest origin on the route, whether every depth measured the water the hull would float in, and one sentence a navigator can act on. It is a minimum over the geometry, never an average. It also states the vertical datum: mean sea level, not the chart's.
/inspectA point query for the helm: depth and its origin, distance and bearing to the nearest shore, charted hazards around the vessel. Send speed over ground and the server opens a three-minute look-ahead — 1,852 m at 20 knots — and reports exactly the radius it searched. An eight-hour day on satellite internet costs about 3 MB.
A pin on land routes from the coast and marks the walk as a land_leg, excluded from the distance. A route the search cannot finish inside its budget is a 504, not a slow guess. A hazard check that could not run says checked: false instead of an empty list that looks like a clean one.
An abridged response for a Category B yacht from Hvar to Vis. Rich, structured, and ready to render.
{
"distance_nm": 13.9,
"geometry": {
"type": "LineString",
"coordinates": [
[16.442, 43.172, -9.0], // [lon, lat, depth_m]
[16.380, 43.145, -62.0],
…
]
},
"depth_profile": [ { "distance_nm": 0.0, "depth_m": -9.0 }, … ],
"vessel_profile": {
"category": "CatB",
"name": "Offshore / Yacht (Category B)",
"draft_m": 2.2,
"shore_buffer_nm": 1.0,
"max_safe_offshore_nm": 60.0
},
"safety_telemetry": {
"risk_level": "Safe",
"max_offshore_encountered_nm": 4.1,
"min_depth_encountered_m": -9.0,
"advisories": [
"At 9.4 nm: 410 m from charted rock, bearing 249° (WSW)."
]
},
"data_confidence": {
"weakest_origin": "baseline_straddling",
"measured_throughout": false,
"description": "At its weakest point this route crosses water whose depth was sampled across a shoreline. A 450 m sample that catches a cliff reads deeper than the water beside it. Sound your own depth here.",
"vertical_datum": {
"reference": "mean_sea_level",
"comparable_to_chart": false,
"note": "Depths are referenced to mean sea level, not to a chart's datum (LAT)…"
}
},
"hazard_watch": {
"checked": true,
"searched_radius_m": 500,
"routing_clearance_m": 50,
"smoothing_refusals": 0,
"count": 1,
"passed": [
{ "at_nm": 9.4, "kind": "rock", "distance_m": 410, "bearing_deg": 249, "cardinal": "WSW", "gives_no_visual_warning": true }
]
},
"ports": { "departure_port": "Hvar", "arrival_port": "Vis" },
"land_legs": []
}
{
"coordinates": [16.440, 43.508],
"h3_resolution": 10,
"cell_span_m": 130,
"navigable": true,
"depth_m": -38,
"data_confidence": { "weakest_origin": "track_observed", … },
"shore_proximity": {
"distance_m": 1480,
"distance_nm": 0.799,
"bearing_deg": 74,
"cardinal": "ENE"
},
"charted_hazards": { "checked": true, "searched_radius_m": 1111, "found": [] },
"motion": { "sog_kn": 12.0, "cog_deg": 145.0, "look_ahead_m": 1111 }
}
Values are illustrative; field names and structure are those of the current API. The look-ahead is three minutes of run at the reported speed, capped at 5 km.