API & Analytics

Beyond Coordinates.

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.

🚨

Safety Telemetry & Risk Engine

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.

📉

3D Bathymetric Profile

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.

🪨

Hazard Watch

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".

🛡️

Data Confidence

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.

🛰️

Live Sentinel: /inspect

A 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.

🏝️

Honest Edges

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.

Anatomy of the Route Response

An abridged response for a Category B yacht from Hvar to Vis. Rich, structured, and ready to render.

GET /route?from=43.172,16.442&to=43.062,16.183&vessel_type=cat_b
{
  "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": []
}
GET /inspect?lat=43.508&lon=16.440&sog=12&cog=145
{
  "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.