EZToTrack Developers

Legacy Data API (v1 / v2)

The data endpoints partners call with a ClientKey issued from Legacy Integration (v1). Hosted by the Integration API (e.g. https://integration.test.eztotrack.com).

Prefer the modern API for new work
New integrations should use the Public API (ezt_live_… keys, granular scopes). This page documents the existing legacy endpoints for partners already on the ClientKey model.

Authentication

The legacy API uses a two-step flow: exchange your ClientKey for a short-lived JWT, then call the data endpoints with that JWT.

1. Exchange the ClientKey for a token

GET /api/v1/auth
X-Client-Key: b1946ac92492d2347c6235b4d2611184

Response:

{
  "userId": null,
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Header
The ClientKey is sent in the X-Client-Key header (legacy fallback: client_key). Health probe: GET /api/v1/auth/healthCheck"ok".

2. Call data endpoints with the token

GET /api/v1/assets?additionalInfo=true
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Scope = your data modules
Endpoints are gated by the modules granted to your key: Location and cargo → asset/location/GPS, Waste Management → waste jobs, HOS (ELD) → driver timers. All responses are scoped to your company.

Assets (v1)

GET /api/v1/assets  ·  POST /api/v1/assets

List current asset positions. GET returns all company assets; POST takes a JSON array of VINs. Query additionalInfo=true adds name/plate/trailers/odometer.

[
  {
    "vin": "1FUJGLDR5CLBP8834",
    "utcTimestamp": "2026-06-20T14:03:11Z",
    "latitude": 41.8781,
    "longitude": -87.6298,
    "name": "Truck 102",
    "plateNumber": "IL-1234AB",
    "trailers": "TR-55",
    "odometer": 481233.0
  }
]

GET /api/v1/assets/driversTimers  ·  GET /api/v1/assets/currentWithTimers

Current asset state enriched with driver and HOS clocks.

[
  {
    "vin": "1FUJGLDR5CLBP8834",
    "utcTimestamp": "2026-06-20T14:03:11Z",
    "latitude": 41.8781, "longitude": -87.6298,
    "odometer": 481233.0, "ignition": true,
    "engineHH": 5123.4, "fuel": 68.0,
    "name": "Truck 102", "plateNumber": "IL-1234AB", "trailers": "TR-55",
    "driverName": "John", "driverSurname": "Doe", "rpm": 1450,
    "statusAbbreviation": "ON", "statusDesctiption": "On Duty",
    "minsTillBreak": 45, "minsTillDriving": 210,
    "minsTillShift": 330, "minsTillCycle": 1880,
    "hosUtcTimestamp": "2026-06-20T14:02:55Z"
  }
]

GET /api/v1/assets/location

Location breadcrumb for one asset. Params: vin, from, to (ISO 8601 UTC).

[
  { "utcTimestamp": "2026-06-20T13:30:00Z", "latitude": 41.8781, "longitude": -87.6298 },
  { "utcTimestamp": "2026-06-20T13:31:00Z", "latitude": 41.8795, "longitude": -87.6321 }
]

GET /api/v1/assets/gps

Detailed GPS telemetry (speed, heading, signal). Params: vin, from, to.

[
  {
    "latitude": 41.8781, "longitude": -87.6298,
    "distance": 0.42, "speed": 96.5, "direction": 270,
    "hdop": 0.9, "satellites": 11,
    "utcTimestamp": "2026-06-20T13:30:00Z"
  }
]
Limits on location / gps
The fromto range is capped at 35 days, and these endpoints are rate-limited to roughly 1 request per minute per asset (HTTP 429 if exceeded).

Asset state (v2)

GET /api/v2/assets  ·  GET /api/v2/assets/vin/{vin}  ·  GET /api/v2/assets/getByAssetId/{assetId}

Richer current state including CAN telemetry. GET /api/v2/assets accepts repeated vin query params (omit for the whole fleet); the by-VIN / by-id variants return a single object (404 if not found).

[
  {
    "assetId": 10231,
    "name": "Truck 102",
    "plateNumber": "IL-1234AB",
    "vin": "1FUJGLDR5CLBP8834",
    "driverId": "a1b2c3d4-...",
    "currentLocation": { "latitude": 41.8781, "longitude": -87.6298 },
    "type": { "id": 1, "name": "Truck" },
    "subType": null,
    "gps": {
      "latitude": 41.8781, "longitude": -87.6298,
      "newDistance": 0.42, "speed": 96.5, "direction": 270,
      "hdop": 0.9, "satellites": 11
    },
    "can": {
      "totalDistance": 481233000, "rpm": 1450,
      "fuelTank1": 68, "engineHours": 5123.4, "vehicleSpeed": 96
    },
    "address": "I-90 W, Chicago, IL"
  }
]

can and gps may be null when telemetry is unavailable.

POST /api/v2/assets/fuelStopProposal  ·  POST /api/v2/assets/driverProposedFuelStop

Submit proposed fuel stops / a driver-proposed destination. Both return 200 OK.

// POST /api/v2/assets/fuelStopProposal
{
  "fuelStopsProposalsPerAsset": [
    {
      "assetId": 10231,
      "proposedFuelStops": [
        {
          "name": "Pilot #420",
          "address": "1500 W Lake St, Chicago, IL",
          "fuelPrices": [ { "diesel": 3.79, "discount": 0.12 } ]
        }
      ]
    }
  ]
}

Waste jobs (v1)

GET /api/v1/wastejob

Paged waste-management jobs (requires the Waste module). Filter via query params — e.g. status, serviceType, scheduledFrom/scheduledTo, assignedToAssetId, short=true for a lighter payload — with offset / limit for paging.

{
  "jobs": [
    {
      "jobId": 88213,
      "companyId": 7,
      "scheduledDate": "2026-06-20T00:00:00Z",
      "serviceType": "Pickup",
      "status": "InProgress",
      "pickUpClientName": "Acme Mfg",
      "pickUpAddress": "210 Industrial Pkwy",
      "assignedToAssetId": 10231,
      "assignedToAssetName": "Truck 102",
      "assignedToDriverName": "John Doe",
      "tonnage": 4.2,
      "utcCreated": "2026-06-19T18:02:00Z"
    }
  ],
  "count": 137
}

SurfSight webhook (inbound)

POST /api/v1/surfsight/snapshot is an inbound webhook the SurfSight camera platform calls to deliver snapshot/video events — not a partner-facing data endpoint. It ingests the media reference and stores it. No ClientKey is used.

Notes