Logistics teams rely on truck telematics for GPS pings, engine hours, and duty-cycle data, yet a surprising amount of ETA risk still hides outside the cab: fuel price swings that force routing changes, upstream port slowdowns that starve DCs, and severe weather that shuts interstates. Without a way to fuse telematics with real-time market and disruption intelligence, planners end up firefighting with stale spreadsheets, while dispatchers chase exceptions shipment by shipment. The result: ETAs slip, detention compounds, and utilization inches down instead of up.
This post walks through how to integrate your truck telematics stack with FreightPulse, a single REST API that consolidates live US FTL quotes, EIA fuel prices, port congestion signals, FMCSA/FMC carrier lookups, and natural-disruption alerts. You will learn how to use these signals to make your ETA models more robust and to surface actionable utilization insights—in near real time—without wiring up five different data providers. We will cover the endpoints you need, show complete JSON responses, and detail how to stitch results with telematics data to drive better dispatch, routing, and procurement decisions.
We will treat this as a developer tutorial: start with the logistics problems, implement the data plumbing with practical code, and finish with production-minded patterns for monitoring, validation, and exception handling that your operations team will appreciate on Day 1.
Why FreightPulse
Developers and operators often assemble a patchwork of feeds: one for fuel, one for freight quotes, another for carrier compliance, an AIS-driven port dataset, and a handful of weather or hazard sources. The stitching alone—normalizing schemas, dealing with stale endpoints, and aligning timestamps—can eat sprints. FreightPulse compresses that problem to one REST surface with a consistent response shape and practical coverage across transportation realities that affect truck ETAs and fleet productivity.
Here are the core differentiators that matter when you are building ETA and utilization features:
- Consolidated logistics intelligence in one JSON schema. You get EIA weekly fuel prices, live US FTL quotes, IMF PortWatch-based congestion metrics, carrier lookups via FMCSA/FMC directories, and natural-hazard disruptions from GDACS/USGS/NOAA—all with the same success/data envelope. That uniformity shrinks parsing and error-handling code.
- Actionable coupling with telematics. Pair truck GPS + duty status with FreightPulse’s disruption and congestion signals to dynamically adjust ETAs and routing. For example, when a cyclone alert posts near a destination port or severe weather crosses a highway corridor, you can trigger re-sequencing of stops and recalculate arrival windows with confidence.
- Realistic, standardized metrics. Port congestion isn’t presented as vague sentiment—it is a 7-day average of port calls benchmarked against a 90-day baseline, with a clear as_of date and a congestion label you can map directly into your exception dashboards. Likewise, freight rates and fuel series are ready for cost models without additional munging.
- Low-friction exploration. Because the API shares a uniform shape and sensible defaults, you can prototype a fuel-surcharge calculator, a port congestion watchlist, or a carrier vetting widget in one afternoon, then expand into production-grade routing decisions as your telematics data matures.
In short, FreightPulse collapses multi-provider complexity into one developer-friendly interface so you can focus on logic: ETA recalculation, dispatch heuristics, and utilization uplift—not on plumbing.
Quick Start
Base URL:
https://freightpulsehq.com/api/v1
All responses share this structure:
{
"success": true,
"data": {
"...": "endpoint-specific payload"
}
}
Let’s make a first request for national fuel prices. This gives you diesel and gasoline averages you can immediately wire into linehaul cost models or fuel-surcharge logic attached to your dispatch system.
curl "https://freightpulsehq.com/api/v1/fuel-prices"
Sample JSON response:
{
"success": true,
"data": {
"timestamp": "2026-07-30T12:00:00Z",
"source": "EIA (U.S. Energy Information Administration)",
"currency": "USD",
"unit": "gallon",
"data": {
"diesel": {
"national_average": 3.847,
"change_week": -0.023,
"change_percent": -0.6,
"regions": {
"east_coast": 3.912,
"midwest": 3.756,
"gulf_coast": 3.623,
"rocky_mountain": 3.891,
"west_coast": 4.456,
"california": 4.892
},
"historical": {
"30d_avg": 3.82,
"90d_avg": 3.75,
"yoy_change_percent": -8.2
}
},
"gasoline": {
"national_average": 3.156,
"historical": {
"30d_avg": 3.1,
"90d_avg": 3.05,
"yoy_change_percent": 1.1
}
}
}
}
}
Key fields and how to use them:
- data.diesel.national_average: The current diesel benchmark for pricing FTL trips in your TMS. Use it to adjust fuel surcharges weekly.
- data.diesel.regions.*: PADD-region breakdown lets you refine fuel assumptions for regional fleets or multi-stop routes across different cost zones.
- data.diesel.historical: Short and medium-term averages that can stabilize your ETA-cost models against weekly noise.
- timestamp: Useful for caching and determining data recency in your pipelines.
Core Endpoints
For truck telematics integration focused on real-time ETA accuracy and utilization insights, these FreightPulse endpoints form the backbone: /freight-rates for live cost and transit-day references, /disruptions for hazard-aware routing, /port-congestion for upstream flow shaping ETAs, /carriers for compliance and partner routing, /fuel-prices for cost-to-serve math, and /historical for timeseries modeling. Below, we cover each with parameters, cURL examples, complete JSON, and field-by-field guidance.
1) Live FTL Freight Rates — GET /freight-rates
What it solves: Where telematics tells you where the truck is, live FTL quotes tell you whether a lane is surging and what realistic transit duration looks like today. That matters for dispatchers committing to pickup windows and for planners adjusting ETAs after a mid-week tender.
Endpoint:
/freight-rates
Key params:
- mode: trucking (default), ocean, or air
- origin_zip: required for trucking
- destination_zip: required for trucking
- pickup_date: optional; if omitted, defaults are applied by the underlying quote source
- qty, total_weight_lb: optional, inform pricing context for multi-pallet or heavy loads
Example:
curl "https://freightpulsehq.com/api/v1/freight-rates?mode=trucking&origin_zip=10001&destination_zip=90210"
Sample response:
{
"success": true,
"data": {
"mode": "trucking",
"service": "FTL (53' dry van)",
"source": "Warp",
"price_usd": 7207.92,
"transit_days": 4,
"pickup_date": "2026-08-24",
"delivery_date": "2026-08-28"
}
}
How to use:
- transit_days and delivery_date: Feed these into your ETA engine as a prior, then adjust with telematics-derived speed, dwell, and duty-cycle (HOS) constraints. When live GPS lags a day beyond pace, drop-in transit_days gives a recalibration anchor.
- price_usd: Combine with /fuel-prices to break out base linehaul vs. fuel surcharge estimates in your cost-to-serve dashboards. Use rate deltas to flag lanes where contract freight is misaligned with spot.
- service: Gives you mode/service context for rate explanations and auditing.
Notes:
- If you omit required params, the API returns available: false rather than an error. Your UI can interpret this gracefully (e.g., prompt for missing ZIPs).
2) Natural-Hazard Disruptions — GET /disruptions
What it solves: ETAs derail most often due to weather and seismic events. Your telematics app can ingest this feed, filter by corridor or port radius, and proactively reroute or resequence stops before trucks hit road closures or cyclone bands.
Endpoint:
/disruptions
Key params:
- type: cyclone | earthquake | flood | volcano | drought | wildfire | severe_weather
- severity: low | moderate | high
- country: optional filter
- port: filters events near a specific port (300km, 100km for US weather)
Example:
curl "https://freightpulsehq.com/api/v1/disruptions?port=USLAX&severity=high"
Sample response:
{
"success": true,
"data": {
"results": [
{
"id": "gdacs:TC:1001305",
"type": "cyclone",
"severity": "moderate",
"title": "Tropical Cyclone SAUDEL-26",
"country": "Japan",
"starts_at": "2026-08-18T12:00:00+00:00",
"source": "GDACS"
}
]
}
}
How to use:
- type and severity: Map to your routing policy levels. For severe_weather:high intersecting your planned corridor in 24–48 hours, automatically add buffer to ETAs or propose alternate highways.
- port filter: Connect ocean inbound risk to your over-the-road drayage/linehaul plans. If Long Beach is under moderate cyclone-related disruptions for inbound sailings, you can stagger truck arrivals or pre-stage chassis elsewhere.
- starts_at and title: Display meaningful alerts to dispatchers and shippers; use starts_at to timebox your mitigations.
3) Port Congestion — GET /port-congestion
What it solves: Upstream port slowdowns shape truck ETAs days to weeks out—yard turns stretch, drayage arrivals compress, and long-haul pickups swing. You do not need expensive live AIS to get a reliable signal. FreightPulse provides a lagged approximation (~6–7 days) using a 7-day average of port calls vs. a 90-day baseline.
Endpoint:
/port-congestion
Key params:
- port: name or LOCODE (e.g., USLAX)
- country: name or ISO3
- region: continent
- congestion: low | moderate | high
Example:
curl "https://freightpulsehq.com/api/v1/port-congestion?port=USLAX"
Sample response:
{
"success": true,
"data": {
"results": [
{
"port": "Los Angeles-Long Beach",
"locode": "US LAX",
"country": "United States",
"congestion": "moderate",
"as_of": "2026-08-14",
"metrics": {
"recent_avg_portcalls_per_day": 8.7,
"baseline_avg_portcalls_per_day": 10.2,
"ratio_vs_baseline": 0.85
}
}
]
}
}
How to use:
- congestion: Provide traffic-light style signals to planners. If moderate for two weeks and trending down (see /historical below), expect berth-to-gate times to stabilize; otherwise, keep OTIF buffers larger.
- ratio_vs_baseline: A precise numeric gauge. Values below 1.0 typically suggest lower throughput; combine with disruptions for likely cause analysis (e.g., storms).
- as_of: Communicates lag; do not present this as live vessel wait times. Use it for medium-horizon ETA shaping and staffing forecasts at yards.
4) Carrier Verification — GET /carriers
What it solves: When dispatching overflow or brokering a last-minute rescue, you need to vet motor carriers quickly. Pull status, safety rating, headcount, and location from an authoritative directory so you can automate acceptance rules and reduce on-hold time.
Endpoint:
/carriers
Key params:
- q: required search term (DOT number or name for trucking; org number or name for ocean)
- type: trucking (default) | ocean | air (air returns available: false)
Example (US trucking by DOT number):
curl "https://freightpulsehq.com/api/v1/carriers?q=54283"
Sample response:
{
"success": true,
"data": {
"type": "trucking",
"query": "54283",
"results": [
{
"dot_number": 54283,
"legal_name": "SWIFT TRANSPORTATION COMPANY OF ARIZONA LLC",
"status": "active",
"safety_rating": "S",
"drivers": 12883,
"address": {
"city": "Phoenix",
"state": "AZ",
"country": "US"
}
}
]
}
}
How to use:
- status and safety_rating: Gate your auto-tendering workflow; for example, only tender to active carriers with acceptable safety grades.
- drivers: A quick capacity proxy for large fleets when routing high-volume lanes or surge events.
- address: Match by operating region for local pickups or cross-dock runs.
5) Fuel Prices — GET /fuel-prices
What it solves: Accurate ETAs are half the battle—profitable ETAs are the other half. Weekly diesel indices drive surcharges and can influence route recommendations (e.g., a slightly longer route with cheaper PADD fuel may be optimal).
Endpoint:
/fuel-prices
Key params: None required.
Practical tips:
- Use national_average for simple surcharges; switch to regions.* for regional fleets.
- Smooth volatility with historical.30d_avg when presenting cost-to-serve to customers or executives to avoid overreacting to one-week blips.
6) Historical Series — GET /historical
What it solves: ETAs and utilization improve when your models incorporate trends. Use diesel series for seasonal cost patterns and port-congestion series for medium-term arrival shaping across ocean-to-OTR handoffs.
Endpoint:
/historical
Key params:
- metric: fuel_price_diesel_national | fuel_price_gasoline_national | port_congestion:<portid>
- period: 30d (default) | 90d | 1y
Example (diesel series, 30 days):
curl "https://freightpulsehq.com/api/v1/historical?metric=fuel_price_diesel_national&period=30d"
Sample response:
{
"success": true,
"data": {
"metric": "fuel_price_diesel_national",
"period": "30d",
"series": [
{
"date": "2026-07-27",
"value": 5.257
},
{
"date": "2026-08-03",
"value": 5.343
}
]
}
}
How to use:
- series[].date/value: Feed into your ML features or rolling-window rules for surcharge projection. For ETAs, tie higher cost periods to recommended consolidation or stop resequencing to keep utilization profitable.
- metric and period: Display context in charts so operators understand horizon and scope.
Real-World Use Cases
1) Hazard-Aware ETA Adjustment for Live Fleets
Combine your telematics GPS pings and duty status with FreightPulse /disruptions. Every five minutes, query disruptions filtered to your destination corridor or port radius. If a severe_weather event intersects the route in the next 6 hours, extend ETA by a policy-based buffer (e.g., 15% plus fixed 30 minutes) and alert dispatch. Endpoints: /disruptions and /freight-rates (to re-benchmark transit_days when rebidding urgent tenders).
2) Drayage Arrival Smoothing with Port Congestion Trends
Inbound ocean shipments create bursts of drayage work. Use /port-congestion to classify target ports as low/moderate/high and /historical with port_congestion:<portid> to understand trend direction. Feed this into your yard and chassis scheduling; if congestion is high and rising, pre-book drivers earlier and spread arrivals across terminals to protect dwell KPIs. Endpoints: /port-congestion, /historical.
3) Lane Cost and Surcharge Planner
Before tendering overflow, query /freight-rates for an on-the-day price and transit_days. Pull /fuel-prices to compute a transparent surcharge, optionally smoothed with /historical for 30d averages. Present procurement with a “price-to-ETA” graph, letting them trade time sensitivity for cost while preserving utilization goals. Endpoints: /freight-rates, /fuel-prices, /historical.
4) Carrier Vetting Inside a TMS Tender Screen
When an operator types a DOT number in your tender form, auto-query /carriers to confirm status=s active and safety_rating within thresholds. Flag risky carriers and recommend alternatives that match geography and size. This shortens tender cycles and reduces rejects. Endpoints: /carriers.
5) Exception Management for Weather and Seismic Events
Build a control-tower widget that constantly polls /disruptions for cyclone and severe_weather near your high-volume corridors. When triggered, push tasks to dispatch to resequence stops, notify shippers, and, when necessary, reprice urgent tenders with /freight-rates. Endpoints: /disruptions, /freight-rates.
FAQ
How often do FreightPulse fuel prices update?
Fuel prices are sourced from the EIA and presented with a timestamp in the response. Use that timestamp for cache control and UI recency indicators. Pair the current value with the 30d and 90d averages to stabilize week-to-week fluctuations in your pricing logic.
Can I look up ocean carriers as well as trucking carriers?
Yes. The /carriers endpoint supports type=ocean for FMC directory lookups by name or organization number. For US trucking carriers, use the default type=trucking with DOT numbers or names for FMCSA SAFER data. Air queries return available: false.
Does the port congestion data reflect real-time vessel wait times?
No. Port congestion is a lagged approximation (~6–7 days) built from a 7-day average of port calls versus a 90-day baseline. It is designed for planning and trend analysis, not live berth or anchor wait times. Always use the as_of date to communicate recency to operators.
Can I use these endpoints to trigger hazard-aware routing for my trucks?
Yes. Filter /disruptions by type and port or country, join with telematics GPS and planned routes, and apply policy-based ETA buffers or alternate corridors. This is especially effective when combined with /freight-rates to re-benchmark delivery commitments.
How should I combine telematics speed data with FreightPulse transit_days?
Use transit_days as a prior, then apply real-time corrections from telematics (average speed by road class, driver HOS, dwell) and any active disruptions. Over time, fit lane-specific bias adjustments so your model learns where transit_days consistently runs hot or cold relative to your fleet performance.
Conclusion + CTA
Telematics alone describes what your trucks are doing. To predict what they will do next—reliably and profitably—you need external context: dynamic rates, shifting port throughput, severe weather, and validated carrier partners. FreightPulse brings those inputs into one developer-friendly API so you can build hazard-aware ETAs, smoother drayage handoffs, smarter tendering, and higher utilization—all without maintaining a web of provider integrations.
Start small: wire /disruptions into your dispatch exceptions. Then add /freight-rates for mid-tender replans and /fuel-prices to ground your surcharge math. As you harden the workflow, layer /port-congestion and /historical for horizon-level forecasts and dashboards your operators will trust. The result is fewer surprises on the road, tighter arrival windows, and better asset productivity.
Ready to see these building blocks in action inside your telematics or TMS stack? Try FreightPulse for free and ship a working prototype today.
Implementation Notes, Examples, and Best Practices
Below are additional patterns and code snippets to help you get from proof-of-concept to production-grade integration.
Joining telematics pings with disruption alerts
Assume you have a stream of GPS pings with longitude, latitude, and planned route segments. Poll /disruptions by relevant port or country, then intersect the disruption bounding area with your next 200 miles of corridor. When an overlap is detected at severity=high, apply a buffer to the ETA and notify dispatch.
// JavaScript (Node.js) - minimal example
import fetch from "node-fetch";
async function getDisruptionsNearPort(locode) {
const url = `https://freightpulsehq.com/api/v1/disruptions?port=${encodeURIComponent(locode)}&severity=high`;
const res = await fetch(url);
const json = await res.json();
if (!json.success) throw new Error(json.error || "Unknown error");
return json.data.results || [];
}
async function adjustEtaForHazards(currentEtaMinutes, nextCorridorPort) {
const hazards = await getDisruptionsNearPort(nextCorridorPort);
const hasSevere = hazards.some(h => ["severe_weather", "cyclone", "wildfire"].includes(h.type));
if (hasSevere) {
// Example policy: +15% and +30 minutes hard buffer
return Math.round(currentEtaMinutes * 1.15 + 30);
}
return currentEtaMinutes;
}
adjustEtaForHazards(420, "USLAX").then(console.log).catch(console.error);
Using live FTL quotes to replan time-sensitive pickups
# Python - replanning an urgent tender
import requests
from datetime import date
def get_quote(origin_zip, destination_zip):
params = {
"mode": "trucking",
"origin_zip": origin_zip,
"destination_zip": destination_zip,
"pickup_date": str(date.today())
}
r = requests.get("https://freightpulsehq.com/api/v1/freight-rates", params=params, timeout=15)
data = r.json()
if not data.get("success"):
raise RuntimeError(data.get("error", "quote failed"))
return data["data"]
quote = get_quote("77001", "33101")
print(f"Price: ${quote['price_usd']:.2f}, Transit: {quote['transit_days']} days, Delivers: {quote['delivery_date']}")
Building a port-congestion trendline for dray planning
To support staffing and chassis allocation around LA/LB, query a daily series with /historical for port_congestion:USLAX and plot the ratio_vs_baseline if provided via a separate series endpoint. When working with /port-congestion alone, combine recent_avg_portcalls_per_day and baseline_avg_portcalls_per_day for a derived ratio.
curl "https://freightpulsehq.com/api/v1/port-congestion?port=USLAX"
{
"success": true,
"data": {
"results": [
{
"port": "Los Angeles-Long Beach",
"locode": "US LAX",
"country": "United States",
"congestion": "moderate",
"as_of": "2026-08-14",
"metrics": {
"recent_avg_portcalls_per_day": 8.7,
"baseline_avg_portcalls_per_day": 10.2,
"ratio_vs_baseline": 0.85
}
}
]
}
}
Practical guidance:
- Keep the as_of date visible; this is not a live AIS view. Use it to guide medium-horizon drayage schedules.
- Flag ratio_vs_baseline < 0.9 for early warning on slowdowns, especially when your purchase orders require tight cross-dock turnarounds.
Error handling and response shape
All endpoints share a consistent envelope. When a call fails, the API provides a machine-friendly structure:
{
"success": false,
"error": "Human-readable message."
}
Production tips:
- Always check success before reading data. This prevents key errors when rendering UI or writing to your telemetry pipeline.
- Log error messages with the request context (endpoint, params), so observability tools can group failures and surface anomalies.
End-to-end flow: Telemetrics-driven ETA with FreightPulse context
Below is a reference flow you can adapt:
- Telematics pings update position and HOS every 60 seconds. Your ETA engine forecasts arrival using historical segment speeds and driver duty windows.
- FreightPulse /disruptions polled every 5 minutes. If a relevant event is detected within a 100–300km buffer around destination or along the corridor, your engine adds policy-based delay.
- If the run is an inbound port dray, /port-congestion supplies context for gate wait risk; if moderate/high, keep a bigger buffer and adjust yard staffing.
- For urgent replans or rescue loads, /freight-rates posts a live transit_days and price_usd. You weigh the replan vs. the driver’s remaining HOS to decide on a handoff or team run.
- /fuel-prices and /historical update surcharge logic weekly, ensuring your utilization KPI reflects both time and cost performance.
- /carriers validates partner carriers when overflow capacity is needed, enforcing safety and status gates automatically in your tender workflow.
This architecture pairs what’s happening on the road with what’s happening in the world, closing the loop between ETA, cost, and compliance—without a maintenance burden of multiple provider SDKs.
Additional complete JSON examples
Fuel prices (already shown above) are ideal for cost modeling. Here are extra full responses you can use for tests or mocks.
Disruptions filtered by severe weather:
{
"success": true,
"data": {
"results": [
{
"id": "nws:SW:US:2026-08-19-CA-001",
"type": "severe_weather",
"severity": "high",
"title": "Severe Thunderstorm Warning - Ventura County",
"country": "United States",
"starts_at": "2026-08-19T18:30:00+00:00",
"source": "NOAA/NWS"
},
{
"id": "usgs:EQ:2026-08-19-BAJA-4.8",
"type": "earthquake",
"severity": "moderate",
"title": "M4.8 - Baja California",
"country": "Mexico",
"starts_at": "2026-08-19T16:12:00+00:00",
"source": "USGS"
}
]
}
}
Freight rates with missing params behavior (availability response):
{
"success": true,
"data": {
"available": false,
"reason": "Missing required parameters: origin_zip, destination_zip"
}
}
Carrier lookup by name (trucking):
{
"success": true,
"data": {
"type": "trucking",
"query": "Acme Logistics",
"results": [
{
"dot_number": 1234567,
"legal_name": "ACME LOGISTICS LLC",
"status": "active",
"safety_rating": "S",
"drivers": 114,
"address": {
"city": "Dallas",
"state": "TX",
"country": "US"
}
},
{
"dot_number": 7654321,
"legal_name": "ACME LOGISTICS HOLDINGS INC",
"status": "inactive",
"safety_rating": "N",
"drivers": 0,
"address": {
"city": "Fort Worth",
"state": "TX",
"country": "US"
}
}
]
}
}
Port congestion for a region filter:
{
"success": true,
"data": {
"results": [
{
"port": "Rotterdam",
"locode": "NL RTM",
"country": "Netherlands",
"congestion": "low",
"as_of": "2026-08-12",
"metrics": {
"recent_avg_portcalls_per_day": 24.1,
"baseline_avg_portcalls_per_day": 23.8,
"ratio_vs_baseline": 1.01
}
},
{
"port": "Antwerp-Bruges",
"locode": "BE ANR",
"country": "Belgium",
"congestion": "moderate",
"as_of": "2026-08-12",
"metrics": {
"recent_avg_portcalls_per_day": 18.3,
"baseline_avg_portcalls_per_day": 20.0,
"ratio_vs_baseline": 0.92
}
}
]
}
}
Field-by-field mapping to ETA and utilization logic
- freight-rates.transit_days: Base prior for ETA; calibrate by lane with your fleet’s historical variance.
- disruptions.type/severity/starts_at: Triggers for buffers, route alternates, and shipper alerts; use starts_at to avoid over-bucketing older events.
- port-congestion.ratio_vs_baseline: Medium-horizon capacity signal for drayage and DC throughput planning.
- fuel-prices.diesel.national_average and regions.*: Weekly surcharge input; avoid overfitting ETAs to cost but use these fields to influence routing only when the delta is material.
- carriers.status/safety_rating: Compliance gate for automated tendering; log denials for auditability.
- historical.series: Feature engineering for both ETA forecasting and cost projections; stable features reduce model thrash.
Performance and resiliency tips
- Cache non-volatile endpoints. Fuel prices and port congestion have natural weekly/daily cadences. Cache responses by timestamp/as_of to cut repeated fetches.
- Use idempotent retry with jitter. For read-only GETs, implement exponential backoff and respect the response’s success flag before retries.
- Set circuit breakers around optional signals. If disruptions are temporarily unavailable, fall back to a conservative buffer policy rather than blocking dispatch screens.
- Validate numeric domains. For example, if ratio_vs_baseline is missing, compute it from known metrics or suppress that UI element gracefully.
When these practices are in place, your integration stays reliable even under peak operations while providing operators with trustworthy context for decisions.