/ Changelog / v2.0.0

v2.0.0

March 2026
v1.5.0 → v2.0.0

Summary

This major release introduces a new zone-based path plan architecture. Path plans now organize data hierarchically - each field part becomes a zone with its own guidance settings, geometry, and routes. New endpoints support bulk operations, equipment scenario analysis, slope generation, and shared plan access. Several legacy wheel traffic endpoints have been removed.

Breaking Changes

Path Plan List Response Type Changed

GET /api/fields/{fieldId}/path-plans/list Response model changed from PathPlanListItemViewModel to PathPlanNormalizedModel with zone-based structure

Direct API Request: Options String Removed

POST /api/path-plans/direct The comma-separated `options` string parameter has been removed and replaced by individual boolean fields: `includeSlopes`, `extendTracks`, `useCrossHatches`, `usePassable`. Note: `usePassable` defaults to `true`, which is the inverse of the old `excludePassable` option.

Before

{
  "options": "dem,erosion,extendTracks,useCrossHatches,excludePassable"
}

After

{
  "includeSlopes": true,
  "extendTracks": true,
  "useCrossHatches": true,
  "usePassable": false
}

Direct API Request: New Track Type Support

POST /api/path-plans/direct New optional `trackType` field (Straight, Curved, Spiral) defaults to Straight. When using Curved, an optional `curvedOptions` object is available with `levelOfSmoothing`, `smoothingIterations`, and `minAngleToSmooth`.

Direct API Response: Flat to Hierarchical Structure

POST /api/path-plans/direct The entire response structure has changed from a flat model to a hierarchical zone-based model. All top-level geometry fields (Boundary, Tracks, ExteriorHeadlandPasses, InnerBoundary, APoints, BPoints) and flat statistics (TrackDistance, HeadlandDistance, MissedArea, OverlapArea, etc.) have been removed. Data is now nested under Zones -> GeometryGroups -> GeometryParts. Routes are embedded as typed geometry parts (RouteTrack, Turn, HeadlandTurn, HeadlandConnector). Slope data is per-geometry-part instead of a single DemResult. Crosshatches are geometry parts instead of a separate array.

Before

PathPlanApiResponse
  Boundary, Tracks, ExteriorHeadlandPasses
  APoints, BPoints (2D arrays)
  TrackDistance, HeadlandDistance, NumberOfTracks
  Routes[] (separate route model)
  SlopesResult (single DemResult)
  Crosshatches[]

After

PathPlanApiResponse
  PathPlanId, PathPlanName, Boundary, Area
  Equipment, Stats (aggregated)
  Zones[]
    ZoneBoundary, InnerBoundaries, Stats
    GeometryGroups[]
      TrackType, TrackBearing, ABLine, Stats
      GeometryParts[] (typed: GuidanceTrack,
        RouteTrack, Turn, HeadlandTurn, etc.)

Direct GeoJSON API: Feature Types Restructured

POST /api/path-plans/direct/geojson GeoJSON features are now organized by zone instead of boundary part index. Feature type values changed: `boundary` to `zoneBoundary`, `tracks`/`exteriorHeadlandPasses` to `geometryPart` with a `geometryPartType` property, `aPoint`/`bPoint` replaced by `abLine` (LineString) and `routeStartPoint`/`routeEndPoint`. The `partIndex` property is replaced by `zoneId` and `zoneIndex`. The `demResult` feature is removed (slope data is now per-geometry-part). New feature types added: `zoneStatistics`, `zonesBoundary`.

Before

Feature types:
  boundary, tracks,
  exteriorHeadlandPasses,
  interiorHeadlandPasses,
  aPoint, bPoint,
  routePart, demResult,
  crosshatch, refillPoint
Key: partIndex

After

Feature types:
  zoneBoundary, geometryPart
    (geometryPartType: GuidanceTrack,
    RouteTrack, Turn, HeadlandTurn,
    HeadlandConnector, etc.),
  abLine, routeStartPoint,
  routeEndPoint, zoneStatistics,
  refillPoint
Key: zoneId, zoneIndex

Share Path Plans Response Type Changed

POST /api/shares/{code}/plans Return type changed from `TableSharePathPlanResponseModel` to `TableSharePathPlanNormalizedResponseModel`

Share Equipment Scenario Response Type Changed

GET /api/shares/{code}/equipment-scenario Return type changed from `ShareEquipmentScenarioResponseModel` to `ShareNormalizedEquipmentScenarioResponseModel`

Wheel Traffic Summary Endpoints Removed

POST /api/wheel-traffic-summary The `POST /api/wheel-traffic-summary`, `POST /api/wheel-traffic-route-summary`, and `POST /api/wheel-traffic-summary/{pathPlanId}` endpoints have been removed. Wheel traffic analysis is now handled through the normalized path plan zone architecture.

New Endpoints

Path Plans (Normalized)

Method Endpoint Description
GET /api/path-plans-normalized/{pathPlanId} Get normalized path plan with full zone hierarchy
GET /api/path-plans-normalized/{pathPlanId}/preview Get lightweight preview with simplified geometry
POST /api/path-plan-zones/{pathPlanZoneId}/geometry-groups/{geometryGroupId}/set-active Set a geometry group as active within its zone

Guidance

Method Endpoint Description
POST /api/pathplan/{pathPlanId}/slopes Generate DEM-based slope analysis for a path plan

Bulk Guidance (Normalized)

Method Endpoint Description
POST /api/bulk-guidance/normalized Bulk guidance generation with normalized output
GET /api/bulk-guidance/normalized/jobs/{jobId} Get normalized bulk guidance job status

Equipment Scenarios (Normalized)

Method Endpoint Description
POST /api/equipment-scenarios/normalized Generate normalized equipment explorer scenario
GET /api/equipment-scenarios/normalized/jobs/{jobId} Get normalized equipment scenario job status

Routing (Normalized)

Method Endpoint Description
POST /api/routes/normalized Generate routes for normalized path plans

Sharing (Normalized)

Method Endpoint Description
GET /api/shares/{code}/path-plans-normalized/{pathPlanId} Get shared normalized path plan (anonymous access)

New Features

1. Hierarchical Zone-Based Architecture

New data model with hierarchical structure: **PathPlan -> Zones -> GeometryGroups -> GeometryParts**. Each field part becomes a separate zone with its own guidance settings, geometry, and statistics.

Properties

Property Type Description
PathPlanNormalizedModel model Top-level container with zones, statistics, and metadata
PathPlanZoneModel model Represents a single zone (typically one part-field)
GeometryGroupModel model Contains a complete guidance result (tracks + headlands + route)
GeometryPartModel model Individual geometry element (track, headland, turn, route segment)

2. Geometry Group Activation

Support for multiple guidance variants per zone. Use `POST /api/path-plan-zones/{pathPlanZoneId}/geometry-groups/{geometryGroupId}/set-active` to switch between different guidance configurations within a zone.

3. Lightweight Preview Endpoint

New `GET /api/path-plans-normalized/{pathPlanId}/preview` endpoint returns simplified geometries for fast map rendering and reduced bandwidth.

4. Slope Analysis

New `POST /api/pathplan/{pathPlanId}/slopes` endpoint generates DEM-based slope data for a path plan, enriching zones with terrain information.

New Schemas

Schema Description
PathPlanNormalizedModel Top-level path plan container with zones and aggregate statistics
PathPlanZoneModel Zone model representing a part-field with geometry groups
GeometryGroupModel Guidance variant containing tracks, headlands, and route
GeometryPartModel Individual geometry element with type-specific details
GeometryPartTrackDetail Track-specific metadata (bearing, width, etc.)
GeometryPartHeadlandDetail Headland-specific metadata (pass number, direction)
GeometryPartSlopeDetail DEM slope analysis data
RouteZoneRequest Request model for normalized routing
RouteJobResultViewModel Job result for normalized routing

Migration Guide

For clients using path plan list endpoints

  • 1 Update response type from `PathPlanListItemViewModel[]` to `PathPlanNormalizedModel[]`
  • 2 Map `area` to `totalArea`
  • 3 Map `trackCount` to `numberOfTracks`
  • 4 Other properties (`pathPlanId`, `name`, `createdAt`) remain the same

For Direct API consumers (POST /api/path-plans/direct)

  • 1 Replace the `options` string with individual booleans: `includeSlopes`, `extendTracks`, `useCrossHatches`, `usePassable` (note: `usePassable` is inverted from `excludePassable`)
  • 2 Response is now hierarchical: iterate `zones[]` -> `geometryGroups[]` -> `geometryParts[]` to access geometry
  • 3 Each geometry part has a `geometryPartType` indicating its role (GuidanceTrack, ExteriorHeadlandPass, RouteTrack, Turn, HeadlandTurn, etc.)
  • 4 AB line data moved from `aPoints`/`bPoints` arrays to `zones[].geometryGroups[].abLine` (LineString)
  • 5 Statistics moved from flat top-level fields to `stats` objects at plan, zone, and geometry group levels
  • 6 Route data is embedded as geometry parts (no separate `routes` array)
  • 7 Slope data is per-geometry-part via `slopeDetails` (no separate `slopesResult`)

For Direct GeoJSON API consumers (POST /api/path-plans/direct/geojson)

  • 1 Update feature type matching: `boundary` is now `zoneBoundary`, `tracks` and `headlandPasses` are now `geometryPart`
  • 2 Use `geometryPartType` property to distinguish geometry parts (replaces old feature type names)
  • 3 Replace `partIndex` lookups with `zoneId` and `zoneIndex`
  • 4 AB lines are now `abLine` features (LineString) instead of separate `aPoint`/`bPoint` features
  • 5 Read `pathPlanStatistics` for aggregated stats (new fields: GHG emissions, coverage metrics)
  • 6 Read `zoneStatistics` features for per-zone stats (new feature type)

For clients generating routes

  • 1 Use `POST /api/routes/normalized` with `RouteZoneRequest[]`
  • 2 Results contain updated `GeometryGroupModel` with route geometry parts

Deprecations

The following endpoints are deprecated and will be removed in a future release. Please migrate to the replacement endpoints.

Deprecated Endpoint Replacement
POST /api/routes POST /api/routes/normalized

Questions?

For questions about these API changes, please contact [email protected] or refer to the API documentation.