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"
  }
]

GET /api/v1/assets/gpsCan

The same GPS samples as /gps, unioned with the CAN samples for the same asset and window, in a single list ordered by utcTimestamp. Each row carries a source of Gps or Can; the other sensor's fields are null. Params: vin, from, to.

[
  { "utcTimestamp": "2026-06-20T13:30:00Z", "source": "Gps", "latitude": 41.8781, "longitude": -87.6298, "distance": 0.42, "speed": 96.5, "direction": 270, "hdop": 0.9, "satellites": 11 },
  { "utcTimestamp": "2026-06-20T13:30:01Z", "source": "Can", "odometer": 481233000, "rpm": 1450, "fuelTank1": 68, "engineHours": 5123.4, "vehicleSpeed": 96 }
]
Limits on location / gps / gpsCan
The from–to range is capped at 35 days, and the location, gps and gpsCan endpoints share a single budget of 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
}

Company (v1)

GET /api/v1/company/info

The company the caller's token belongs to. The company is taken from the token, never from the request. Country, state (abbreviation) and time zone (IANA name) are resolved to display values.

{
  "id": 7,
  "name": "Acme Logistics",
  "usDotNumber": "1523477",
  "address": "233 S Wacker Dr",
  "address2": "Suite 4400",
  "country": "United States",
  "state": "IL",
  "city": "Chicago",
  "zipCode": "60606",
  "phone": "+1-312-555-0100",
  "email": "dispatch@acme.example.com",
  "contact": "Dana Whitfield",
  "timeZone": "America/Chicago"
}

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