The brief

Fleet operators running mixed heavy equipment pull telematics from vendors like Omnicomm, but that data sits behind a proprietary, JSON-only API. Software vendors, fleet managers, and any system expecting ISO 15143-3 (the agricultural and construction-machinery data standard) can't read it directly, so every integration becomes a one-off adapter, brittle and off-standard. The brief was a data bridge: connect to the Omnicomm API, pull vehicle telematics, and re-expose it as standardized ISO 15143-3 XML. It had to handle auth, data transformation, errors, and caching itself, so downstream consumers never deal with Omnicomm's quirks.

The approach

I built a Node.js service on Express that sits between the Omnicomm API and any ISO 15143-3 client. Three layers, each doing one job.

Authentication and transport. An Axios client centralizes every outbound call and handles JWT acquisition plus transparent refresh-token logic behind middleware, so routes never touch raw credentials.

Transformation. Domain routes for geolocation, idle hours, and fuel remaining translate Omnicomm's JSON into ISO 15143-3 XML via js2xmlparser, mapping the relevant standard sections (11.3 Last Known Location, 11.9 Cumulative Idle Hours, fuel level). Fuel is the awkward one. Omnicomm reports in deciliters but ISO wants a percentage, so the service reconciles them through a layered strategy: configured tank capacities first, vehicle-profile calibration tables next, and a historical-statistics fallback when neither applies.

Reliability and security. Response caching with apicache on 5 to 10 minute windows, express-rate-limit throttling, joi input validation, helmet security headers, and Winston logging. On failure it returns a standardized XML error, not a stack trace, so any ISO client can parse it deterministically. The whole service is containerized with Docker.

The result

One self-contained service turns a proprietary telematics feed into a standards-compliant API. Downstream systems integrate once against the ISO 15143-3 XML contract instead of writing a new adapter per vendor. Caching and rate-limiting keep load off the upstream Omnicomm API, and JWT refresh plus XML error envelopes mean the bridge runs without much babysitting. It ships with a Bruno API collection for endpoint testing and runs anywhere via docker-compose up.