- Document ID
freight-data-watch- Version
- 1.0.0 · Revision: 1
- Provider
- Freight Data Watch (
freightdatawatch.com) - Service
- REST API v1 —
app.freightdatawatch.com/api/v1, bearer-token authenticated - LastWagon component
- the freight-market rate-per-mile benchmark in the Driver Ledger — National Averages, the weekly review's rate comparison, and the Smart Insights payload
- Status
- Record complete — technical integration and provider-terms review both dated 2026-09-16; cleared for release on the review recorded in § Terms review. Re-review of the provider's public terms is routine maintenance (see § Maintenance), not a release gate.
Terms review
Terms review: No separate API terms, redistribution restrictions, or mandatory attribution requirements were located on the provider's public site as of September 16, 2026. The provider publicly describes its API as free to use for integrating freight intelligence into applications. LastWagon nevertheless provides voluntary source attribution. Re-review if the provider publishes or changes API terms.
What that review does and does not establish, so nobody over-reads it later:
- It is a review of the provider's public material — the marketing site and the developer portal — on one date. It is not a signed licence, and none was offered. If the provider later publishes API terms, those terms govern from their effective date and this docket is re-opened (§ Maintenance).
- Nothing found prescribes an attribution form, so LastWagon chose a conservative one of its own (§ Attribution) and links the provider's name to its public site as a courtesy.
- The guardrails below are LastWagon's own standing rules and do not depend on the provider's terms: they hold whatever the provider later publishes.
Guardrails (unchanged by the review).
- The API key never leaves the proxy — not in an APK, a response, a log or a test fixture.
- The raw feed is not resold, re-served or exposed: a device receives the proxy's normalised snapshot (a handful of figures and lanes), never the provider's response, and no LastWagon endpoint relays the API to anyone.
- Freight Data Watch's figures are never presented as LastWagon's own proprietary market data: every figure carries the provider's name, the credit and the disclaimer.
- Source and date provenance is preserved: provider, rate type, the provider's own as-of date where it gives one and the fetch day marked as such where it does not — never conflated, never re-dated.
- No meaning is manufactured for an undocumented field: what the provider does not define (
…Changeunits, whether a specialized average is spot or contract, a timestamp it omits) is not inferred, and the figure is shown with exactly the label the evidence supports.
What LastWagon uses
Three endpoints, once each per refresh, all authenticated with Authorization: Bearer <FREIGHT_DATA_WATCH_API_KEY>. From GET /api/v1/market's market.rates block LastWagon reads exactly six figures and one date:
| Field | Becomes | Rate type |
|---|---|---|
current.spotDryVan | DRY_VAN benchmark | SPOT |
current.spotReefer | REEFER benchmark | SPOT |
current.spotFlatbed | FLATBED benchmark | SPOT |
current.contractDryVan | DRY_VAN, carried beside the spot row | CONTRACT |
current.contractReefer | REEFER, carried beside the spot row | CONTRACT |
current.contractFlatbed | FLATBED, carried beside the spot row | CONTRACT |
lastUpdated | the as-of date of every row above (the provider's stamp, kept verbatim too) | — |
From GET /api/v1/market/specialized, one figure per specialized class, under the rate type AVERAGE because the provider does not say whether it is spot or contract:
| Field | Becomes | Also carried |
|---|---|---|
equipment.boxTruck.avgRate | BOX_TRUCK benchmark | availability, demandTrend labels |
equipment.hotShot.avgRate | HOT_SHOT benchmark | availability, demandTrend labels |
equipment.sprinterVan.avgRate | SPRINTER_VAN benchmark | availability, demandTrend labels |
This endpoint carries no timestamp, so these rows are dated by the day the LastWagon proxy fetched them and the app says so ("Retrieved", never "As of"). Its historicalMonthly series is not read: its latest month disagrees with avgRate (1.89 against 2.54 for box truck on 2026-09-16), which is a question for the provider rather than a number to reconcile. rateChange, avgLoadWeight and topLanes are not read.
From GET /api/v1/lanes, per lane: origin, destination, spotRate, contractRate and volume — shown as context under the boards, never as a national average and never as a benchmark a driver is compared against. signal ("BOOK"/"WATCH"), marginPerMile, demandIndex, avgTransitDays and milesApprox are booking advice and analytics and are not read. No timestamp here either: dated by the fetch day, shown as "Retrieved".
Not read, deliberately: the …Change fields (no stated unit), regional, and the fuel, capacity and economic blocks. Diesel remains EIA's ([eia.md](eia.md)) and nothing from this provider is ever shown as a fuel price. /market/summary is generated prose and is never called.
The request is made by the LastWagon proxy, never by a driver's device. The proxy fetches the block, converts dollars per mile to integer cents, caches the normalised result (memory + KV, shared by every install), and serves the same snapshot to every device. Nothing about a driver — no identifier, no location, no ledger figure — reaches the provider. See proxy/lib/market-fdw.js and proxy/README.md.
Refresh cadence and allowance. Each of the three sources refreshes at most once per six hours per deployment (four a day by default; configurable no lower than hourly): twelve requests a day against a plan allowance of 50. A failed refresh of a source is not retried for 30 minutes, an exhausted allowance not for an hour, each source on its own, and last-good is served throughout — so a thousand installs and a broken upstream cost the same handful of requests. The provider's own dashboard states its data refreshes daily.
What is stored. Per benchmark: provider name, equipment type, rate type (spot / contract / average), rate in cents per mile, the provider's as-of date or — where the provider gives none — the fetch day marked as such, and the moment LastWagon fetched it; the provider's date and the fetch time are kept separate and never conflated. Per lane: the two place names, the two rates, the volume label, provider and fetch day. On the device, the same fields in the market cache, plus the previous distinct observation per series for the movement indicator. Freight Data Watch's figures are never merged with FreightPulse's: a review or cache row from before 2026-09-16 keeps FreightPulse as its source and its own August 2026 date, and the movement history restarts at the new provider's first observation.
The API key is a credential. It lives in the proxy's environment (FREIGHT_DATA_WATCH_API_KEY), never in an APK, never in a response, never in a log; a test walks the Android tree for the variable name, the API host and a bearer header and fails on any of them.
Attribution
A single constant (BenchmarkAttribution.FREIGHT_DATA_WATCH in core/model/Benchmarks.kt), chosen by the benchmark's own source field through the one dispatch BenchmarkAttribution.forSource, shown beside any freight figure the driver sees:
Freight market data provided by Freight Data Watch. Rates are market estimates and may vary by
lane, equipment, timing, and market conditions. For informational purposes only.
The wording is LastWagon's — voluntary, since the provider prescribes none (§ Terms review) — and deliberately conservative: it names the source, says the figures are estimates, and says what they are for. The provider's name in the line is a link to its public site (BenchmarkAttribution.FREIGHT_DATA_WATCH_SITE, https://freightdatawatch.com/) wherever a screen can offer a tap — National Averages and the weekly review today — in the same way the radar credit links to Rainbow.ai. The link is to the marketing site, never the API host. The retired provider's line (Freight data provided by FreightPulse) is kept for the historical rows that still name it, and is not a link.
No implied endorsement. LastWagon does not use the provider's name or mark as its own, does not describe itself as affiliated with or endorsed by Freight Data Watch, and does not present its own figures as the provider's.
Not misrepresented. The number shown is the published value converted to cents and carried with the date the provider stamped it. LastWagon never interpolates, re-dates or estimates one; a refresh that fails or answers in a shape the proxy cannot read leaves the last real answer in place, and a benchmark more than 14 days old is presented as stale, in writing, beside the figure. A contract rate is never shown or compared as a spot rate.
Sources
- Developer portal:
https://app.freightdatawatch.com/developers— endpoint list read 2026-09-16 (15 endpoints;/market,/lanes,/market/summary,/market/specialized,/market/cross-borderon the free tier). - Authenticated responses recorded 2026-09-16 by
.github/workflows/fdw-api-probe.yml(GitHub Actions runs 35141776552 and 35143710452):/market,/market/summary,/market/specialized,/lanes, with anx-ratelimit-remainingheader counting down from 99. - Public site
https://freightdatawatch.com/and developer portal, reviewed 2026-09-16 for API terms, a data licence, redistribution restrictions and attribution requirements: none located (§ Terms review). The provider describes the API as free to use for integrating freight intelligence into applications.
Maintenance
Provider-terms review is routine, not a gate. Re-read the public site and the developer portal when the provider announces terms, changes its plans or pricing, or the API key is rotated — and in any case at each release that touches the ledger's market data. Record the date and the finding here; if terms appear, read them against the guardrails above and the attribution, and change the one constant if a wording is prescribed. A review that finds nothing new is still recorded, by date, so the next reader knows how fresh this record is.