---
title: "Measured overhead clearance along a route shape (see module docs)."
method: POST
path: "/v1/clearance/along"
tags: ["clearance"]
---

# Measured overhead clearance along a route shape (see module docs).

`POST /v1/clearance/along`

## Request

- Base URL: `https://api.mapmap.ai`
- URL: `https://api.mapmap.ai/v1/clearance/along`
- Auth: one of:
  - HTTP bearer
  - API key in query parameter `api_key`

## Request body

- ClearanceAlongRequest: Request body for `POST /v1/clearance/along`.
  - `datasets` string[], nullable: Narrow the search to these datasets. The default is every dataset this key may see whose survey covers the corridor. A name this key may not see, or that does not exist, is dropped: the answer is the same "not surveyed" either way.
  - `geometry_polyline6` string, required: The corridor as a Google encoded polyline, six-digit precision, typically `geometry_polyline6` from a prior `/route` response. Capped at 10,000 vertices.
  - `include_station_geometry` boolean: Fill every section's deprecated `polyline` array with the raw station positions (`[lng, lat]`, one per 0.5 m station) instead of the simplified points `polyline6` encodes. Off by default: on a whole-route "not surveyed" run the raw array is megabytes.
  - `margin_m` number, double: The caller's operating margin in metres, added to the height. Defaults to zero, and is echoed back: no compliance policy is baked in here, both figures are reported.
  - `vehicle_height_m` number, double, required: Vehicle height in metres. Required: there is no default vehicle.
  - `vehicle_width_m` number, double, nullable: Vehicle width in metres. The width axis is assessed only when this is given; without it the report answers for height and says so.

## Response `200`

The clearance report: verdict per axis, limiting point with its bound, coverage, datasets read

- RouteClearanceReport: The full response for `POST /v1/clearance/along`.
  - `advisories` Advisory[], required: Notes on stretches of the route.
    - `note` string, required: The note, in a sentence.
    - `section` RouteSection, required: A contiguous run of route stations, by distance along the route.
      - `end_m` number, double, required: Distance along the route at which the run ends, metres.
      - `polyline` array[], nullable: **Deprecated: read `polyline6`.** The same run as `[lng, lat]` pairs (GeoJSON order), kept for one release so consumers written against the array (the points SDK's `reportToGeoJson`) keep drawing. By default these are exactly the Douglas-Peucker-simplified positions `polyline6` encodes, not the 0.5 m stations; with `include_station_geometry: true` on the request it is every station instead. Absent only on a section built in-process and never shaped for the wire.
        - number[]
      - `polyline6` string: The run's shape for display: a six-digit Google encoded polyline (latitude first, like `route.geometry_polyline6`), simplified with Douglas-Peucker to about 1 m. Always at least two positions, spanning `start_m` to `end_m`.
      - `start_m` number, double, required: Distance along the route at which the run starts, metres.
  - `basis` string, required: Always `surveyed_geometry_not_signage`.
  - `clearance_enforcement` ClearanceEnforcement, required: The honesty block carried on every response, including the clear one. Copied from the ADR tunnel-enforcement pattern for the same reason: the clear answer is the dangerous one, because it reads as a certificate.
    - `basis` string, required: Always `surveyed_pointcloud_within_survey_difference`.
    - `caveat` string, required: What this answer does and does not prove.
    - `route_certified` boolean, required: Always false.
    - `vertical_datum` string, required: The vertical frame the surveyed figures live in, spelled for a reader (Rule D5).
  - `datasets` DatasetRef[], required: The datasets drawn on.
    - `dataset` string, required: The dataset id.
    - `stale` boolean, required: Whether the artefact lags its sources, or has not been checked against them. Either way no route passes on it.
    - `survey_dates` string, required: Capture range, `from/to` in ISO dates.
  - `explanation` string, required: One-line honest summary. British English, no claim words, no em dashes; see `explain.rs`, which enforces that rather than asking.
  - `height` union, required: The verdict for the height axis. See the module docs. `Pass` takes [`CompleteCoverage`] and nothing else, and `NoVerdict` takes [`PartialCoverage`] and nothing else. The first is the safety invariant; the second is its mirror, stated here because the contract only implied it: "no verdict" over ground that was fully assessed would be a contradiction, and a caller reading `no_verdict` is entitled to find the gaps that caused it.
    - object: The vehicle clears every assessed station by more than the stated bound, and every metre of the route was assessed.
      - `coverage` CompleteCoverage, required: Coverage with no gaps: every metre of the route was assessed against survey data good enough to decide on. **This type has no field for a gap, and that absence is the safety invariant.** [`RouteVerdictOut::Pass`] accepts nothing else, so a passing route with unsurveyed sections is not a state this crate can build, serialise or be talked into.
        - `assessed_m` number, double, required: Metres of route assessed. Equal to the route length.
        - `kind` string, required: Always `complete`.
      - `tightest` LimitingPointOut: A point on the route with its measurement and a link to see it.
        - `clearance` MeasuredClearance, required: One measured clearance. Uncertainty is not optional, and that is the point: a headroom figure without its bound is a number somebody will treat as exact. There is no field here for a signed or legal height, by design.
          - `headroom_m` number, double, required: `overhead_z - road_z`, a within-survey difference (Rule D1), metres.
          - `overhead_class` 'structure' | 'vegetation' | 'wire' | 'unknown', required: What the lowest validated overhead surface above a cell is made of. The class is a label on a measurement, never a reason to drop one. A branch across a lane is a real obstruction, so vegetation and wire constrain the verdict exactly as a structure does; what the class changes is how the answer is caveated (a vegetation-limited reading on an old survey degrades, per the verdict arithmetic).
          - `safe_headroom_m` number, double, required: `headroom_m - k*sigma_m - sampling_gap_m`, metres. The verdict input.
          - `sampling_gap_m` number, double, required: One-sided sampling bias bound, metres: how far below the lowest sample the true low point could hang, given the sample spacing.
          - `sigma_m` number, double, required: Combined one-sigma measurement uncertainty, metres.
          - `support_m2` number, double, required: Connected-component area of the overhead cluster, square metres.
          - `surveyed_on` string, required: Last capture date of the survey behind this measurement, ISO.
        - `dataset` string, required: The dataset the measurement came from.
        - `location` LocationOut, required: A WGS84 position, in the order the wire uses.
          - `lat` number, double, required: Latitude, degrees.
          - `lng` number, double, required: Longitude, degrees.
        - `route_distance_m` number, double, required: Distance along the route, metres.
        - `view_url` string, required: Deep link to this exact view in the survey viewer.
      - `verdict` 'pass', required
    - object: The vehicle does not clear a measured headroom somewhere.
      - `all_failures` LimitingPointOut[], required: **Every point that fails, worst first, including `limiting`.** `all_failures[0]` and `limiting` are the same point. The contract left the relationship unstated, which leaves a renderer to guess whether to draw the list, the limiting point, or both, and one of those guesses draws the worst obstruction twice. Pinned here: the list is complete, `limiting` is a convenience, and a caller that draws only the list has drawn everything.
        - `clearance` MeasuredClearance, required: One measured clearance. Uncertainty is not optional, and that is the point: a headroom figure without its bound is a number somebody will treat as exact. There is no field here for a signed or legal height, by design.
          - `headroom_m` number, double, required: `overhead_z - road_z`, a within-survey difference (Rule D1), metres.
          - `overhead_class` 'structure' | 'vegetation' | 'wire' | 'unknown', required: What the lowest validated overhead surface above a cell is made of. The class is a label on a measurement, never a reason to drop one. A branch across a lane is a real obstruction, so vegetation and wire constrain the verdict exactly as a structure does; what the class changes is how the answer is caveated (a vegetation-limited reading on an old survey degrades, per the verdict arithmetic).
          - `safe_headroom_m` number, double, required: `headroom_m - k*sigma_m - sampling_gap_m`, metres. The verdict input.
          - `sampling_gap_m` number, double, required: One-sided sampling bias bound, metres: how far below the lowest sample the true low point could hang, given the sample spacing.
          - `sigma_m` number, double, required: Combined one-sigma measurement uncertainty, metres.
          - `support_m2` number, double, required: Connected-component area of the overhead cluster, square metres.
          - `surveyed_on` string, required: Last capture date of the survey behind this measurement, ISO.
        - `dataset` string, required: The dataset the measurement came from.
        - `location` LocationOut, required: A WGS84 position, in the order the wire uses.
          - `lat` number, double, required: Latitude, degrees.
          - `lng` number, double, required: Longitude, degrees.
        - `route_distance_m` number, double, required: Distance along the route, metres.
        - `view_url` string, required: Deep link to this exact view in the survey viewer.
      - `coverage` union, required: Either kind of coverage, for the verdicts that accept both.
        - CompleteCoverage: Coverage with no gaps: every metre of the route was assessed against survey data good enough to decide on. **This type has no field for a gap, and that absence is the safety invariant.** [`RouteVerdictOut::Pass`] accepts nothing else, so a passing route with unsurveyed sections is not a state this crate can build, serialise or be talked into.
          - `assessed_m` number, double, required: Metres of route assessed. Equal to the route length.
          - `kind` string, required: Always `complete`.
        - PartialCoverage: Coverage with gaps, each gap named and located.
          - `assessed_m` number, double, required: Metres of route assessed against usable survey data.
          - `insufficient_data` RouteSection[], required: Runs the survey covered but not well enough to decide on.
            - `end_m` number, double, required: Distance along the route at which the run ends, metres.
            - `polyline` array[], nullable: **Deprecated: read `polyline6`.** The same run as `[lng, lat]` pairs (GeoJSON order), kept for one release so consumers written against the array (the points SDK's `reportToGeoJson`) keep drawing. By default these are exactly the Douglas-Peucker-simplified positions `polyline6` encodes, not the 0.5 m stations; with `include_station_geometry: true` on the request it is every station instead. Absent only on a section built in-process and never shaped for the wire.
              - …
            - `polyline6` string: The run's shape for display: a six-digit Google encoded polyline (latitude first, like `route.geometry_polyline6`), simplified with Douglas-Peucker to about 1 m. Always at least two positions, spanning `start_m` to `end_m`.
            - `start_m` number, double, required: Distance along the route at which the run starts, metres.
          - `kind` string, required: Always `partial`.
          - `not_surveyed` RouteSection[], required: Runs with no survey coverage at all: the absence of data.
            - `end_m` number, double, required: Distance along the route at which the run ends, metres.
            - `polyline` array[], nullable: **Deprecated: read `polyline6`.** The same run as `[lng, lat]` pairs (GeoJSON order), kept for one release so consumers written against the array (the points SDK's `reportToGeoJson`) keep drawing. By default these are exactly the Douglas-Peucker-simplified positions `polyline6` encodes, not the 0.5 m stations; with `include_station_geometry: true` on the request it is every station instead. Absent only on a section built in-process and never shaped for the wire.
              - …
            - `polyline6` string: The run's shape for display: a six-digit Google encoded polyline (latitude first, like `route.geometry_polyline6`), simplified with Douglas-Peucker to about 1 m. Always at least two positions, spanning `start_m` to `end_m`.
            - `start_m` number, double, required: Distance along the route at which the run starts, metres.
      - `limiting` LimitingPointOut, required: A point on the route with its measurement and a link to see it.
        - `clearance` MeasuredClearance, required: One measured clearance. Uncertainty is not optional, and that is the point: a headroom figure without its bound is a number somebody will treat as exact. There is no field here for a signed or legal height, by design.
          - `headroom_m` number, double, required: `overhead_z - road_z`, a within-survey difference (Rule D1), metres.
          - `overhead_class` 'structure' | 'vegetation' | 'wire' | 'unknown', required: What the lowest validated overhead surface above a cell is made of. The class is a label on a measurement, never a reason to drop one. A branch across a lane is a real obstruction, so vegetation and wire constrain the verdict exactly as a structure does; what the class changes is how the answer is caveated (a vegetation-limited reading on an old survey degrades, per the verdict arithmetic).
          - `safe_headroom_m` number, double, required: `headroom_m - k*sigma_m - sampling_gap_m`, metres. The verdict input.
          - `sampling_gap_m` number, double, required: One-sided sampling bias bound, metres: how far below the lowest sample the true low point could hang, given the sample spacing.
          - `sigma_m` number, double, required: Combined one-sigma measurement uncertainty, metres.
          - `support_m2` number, double, required: Connected-component area of the overhead cluster, square metres.
          - `surveyed_on` string, required: Last capture date of the survey behind this measurement, ISO.
        - `dataset` string, required: The dataset the measurement came from.
        - `location` LocationOut, required: A WGS84 position, in the order the wire uses.
          - `lat` number, double, required: Latitude, degrees.
          - `lng` number, double, required: Longitude, degrees.
        - `route_distance_m` number, double, required: Distance along the route, metres.
        - `view_url` string, required: Deep link to this exact view in the survey viewer.
      - `verdict` 'fail', required
    - object: The vehicle sits inside the uncertainty band, or something else prevents an answer that is not a coverage gap.
      - `contested` LimitingPointOut[], required: The points that could not be called, worst first.
        - `clearance` MeasuredClearance, required: One measured clearance. Uncertainty is not optional, and that is the point: a headroom figure without its bound is a number somebody will treat as exact. There is no field here for a signed or legal height, by design.
          - `headroom_m` number, double, required: `overhead_z - road_z`, a within-survey difference (Rule D1), metres.
          - `overhead_class` 'structure' | 'vegetation' | 'wire' | 'unknown', required: What the lowest validated overhead surface above a cell is made of. The class is a label on a measurement, never a reason to drop one. A branch across a lane is a real obstruction, so vegetation and wire constrain the verdict exactly as a structure does; what the class changes is how the answer is caveated (a vegetation-limited reading on an old survey degrades, per the verdict arithmetic).
          - `safe_headroom_m` number, double, required: `headroom_m - k*sigma_m - sampling_gap_m`, metres. The verdict input.
          - `sampling_gap_m` number, double, required: One-sided sampling bias bound, metres: how far below the lowest sample the true low point could hang, given the sample spacing.
          - `sigma_m` number, double, required: Combined one-sigma measurement uncertainty, metres.
          - `support_m2` number, double, required: Connected-component area of the overhead cluster, square metres.
          - `surveyed_on` string, required: Last capture date of the survey behind this measurement, ISO.
        - `dataset` string, required: The dataset the measurement came from.
        - `location` LocationOut, required: A WGS84 position, in the order the wire uses.
          - `lat` number, double, required: Latitude, degrees.
          - `lng` number, double, required: Longitude, degrees.
        - `route_distance_m` number, double, required: Distance along the route, metres.
        - `view_url` string, required: Deep link to this exact view in the survey viewer.
      - `coverage` union, required: Either kind of coverage, for the verdicts that accept both.
        - CompleteCoverage: Coverage with no gaps: every metre of the route was assessed against survey data good enough to decide on. **This type has no field for a gap, and that absence is the safety invariant.** [`RouteVerdictOut::Pass`] accepts nothing else, so a passing route with unsurveyed sections is not a state this crate can build, serialise or be talked into.
          - `assessed_m` number, double, required: Metres of route assessed. Equal to the route length.
          - `kind` string, required: Always `complete`.
        - PartialCoverage: Coverage with gaps, each gap named and located.
          - `assessed_m` number, double, required: Metres of route assessed against usable survey data.
          - `insufficient_data` RouteSection[], required: Runs the survey covered but not well enough to decide on.
            - `end_m` number, double, required: Distance along the route at which the run ends, metres.
            - `polyline` array[], nullable: **Deprecated: read `polyline6`.** The same run as `[lng, lat]` pairs (GeoJSON order), kept for one release so consumers written against the array (the points SDK's `reportToGeoJson`) keep drawing. By default these are exactly the Douglas-Peucker-simplified positions `polyline6` encodes, not the 0.5 m stations; with `include_station_geometry: true` on the request it is every station instead. Absent only on a section built in-process and never shaped for the wire.
              - …
            - `polyline6` string: The run's shape for display: a six-digit Google encoded polyline (latitude first, like `route.geometry_polyline6`), simplified with Douglas-Peucker to about 1 m. Always at least two positions, spanning `start_m` to `end_m`.
            - `start_m` number, double, required: Distance along the route at which the run starts, metres.
          - `kind` string, required: Always `partial`.
          - `not_surveyed` RouteSection[], required: Runs with no survey coverage at all: the absence of data.
            - `end_m` number, double, required: Distance along the route at which the run ends, metres.
            - `polyline` array[], nullable: **Deprecated: read `polyline6`.** The same run as `[lng, lat]` pairs (GeoJSON order), kept for one release so consumers written against the array (the points SDK's `reportToGeoJson`) keep drawing. By default these are exactly the Douglas-Peucker-simplified positions `polyline6` encodes, not the 0.5 m stations; with `include_station_geometry: true` on the request it is every station instead. Absent only on a section built in-process and never shaped for the wire.
              - …
            - `polyline6` string: The run's shape for display: a six-digit Google encoded polyline (latitude first, like `route.geometry_polyline6`), simplified with Douglas-Peucker to about 1 m. Always at least two positions, spanning `start_m` to `end_m`.
            - `start_m` number, double, required: Distance along the route at which the run starts, metres.
      - `reasons` IndeterminateReason[], required: Why, machine-readable, sorted and free of repeats.
      - `resolution_hint` string, required: What would resolve it, in one sentence, for a human.
      - `verdict` 'indeterminate', required
    - object: Coverage gaps prevented an answer.
      - `coverage` PartialCoverage, required: Coverage with gaps, each gap named and located.
        - `assessed_m` number, double, required: Metres of route assessed against usable survey data.
        - `insufficient_data` RouteSection[], required: Runs the survey covered but not well enough to decide on.
          - `end_m` number, double, required: Distance along the route at which the run ends, metres.
          - `polyline` array[], nullable: **Deprecated: read `polyline6`.** The same run as `[lng, lat]` pairs (GeoJSON order), kept for one release so consumers written against the array (the points SDK's `reportToGeoJson`) keep drawing. By default these are exactly the Douglas-Peucker-simplified positions `polyline6` encodes, not the 0.5 m stations; with `include_station_geometry: true` on the request it is every station instead. Absent only on a section built in-process and never shaped for the wire.
            - number[]
          - `polyline6` string: The run's shape for display: a six-digit Google encoded polyline (latitude first, like `route.geometry_polyline6`), simplified with Douglas-Peucker to about 1 m. Always at least two positions, spanning `start_m` to `end_m`.
          - `start_m` number, double, required: Distance along the route at which the run starts, metres.
        - `kind` string, required: Always `partial`.
        - `not_surveyed` RouteSection[], required: Runs with no survey coverage at all: the absence of data.
          - `end_m` number, double, required: Distance along the route at which the run ends, metres.
          - `polyline` array[], nullable: **Deprecated: read `polyline6`.** The same run as `[lng, lat]` pairs (GeoJSON order), kept for one release so consumers written against the array (the points SDK's `reportToGeoJson`) keep drawing. By default these are exactly the Douglas-Peucker-simplified positions `polyline6` encodes, not the 0.5 m stations; with `include_station_geometry: true` on the request it is every station instead. Absent only on a section built in-process and never shaped for the wire.
            - number[]
          - `polyline6` string: The run's shape for display: a six-digit Google encoded polyline (latitude first, like `route.geometry_polyline6`), simplified with Douglas-Peucker to about 1 m. Always at least two positions, spanning `start_m` to `end_m`.
          - `start_m` number, double, required: Distance along the route at which the run starts, metres.
      - `reason` 'no_survey_coverage' | 'insufficient_data', required: Why no verdict could be given.
      - `verdict` 'no_verdict', required
  - `route` RouteRef, required: The route the question was asked about.
    - `distance_m` number, double, required: Route length, metres.
    - `geometry_polyline6` string, required: The corridor as supplied, a six-digit-precision encoded polyline.
  - `vehicle` VehicleQuery, required: The vehicle the question was asked about.
    - `height_m` number, double, required: Vehicle height, metres. Required; there is no default vehicle.
    - `margin_m` number, double, required: The caller's operating margin, metres, added to the height. Defaults to zero: nobody's compliance policy is baked in here, both numbers are surfaced, and the margin is echoed back.
    - `width_m` number, double, nullable: Vehicle width, metres. The width axis is assessed only when given.
  - `width` union, required: The width axis, which can decline to answer where the height axis still can.
    - union: The verdict for the width axis. Structurally identical to [`RouteVerdictOut`] and deliberately a separate type: its points carry a [`MeasuredLateral`], so a width answer can never be read as a headroom. The same two coverage invariants hold here.
      - object: A corridor wide enough for the vehicle is clear at every assessed station, and every metre of the route was assessed.
        - `coverage` CompleteCoverage, required: Coverage with no gaps: every metre of the route was assessed against survey data good enough to decide on. **This type has no field for a gap, and that absence is the safety invariant.** [`RouteVerdictOut::Pass`] accepts nothing else, so a passing route with unsurveyed sections is not a state this crate can build, serialise or be talked into.
          - `assessed_m` number, double, required: Metres of route assessed. Equal to the route length.
          - `kind` string, required: Always `complete`.
        - `tightest` LateralPointOut: A point on the route where the corridor narrows, with its measurement.
          - `dataset` string, required: The dataset the measurement came from.
          - `lateral` MeasuredLateral, required: One measured lateral clearance: how wide the clear corridor is, not how tall. A separate type from [`MeasuredClearance`] on purpose. These are different physical quantities, and a shared type is how the reader of a width answer ends up quoting a headroom. There is no headroom field here, so there is nothing to misread. The width measured is the free width of the contiguous clear corridor that contains the route shape, out to the edge of the assessed band. It is not a statement about where in the lane a vehicle sits: the route shape is a centreline approximation and lane position is not recoverable from it, so this answers "a corridor this wide is clear here" and nothing more.
            - `clear_width_m` number, double, required: Free width of the clear corridor, metres.
            - `limited_by` 'structure' | 'vegetation' | 'wire' | 'unknown', required: What the lowest validated overhead surface above a cell is made of. The class is a label on a measurement, never a reason to drop one. A branch across a lane is a real obstruction, so vegetation and wire constrain the verdict exactly as a structure does; what the class changes is how the answer is caveated (a vegetation-limited reading on an old survey degrades, per the verdict arithmetic).
            - `safe_clear_width_m` number, double, required: `clear_width_m - k*sigma_m - sampling_gap_m`, metres. The verdict input.
            - `sampling_gap_m` number, double, required: One-sided sampling bias bound on the width, metres: one unsampled cell at each edge, since an obstruction can begin anywhere inside the cell that closed the corridor.
            - `sigma_m` number, double, required: Combined one-sigma lateral uncertainty, metres: the survey's own differential georeferencing error applied to both edges.
            - `support_m2` number, double, required: Connected-component area of the cluster that closed it, square metres.
            - `surveyed_on` string, required: Last capture date of the survey behind this measurement, ISO.
          - `location` LocationOut, required: A WGS84 position, in the order the wire uses.
            - `lat` number, double, required: Latitude, degrees.
            - `lng` number, double, required: Longitude, degrees.
          - `route_distance_m` number, double, required: Distance along the route, metres.
          - `view_url` string, required: Deep link to this exact view in the survey viewer.
        - `verdict` 'pass', required
      - object: The corridor closes below the vehicle's width somewhere.
        - `all_failures` LateralPointOut[], required: Every point that fails, worst first, including `limiting`.
          - `dataset` string, required: The dataset the measurement came from.
          - `lateral` MeasuredLateral, required: One measured lateral clearance: how wide the clear corridor is, not how tall. A separate type from [`MeasuredClearance`] on purpose. These are different physical quantities, and a shared type is how the reader of a width answer ends up quoting a headroom. There is no headroom field here, so there is nothing to misread. The width measured is the free width of the contiguous clear corridor that contains the route shape, out to the edge of the assessed band. It is not a statement about where in the lane a vehicle sits: the route shape is a centreline approximation and lane position is not recoverable from it, so this answers "a corridor this wide is clear here" and nothing more.
            - `clear_width_m` number, double, required: Free width of the clear corridor, metres.
            - `limited_by` 'structure' | 'vegetation' | 'wire' | 'unknown', required: What the lowest validated overhead surface above a cell is made of. The class is a label on a measurement, never a reason to drop one. A branch across a lane is a real obstruction, so vegetation and wire constrain the verdict exactly as a structure does; what the class changes is how the answer is caveated (a vegetation-limited reading on an old survey degrades, per the verdict arithmetic).
            - `safe_clear_width_m` number, double, required: `clear_width_m - k*sigma_m - sampling_gap_m`, metres. The verdict input.
            - `sampling_gap_m` number, double, required: One-sided sampling bias bound on the width, metres: one unsampled cell at each edge, since an obstruction can begin anywhere inside the cell that closed the corridor.
            - `sigma_m` number, double, required: Combined one-sigma lateral uncertainty, metres: the survey's own differential georeferencing error applied to both edges.
            - `support_m2` number, double, required: Connected-component area of the cluster that closed it, square metres.
            - `surveyed_on` string, required: Last capture date of the survey behind this measurement, ISO.
          - `location` LocationOut, required: A WGS84 position, in the order the wire uses.
            - `lat` number, double, required: Latitude, degrees.
            - `lng` number, double, required: Longitude, degrees.
          - `route_distance_m` number, double, required: Distance along the route, metres.
          - `view_url` string, required: Deep link to this exact view in the survey viewer.
        - `coverage` union, required: Either kind of coverage, for the verdicts that accept both.
          - CompleteCoverage: Coverage with no gaps: every metre of the route was assessed against survey data good enough to decide on. **This type has no field for a gap, and that absence is the safety invariant.** [`RouteVerdictOut::Pass`] accepts nothing else, so a passing route with unsurveyed sections is not a state this crate can build, serialise or be talked into.
            - `assessed_m` number, double, required: Metres of route assessed. Equal to the route length.
            - `kind` string, required: Always `complete`.
          - PartialCoverage: Coverage with gaps, each gap named and located.
            - `assessed_m` number, double, required: Metres of route assessed against usable survey data.
            - `insufficient_data` RouteSection[], required: Runs the survey covered but not well enough to decide on.
              - …
            - `kind` string, required: Always `partial`.
            - `not_surveyed` RouteSection[], required: Runs with no survey coverage at all: the absence of data.
              - …
        - `limiting` LateralPointOut, required: A point on the route where the corridor narrows, with its measurement.
          - `dataset` string, required: The dataset the measurement came from.
          - `lateral` MeasuredLateral, required: One measured lateral clearance: how wide the clear corridor is, not how tall. A separate type from [`MeasuredClearance`] on purpose. These are different physical quantities, and a shared type is how the reader of a width answer ends up quoting a headroom. There is no headroom field here, so there is nothing to misread. The width measured is the free width of the contiguous clear corridor that contains the route shape, out to the edge of the assessed band. It is not a statement about where in the lane a vehicle sits: the route shape is a centreline approximation and lane position is not recoverable from it, so this answers "a corridor this wide is clear here" and nothing more.
            - `clear_width_m` number, double, required: Free width of the clear corridor, metres.
            - `limited_by` 'structure' | 'vegetation' | 'wire' | 'unknown', required: What the lowest validated overhead surface above a cell is made of. The class is a label on a measurement, never a reason to drop one. A branch across a lane is a real obstruction, so vegetation and wire constrain the verdict exactly as a structure does; what the class changes is how the answer is caveated (a vegetation-limited reading on an old survey degrades, per the verdict arithmetic).
            - `safe_clear_width_m` number, double, required: `clear_width_m - k*sigma_m - sampling_gap_m`, metres. The verdict input.
            - `sampling_gap_m` number, double, required: One-sided sampling bias bound on the width, metres: one unsampled cell at each edge, since an obstruction can begin anywhere inside the cell that closed the corridor.
            - `sigma_m` number, double, required: Combined one-sigma lateral uncertainty, metres: the survey's own differential georeferencing error applied to both edges.
            - `support_m2` number, double, required: Connected-component area of the cluster that closed it, square metres.
            - `surveyed_on` string, required: Last capture date of the survey behind this measurement, ISO.
          - `location` LocationOut, required: A WGS84 position, in the order the wire uses.
            - `lat` number, double, required: Latitude, degrees.
            - `lng` number, double, required: Longitude, degrees.
          - `route_distance_m` number, double, required: Distance along the route, metres.
          - `view_url` string, required: Deep link to this exact view in the survey viewer.
        - `verdict` 'fail', required
      - object: The width sits inside the uncertainty band, or something else prevents an answer that is not a coverage gap.
        - `contested` LateralPointOut[], required: The points that could not be called, worst first.
          - `dataset` string, required: The dataset the measurement came from.
          - `lateral` MeasuredLateral, required: One measured lateral clearance: how wide the clear corridor is, not how tall. A separate type from [`MeasuredClearance`] on purpose. These are different physical quantities, and a shared type is how the reader of a width answer ends up quoting a headroom. There is no headroom field here, so there is nothing to misread. The width measured is the free width of the contiguous clear corridor that contains the route shape, out to the edge of the assessed band. It is not a statement about where in the lane a vehicle sits: the route shape is a centreline approximation and lane position is not recoverable from it, so this answers "a corridor this wide is clear here" and nothing more.
            - `clear_width_m` number, double, required: Free width of the clear corridor, metres.
            - `limited_by` 'structure' | 'vegetation' | 'wire' | 'unknown', required: What the lowest validated overhead surface above a cell is made of. The class is a label on a measurement, never a reason to drop one. A branch across a lane is a real obstruction, so vegetation and wire constrain the verdict exactly as a structure does; what the class changes is how the answer is caveated (a vegetation-limited reading on an old survey degrades, per the verdict arithmetic).
            - `safe_clear_width_m` number, double, required: `clear_width_m - k*sigma_m - sampling_gap_m`, metres. The verdict input.
            - `sampling_gap_m` number, double, required: One-sided sampling bias bound on the width, metres: one unsampled cell at each edge, since an obstruction can begin anywhere inside the cell that closed the corridor.
            - `sigma_m` number, double, required: Combined one-sigma lateral uncertainty, metres: the survey's own differential georeferencing error applied to both edges.
            - `support_m2` number, double, required: Connected-component area of the cluster that closed it, square metres.
            - `surveyed_on` string, required: Last capture date of the survey behind this measurement, ISO.
          - `location` LocationOut, required: A WGS84 position, in the order the wire uses.
            - `lat` number, double, required: Latitude, degrees.
            - `lng` number, double, required: Longitude, degrees.
          - `route_distance_m` number, double, required: Distance along the route, metres.
          - `view_url` string, required: Deep link to this exact view in the survey viewer.
        - `coverage` union, required: Either kind of coverage, for the verdicts that accept both.
          - CompleteCoverage: Coverage with no gaps: every metre of the route was assessed against survey data good enough to decide on. **This type has no field for a gap, and that absence is the safety invariant.** [`RouteVerdictOut::Pass`] accepts nothing else, so a passing route with unsurveyed sections is not a state this crate can build, serialise or be talked into.
            - `assessed_m` number, double, required: Metres of route assessed. Equal to the route length.
            - `kind` string, required: Always `complete`.
          - PartialCoverage: Coverage with gaps, each gap named and located.
            - `assessed_m` number, double, required: Metres of route assessed against usable survey data.
            - `insufficient_data` RouteSection[], required: Runs the survey covered but not well enough to decide on.
              - …
            - `kind` string, required: Always `partial`.
            - `not_surveyed` RouteSection[], required: Runs with no survey coverage at all: the absence of data.
              - …
        - `reasons` IndeterminateReason[], required: Why, machine-readable, sorted and free of repeats.
        - `resolution_hint` string, required: What would resolve it, in one sentence, for a human.
        - `verdict` 'indeterminate', required
      - object: Coverage gaps prevented an answer.
        - `coverage` PartialCoverage, required: Coverage with gaps, each gap named and located.
          - `assessed_m` number, double, required: Metres of route assessed against usable survey data.
          - `insufficient_data` RouteSection[], required: Runs the survey covered but not well enough to decide on.
            - `end_m` number, double, required: Distance along the route at which the run ends, metres.
            - `polyline` array[], nullable: **Deprecated: read `polyline6`.** The same run as `[lng, lat]` pairs (GeoJSON order), kept for one release so consumers written against the array (the points SDK's `reportToGeoJson`) keep drawing. By default these are exactly the Douglas-Peucker-simplified positions `polyline6` encodes, not the 0.5 m stations; with `include_station_geometry: true` on the request it is every station instead. Absent only on a section built in-process and never shaped for the wire.
              - …
            - `polyline6` string: The run's shape for display: a six-digit Google encoded polyline (latitude first, like `route.geometry_polyline6`), simplified with Douglas-Peucker to about 1 m. Always at least two positions, spanning `start_m` to `end_m`.
            - `start_m` number, double, required: Distance along the route at which the run starts, metres.
          - `kind` string, required: Always `partial`.
          - `not_surveyed` RouteSection[], required: Runs with no survey coverage at all: the absence of data.
            - `end_m` number, double, required: Distance along the route at which the run ends, metres.
            - `polyline` array[], nullable: **Deprecated: read `polyline6`.** The same run as `[lng, lat]` pairs (GeoJSON order), kept for one release so consumers written against the array (the points SDK's `reportToGeoJson`) keep drawing. By default these are exactly the Douglas-Peucker-simplified positions `polyline6` encodes, not the 0.5 m stations; with `include_station_geometry: true` on the request it is every station instead. Absent only on a section built in-process and never shaped for the wire.
              - …
            - `polyline6` string: The run's shape for display: a six-digit Google encoded polyline (latitude first, like `route.geometry_polyline6`), simplified with Douglas-Peucker to about 1 m. Always at least two positions, spanning `start_m` to `end_m`.
            - `start_m` number, double, required: Distance along the route at which the run starts, metres.
        - `reason` 'no_survey_coverage' | 'insufficient_data', required: Why no verdict could be given.
        - `verdict` 'no_verdict', required
    - NotAssessed: The width axis declining to answer.
      - `reason` string, required: Why, in one sentence a caller can act on.
      - `verdict` string, required: Always `not_assessed`.

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid API key
- `429`: Quota or rate limit exceeded
- `501`: No clearance artefacts are configured on this deployment

---

[API](https://skmtc.dev/mapmap/apis/sn-gateway.md) · [All operations](https://skmtc.dev/mapmap/apis/sn-gateway/llms.txt) · [OpenAPI document](https://skmtc.dev/mapmap/apis/sn-gateway/revisions/2293be8b4c38?raw)
