Turning FreightPulse Telemetry into Scope 3 Emissions Reports: this guide shows enterprise supply chain teams, freight forwarders, and sustainability-focused 3PLs how to go from raw movement, fuel, and disruption signals to auditable Scope 3 Category 4/9 reporting. We’ll connect the dots between freight activity (e.g., a truckload tender or an inbound portcall), contextual factors (diesel price curves, port throughput, carrier verification), and emissions modeling assumptions to produce clear outputs that finance, audit, and ESG platforms can trust. Along the way, we’ll build with one modern logistics API instead of stitching together half a dozen feeds.
If you’ve tried to assemble Scope 3 emissions for transportation and distribution, you already know the complexity: incomplete lane-level data, late or incompatible telemetry, lack of shared schemas across providers, and opaque assumptions hidden in spreadsheets. The practical result is drift between planning and actuals, and long cycles to validate even basic rollups for assurance. FreightPulse consolidates the highest-signal telemetry your modeling needs—live US FTL quotes, weekly national and regional fuel curves, port activity, carrier verification, and natural-disruption alerts—behind a single REST surface with consistent JSON. That lets you focus on the math and controls rather than the plumbing.
In this step-by-step tutorial, we’ll map a clean path from FreightPulse endpoints to an emissions pipeline: how to fetch activity signals, attach fuel and congestion context, annotate with carrier-level attributes, flag disruption risks affecting actual emissions, and assemble everything into a repeatable model with data lineage for audit. You’ll get runnable cURL commands, JSON responses with field-by-field explanations, and tips for productionizing (retries, backoff, circuit breakers, observability) so your reporting closes on time every quarter.
Introduction
Most Scope 3 emissions workflows stumble over two gaps: data collection and contextual fidelity. It’s not enough to say “we shipped 10 pallets from NJ to LA;” you need evidence of transport mode and distance, a defensible emission factor selection, a way to account for outliers (e.g., diversions from port congestion), and traceable assumptions. Without a consistent data backbone, teams waste weeks normalizing CSVs and chasing missing fields while auditors wait for revisions.
FreightPulse changes that by offering a single, developer-friendly REST API that covers five essential categories for emissions modeling and supply chain analytics: national and regional fuel prices, live freight rates for US FTL (a strong proxy for mode and lane activity when shipment-level data is incomplete), port congestion approximations (to help explain detours and dwell-related emissions), carrier lookups (to validate the operators moving your goods), and natural-disruption alerts (to explain deviations from planned itineraries). With these pillars, you can attribute emissions with more precision and defend your methodology during review.
In this post, we’ll:
- Show how to pull fuel price series to select and version emission factors over time.
- Use live FTL rates as activity signals for lanes where you lack complete historicals.
- Leverage port activity to explain routing changes and model additional dwell-driven emissions.
- Verify carriers for governance and audit trails.
- Layer in disruption alerts to preempt spikes in your monthly emissions totals and annotate exceptions.
Why FreightPulse
FreightPulse is purpose-built to collapse your integration overhead. Instead of maintaining separate connectors for EIA fuel data, carrier registries, freight quote providers, hazard alert feeds, and AIS-derived port telemetry, you query one API. That matters because Scope 3 reporting amplifies every inconsistency. Here are four concrete developer and operator benefits:
- Single JSON schema across logistics domains: Every endpoint returns the same envelope and predictable field patterns. That means your ETL and validation logic stays consistent from rates to fuel to disruptions, reducing glue code and making lineage queries trivial.
- Operational context next to activity: Combine a live FTL quote for a New York to Los Angeles lane with the current national diesel trend and port activity signals in one pipeline. This lets you pick a dynamic emission factor path (e.g., fuel-based) rather than a static one, and annotate variances with measurable causes (congestion ratio vs baseline).
- Port congestion approximations without managing AIS: FreightPulse provides a 7-day average vs a 90-day baseline for curated ports from IMF PortWatch (AIS-derived). You don’t need to run an AIS ingestion stack to answer “Was LA/LB below baseline throughput this week?” That context is often enough to justify route or dwell adjustments in your emissions ledger.
- Developer ergonomics that accelerate to production: Clear endpoints, cURL-first documentation, consistent errors, and readable responses remove friction. You can wire up a prototype in an afternoon and promote it with your standard reliability toolkit (health checks, retries, circuit breakers) the next sprint.
Most importantly, with FreightPulse you no longer maintain five vendor contracts or transform five different schemas just to assemble a single emissions report. You have one surface to build on, and that surface is designed for supply chain telemetry at application speed.
Quick Start
Base URL: https://freightpulsehq.com/api/v1
Let’s sanity-check connectivity by calling the fuel-prices endpoint. It’s the fastest way to retrieve up-to-date national diesel and gasoline averages with regional breakdowns, which we will later map to emission factor choices and period weighting.
cURL example:
curl -s -H "X-API-Key: YOUR_API_KEY" \
"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 concepts for emissions modeling:
- data.diesel.national_average: If your model uses fuel-based emission factors, this allows time-weighting a factor by the week. Even for activity-based factors, correlating anomalies against price changes can explain cost-to-serve and emissions variance.
- data.diesel.regions.*: Region-specific averaging can align with how your network consumes fuel (e.g., Gulf Coast vs California rates) if you allocate by PADD or operating region.
- data.diesel.historical.30d_avg and 90d_avg: Smooth noise in your monthly close or provide a backstop when weekly indexes are late.
Core Endpoints
We’ll focus on five endpoints that directly support a Scope 3 pipeline: fuel-prices, freight-rates, port-congestion, carriers, disruptions, plus a supporting historical endpoint for trend series. For each, we’ll show parameters, a request example, a realistic JSON response, and how to use the fields in practice.
1) GET /fuel-prices — Fuel curves for factor selection and time-weighting
Purpose: Retrieve national diesel and gasoline prices with regional breakdowns and short/medium-term historical stats. For many emissions programs, diesel prices are a useful correlate when choosing between factor sets (e.g., when blending activity- and fuel-based approaches) or explaining month-over-month changes in total emissions and spend.
Key parameters: None required.
cURL:
curl -s -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/fuel-prices"
Response (explained):
{
"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
}
}
}
}
}
- timestamp: The data’s as-of time. Store this in your emissions ledger for versioning.
- diesel.national_average: Core weekly index for diesel. Use as a proxy to pick fuel-based factors when relevant.
- diesel.regions: Regional context to refine allocation where operations are segmentable by region.
- diesel.historical.*: Stabilize noisy periods or provide insight for sensitivity analysis in your audit narrative.
2) GET /freight-rates — Activity signal for mode, lane, and transit windows
Purpose: Get live US FTL truckload quotes for specific ZIP-to-ZIP lanes. While the response provides price and transit days, the more strategic value for emissions is a defensible activity signal: identifying a lane, service type, transit window, and shipment size proxy (via parameters you supply). This is particularly useful if you are missing complete historical shipment data for certain lanes and need to model emissions for planning or backfill gaps.
Key parameters:
- mode: trucking (default), ocean, or air.
- origin_zip, destination_zip: Required for trucking mode.
- pickup_date, qty, total_weight_lb: Optional, refine the quote context.
cURL:
curl -s -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/freight-rates?mode=trucking&origin_zip=10001&destination_zip=90210&pickup_date=2026-08-24&qty=24&total_weight_lb=38000"
Sample JSON:
{
"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"
}
}
- mode and service: Tie your emission factor table to mode and subtype. For an FTL 53' dry van, use a weight-distance-based factor or a class-8 diesel factor with distance modeled from ZIP-to-ZIP.
- transit_days and delivery_date: Inform dwell and idling assumptions (e.g., a longer transit could increase emissions if driving time or routing deviates).
- price_usd: Not used directly for emissions but essential for cost-to-serve and to benchmark fuel-surcharge calculations that influence reporting narratives.
Tip: If required parameters are missing, this endpoint returns HTTP 200 with "available": false rather than an error. Handle that gracefully and fall back to defaults in planning tools.
3) GET /port-congestion — Explain routing changes and dwell-related emissions
Purpose: Retrieve a 7-day average of port calls compared to a 90-day baseline for curated major ports. This is a lagged approximation (typically 6–7 days) derived from AIS via IMF PortWatch—not live vessel wait times. For Scope 3 modeling, this provides quantitative context to annotate exceptions: when throughput dips, you can expect delays, diversions to alternate ports, or increased idling, all of which can elevate emissions for ocean legs and connected drayage.
Key parameters:
- port: Port name or LOCODE (e.g., USLAX).
- country or region: Retrieve broader sets if you’re scanning for hotspots.
- congestion: low | moderate | high filter.
cURL:
curl -s -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/port-congestion?port=USLAX"
Sample JSON:
{
"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
}
}
]
}
}
- congestion and ratio_vs_baseline: A ratio below 1 indicates fewer port calls than the 90-day baseline. Use this to annotate shipments with probable delays or reroutes.
- as_of: The date anchor for your exception notes. Since it’s lagged, document the lookback in your methodology notes.
4) GET /carriers — Validate operators for governance and assurance
Purpose: Validate your trucking or ocean operators during emissions aggregation. For trucking, verify the DOT number, legal name, status, driver count, and safety rating. This helps keep your Scope 3 ledger tied to real carriers and supports auditability when rolling up emissions by carrier or when excluding non-operational entities.
Key parameters:
- q: Search term (DOT number or name for trucking; org number or name for ocean).
- type: trucking (default) | ocean | air (air returns available:false).
cURL:
curl -s -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/carriers?q=54283"
Sample JSON:
{
"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"
}
}
]
}
}
- status: Filter out inactive carriers from emissions rollups.
- safety_rating and drivers: Useful governance metadata. Larger fleets can suggest different fleet mix assumptions in sensitivity analyses.
- legal_name and dot_number: Primary keys for matching your TMS carriers and ensuring deduplication.
5) GET /disruptions — Detect natural hazards that alter routes and emissions
Purpose: Identify active natural-hazard events like cyclones, earthquakes, and severe weather that can cause reroutes, extra dwell, or mode shifts. These exceptions often drive spikes in emissions for a month or quarter; tagging impacted shipments with disruption context helps explain variances.
Key parameters:
- type: cyclone | earthquake | flood | volcano | drought | wildfire | severe_weather.
- severity: low | moderate | high.
- country, port: Filter by country or a port radius. For US weather, a tighter radius is applied.
cURL:
curl -s -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/disruptions?port=USLAX&severity=high"
Sample JSON:
{
"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"
}
]
}
}
- type and severity: Drive your exception routing logic. High-severity events near planned corridors likely change your modeled distance or dwell.
- starts_at: Timestamp for correlating to shipment milestones so you only annotate affected legs.
6) GET /historical — Build trend charts and backtest assumptions
Purpose: Fetch historical series for national fuel prices (weekly) or for curated ports’ congestion metrics (daily). Use these series for dashboards, trend-based factor selection, and backtesting scenario assumptions.
Key parameters:
- metric: fuel_price_diesel_national | fuel_price_gasoline_national | port_congestion:<portid>.
- period: 30d (default) | 90d | 1y.
cURL:
curl -s -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/historical?metric=fuel_price_diesel_national&period=30d"
Sample JSON:
{
"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
}
]
}
}
- series[].date and value: Stitch into your emissions timeline to compute rolling factors, generate dashboards, or validate smoothing logic in monthly close.
From Telemetry to Scope 3: A Practical Modeling Flow
To turn FreightPulse telemetry into a defensible Scope 3 model, combine activity, distance, and fuel context with consistent assumptions. Here’s a recommended flow for an FTL-dominant network with ocean gateways:
- Identify or simulate activity: - If you have shipment-level data: extract origin and destination ZIPs, weights, and dates. - If you have gaps: request lane-level live quotes via /freight-rates to approximate the service window and confirm mode.
- Compute distance: - Use your standard geocoding tool for ZIP-to-ZIP driving distance (stored in your system). - For ocean-connected legs, model drayage distances to/from ports using your port assignments.
- Select emission factors: - For trucking, choose weight-distance-based CO2e factors by mode and service. - Adjust or annotate factors by referencing /fuel-prices and /historical series (e.g., monthly average diesel as a sensitivity variable).
- Apply congestion modifiers: - Check /port-congestion for gateway ports during the shipment window. If ratio_vs_baseline is materially below 1.0, consider applying dwell/idle adjustments or just annotate exceptions for audit narratives.
- Governance and traceability: - Use /carriers to verify DOT and legal_name for the operating carrier codes in your TMS. Attach status, safety_rating, and drivers where relevant.
- Exception tagging: - Poll /disruptions by port or country and correlate events to shipment timelines. Tag affected legs and store the event id and type on the record for future auditing.
- Rollup and audit: - Persist raw inputs, derived distances, factor versions, and contextual telemetry as columns. Version keys (timestamps, as_of) make recalculation and audit reproducible.
This approach balances practicality (using available telemetry rather than bespoke IoT feeds everywhere) with rigor (time-bound factor selection and documented assumptions). Most finance and sustainability stakeholders prefer a model that is consistent, explainable, and versioned over a black box that purports to be “live.”
Production Implementation Tips: Reliability, Observability, and Data Hygiene
You can integrate FreightPulse with any platform stack. The following practices keep your emissions pipeline robust in production:
- Retries with backoff: Implement exponential backoff on non-4xx errors and idempotent GETs. Cache last-known-good responses for reference data like fuel prices.
- Circuit breakers: If an upstream is temporarily degraded, open a circuit and serve cached data with a recorded “as_of” timestamp so your nightly close still runs.
- Health checks: Include a lightweight canary call to /fuel-prices or a small /historical window to assert upstream availability before your main ETL.
- Observability: Emit structured logs that include endpoint, params, success flag, duration, and the returned timestamp/as_of fields. This helps during audits when you need to prove which version was used on a given date.
- Schema contracts: All FreightPulse responses share a common envelope with success and data. Always verify success before dereferencing data and capture error messages for troubleshooting.
- Data lineage: Store the full JSON response (or a hashed copy with the “as_of” and version fields) alongside computed emissions rows for replayability.
Code Examples: cURL, Python, and JavaScript
Below are minimal examples you can adapt into your pipeline. These illustrate fetching inputs to power emissions calculations and annotating exceptions.
cURL: Fuel and FTL Quote
# Fuel prices (national + regions)
curl -s -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/fuel-prices" | jq '.'
# Live FTL rate NY (10001) to LA (90210)
curl -s -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/freight-rates?mode=trucking&origin_zip=10001&destination_zip=90210&pickup_date=2026-08-24&qty=26&total_weight_lb=41000" | jq '.'
Python: Compose telemetry into a modeling-ready record
import os
import requests
from datetime import datetime
BASE = "https://freightpulsehq.com/api/v1"
HEADERS = {"X-API-Key": os.getenv("FP_API_KEY")}
def get_fuel():
r = requests.get(f"{BASE}/fuel-prices", headers=HEADERS, timeout=20)
j = r.json()
if not j.get("success"):
raise RuntimeError(j.get("error", "fuel-prices failed"))
return j["data"]
def get_rate(o, d, date, qty, weight):
params = {
"mode": "trucking",
"origin_zip": o,
"destination_zip": d,
"pickup_date": date,
"qty": qty,
"total_weight_lb": weight
}
r = requests.get(f"{BASE}/freight-rates", headers=HEADERS, params=params, timeout=20)
j = r.json()
if not j.get("success"):
raise RuntimeError(j.get("error", "freight-rates failed"))
return j["data"]
def get_port_activity(locode):
r = requests.get(f"{BASE}/port-congestion", headers=HEADERS, params={"port": locode}, timeout=20)
j = r.json()
if not j.get("success"):
raise RuntimeError(j.get("error", "port-congestion failed"))
return j["data"]["results"]
def get_disruptions(locode):
r = requests.get(f"{BASE}/disruptions", headers=HEADERS, params={"port": locode}, timeout=20)
j = r.json()
if not j.get("success"):
raise RuntimeError(j.get("error", "disruptions failed"))
return j["data"]["results"]
def model_emissions(origin_zip, dest_zip, pickup_date, qty, weight_lb, gateway_locode="USLAX"):
fuel = get_fuel()
rate = get_rate(origin_zip, dest_zip, pickup_date, qty, weight_lb)
ports = get_port_activity(gateway_locode)
hazards = get_disruptions(gateway_locode)
# Example: derive naive driving distance externally; here assume a lookup
distance_miles = 2790 # Example NYC to LA
# Example emission factor for class-8 diesel (kg CO2e per ton-mile)
ef_kg_per_ton_mile = 0.161 # Example; replace with your official factor source
tons = weight_lb / 2000.0
co2e_kg = ef_kg_per_ton_mile * tons * distance_miles
# Annotate with port throughput ratio if available
port_ratio = None
if ports:
port_ratio = ports[0]["metrics"]["ratio_vs_baseline"]
# Example: add a 2% dwell uplift if port activity is below 0.9 ratio
dwell_uplift = 1.0
if port_ratio is not None and port_ratio < 0.9:
dwell_uplift = 1.02
total_co2e_kg = co2e_kg * dwell_uplift
return {
"lane": f"{origin_zip}-{dest_zip}",
"pickup_date": pickup_date,
"service": rate.get("service"),
"transit_days": rate.get("transit_days"),
"distance_miles": distance_miles,
"weight_lb": weight_lb,
"co2e_kg": round(total_co2e_kg, 2),
"diesel_national_avg": fuel["data"]["diesel"]["national_average"],
"port_ratio_vs_baseline": port_ratio,
"hazards": hazards,
"as_of_fuel": fuel["timestamp"]
}
record = model_emissions("10001", "90210", "2026-08-24", 26, 41000)
print(record)
JavaScript (Node): Validate a trucking carrier and tag a shipment
import fetch from "node-fetch";
const BASE = "https://freightpulsehq.com/api/v1";
const HEADERS = { "X-API-Key": process.env.FP_API_KEY };
async function lookupCarrier(dotNumber) {
const url = new URL(`${BASE}/carriers`);
url.searchParams.set("q", String(dotNumber));
const res = await fetch(url, { headers: HEADERS });
const j = await res.json();
if (!j.success) throw new Error(j.error || "carrier lookup failed");
return j.data.results[0];
}
async function annotateShipment(shipment) {
const carrier = await lookupCarrier(shipment.dot_number);
return {
...shipment,
carrier_legal_name: carrier?.legal_name,
carrier_status: carrier?.status,
carrier_safety_rating: carrier?.safety_rating
};
}
annotateShipment({ id: "SHP-123", dot_number: 54283 })
.then(r => console.log(r))
.catch(err => console.error(err));
Error Handling and Troubleshooting
FreightPulse responses include a consistent envelope. Always check success before dereferencing data. For robustness:
- Validate inputs: For /freight-rates, ensure origin_zip and destination_zip are present. If the response contains available:false, fall back to defaults or prompt users for corrections.
- Graceful degradation: If /port-congestion is temporarily unreachable, skip the dwell uplift but record that the modifier was not applied in this run.
- Caching: Cache /fuel-prices and /historical data for their natural refresh intervals; store the timestamp and period to avoid mixing versions.
Example error payloads are human-readable and share the same shape:
{
"success": false,
"error": "Human-readable message."
}
Recommended patterns:
- Set a sane timeout (e.g., 15–20s) and instrument latency percentiles. Historical series and congestion lookups are typically light; unusual latency could indicate network issues.
- Implement idempotent retries on GET with jittered backoff. Log the retry count and final status.
- Add per-endpoint circuit breakers and expose breaker state to your ops dashboards so on-call can understand degraded modes.
Real-World Use Cases
1) Fuel-surcharge calculator and emissions cost bridge
Teams often need to reconcile fuel surcharges with emissions totals. Use /fuel-prices to compute a diesel index-based surcharge and connect it to your emissions ledger. By comparing national_average with your period’s 30d_avg, you can narrate why cost and emissions moved in parallel or diverged (e.g., slower price increase than expected but longer transit days from routing changes).
Endpoints used: /fuel-prices, /historical.
2) Port-congestion dashboard for a freight forwarder
Operational leads want to know where dwell and diversions may occur. Build a dashboard powered by /port-congestion for key gateways (Shanghai, Singapore, Rotterdam, Los Angeles-Long Beach). Even though the series is lagged by ~6–7 days, the 7-day average vs 90-day baseline surfaces structural slowdowns. That gives account managers material to set expectations and sustainability analysts a basis for annotating monthly emissions spikes.
Endpoints used: /port-congestion, /historical (port_congestion:<portid>).
3) Carrier vetting tool for a 3PL with emissions governance
Before including emissions from a small carrier in your quarterly rollup, verify the carrier’s DOT number, status, and safety rating using /carriers. This reduces the risk of aggregating emissions against inactive or misidentified entities and makes audits smoother because your ledger references an authoritative carrier record.
Endpoints used: /carriers.
4) Disruption-aware shipment tracker that pre-annotates exceptions
Connect /disruptions to your in-transit view by filtering events near ports on your ocean lanes. When a high-severity cyclone or severe weather event is active along a corridor, pre-tag shipments for potential reroute or dwell uplifts. This shores up your end-of-month emissions accounting by preventing surprises and ensuring exceptions are already documented.
Endpoints used: /disruptions, /port-congestion.
5) Planning backfill for incomplete lanes using live FTL quotes
When your TMS has incomplete historicals for a lane, use /freight-rates to estimate activity. Combine the live quote’s service and transit days with external distance calculations and fuel curves to create a transparent backfill record. Store the full JSON with timestamp so reviewers can reproduce the estimate later.
Endpoints used: /freight-rates, /fuel-prices, /historical.
Field-by-Field Reference with Practical Uses
The following table-style narrative explains key fields across endpoints and how they impact emissions modeling decisions:
- /fuel-prices - timestamp: Anchor for factor versioning. - diesel.national_average: Weekly anchor for fuel-based sensitivity or surcharge reconciliation. - diesel.regions.*: Aligns with region-based allocation or PADD-specific models. - diesel.historical.30d_avg and 90d_avg: Smoothing for monthly close; used in bridges and trend analysis.
- /freight-rates - mode, service: Controls factor selection (e.g., FTL dry van vs reefer if applicable in your catalog). - transit_days: Influences dwell/idle assumptions; cross-check with planned vs actual to detect anomalies. - pickup_date, delivery_date: Correlate to fuel timestamps and disruptions.
- /port-congestion - as_of: Date context; ensure you clearly state the lag in documentation. - metrics.ratio_vs_baseline: Modifier for expected dwell or reroutes; powerful as an explanatory variable even if you don’t apply mechanical uplifts. - congestion: Client-friendly state (low/moderate/high) when building ops UIs.
- /carriers - dot_number, legal_name: Identity keys for matching. - status: Include only active carriers in your emissions rollup by default. - safety_rating, drivers: Governance metadata; may influence factor selection in advanced models that differentiate by fleet mix.
- /disruptions - type, severity: Drive exception policies (e.g., automatically flag shipments for review). - starts_at: Connect to shipment milestones; only annotate affected time windows.
- /historical - metric, period: Keep these on the record for replay and dashboard reproducibility. - series[].date, value: Compose charts and rolling averages for executive reporting.
Complete JSON Examples: Cross-Endpoint Snapshots
To help you verify your parsers and data mapping, here are several complete responses across endpoints that you can drop into unit tests or fixtures.
Fuel prices (weekly view)
{
"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
}
}
}
}
}
Freight rate (FTL)
{
"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"
}
}
Port congestion (Los Angeles-Long Beach)
{
"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
}
}
]
}
}
Carrier lookup (trucking DOT)
{
"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"
}
}
]
}
}
Disruptions near a port
{
"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"
}
]
}
}
Putting It All Together: Data Model and Storage
For a durable emissions pipeline, create a normalized schema that captures both raw telemetry and derived fields. Here’s a suggested structure:
- shipments table: - id, origin_zip, destination_zip, planned_pickup_at, planned_delivery_at, actual_delivery_at - weight_lb, qty, mode, service - carrier_dot, carrier_legal_name - distance_miles_calculated
- telemetry_fuel table: - shipment_id, diesel_national_average, diesel_region, as_of_timestamp - source_label ("EIA via FreightPulse")
- telemetry_port table: - shipment_id, port_locode, as_of_date, ratio_vs_baseline, recent_avg, baseline_avg
- telemetry_disruptions table: - shipment_id, event_id, type, severity, starts_at, country, title
- emissions table: - shipment_id, factor_version, factor_type ("weight-distance", "fuel-based"), co2e_kg_raw, co2e_kg_adjusted, adjustments_applied ("dwell_2pct"), notes
This normalized layout makes it easy to:
- Recompute emissions if factors update, without losing the original telemetry references.
- Prove to auditors which data inputs existed at the time (timestamps on all telemetry).
- Construct executive dashboards that segment emissions by port, carrier, lane, or disruption type.
Performance and Stability: Regional Routing and Fallbacks
While integration is straightforward, large enterprises typically run emissions processing in scheduled batches with tight SLAs. Consider:
- Regional execution: Run your ETL close to where your applications are hosted to minimize latency. Co-locating compute and FreightPulse calls reduces variability.
- Fallback chains: If a supplemental distance service fails, proceed with cached distances and mark those records for later true-up. The same idea applies to telemetries like congestion snapshots.
- Observability: Track p95 and p99 request times per endpoint, log both the request parameters and returned timestamps/as_of fields, and export them to your metrics backend.
FAQ
How often do FreightPulse fuel prices update?
Fuel prices reflect the latest weekly EIA data with national and regional coverage. Use the timestamp in the response to anchor your reporting period and store it with your emissions calculations for auditability.
Can I look up ocean carriers as well as trucking carriers?
Yes. The /carriers endpoint supports trucking (default) and ocean. Search by DOT number or name for trucking, and by organization number or name for ocean. Air lookups return available:false.
Does the port congestion data reflect real-time vessel wait times?
No. Port congestion is a lagged approximation derived from AIS via IMF PortWatch. It represents a 7-day average compared to a 90-day baseline and typically lags by 6–7 days. It’s excellent for trend analysis and exception context, not for minute-by-minute dispatch.
Can I filter disruptions by a specific port rather than a whole country?
Yes. Use the port parameter on /disruptions to filter by distance from a port. This is useful for tagging shipments likely to be affected by local severe weather or other natural hazards.
What happens if I’m missing required parameters on /freight-rates?
When required parameters are missing (e.g., origin_zip, destination_zip), the endpoint returns HTTP 200 with "available": false rather than an error. Handle this case explicitly and prompt users or apply a default modeling approach.
Conclusion + CTA
Scope 3 emissions reporting for transportation and distribution is both a data and an engineering challenge. The math is well understood, but the inputs are scattered, inconsistent, and often stale. By consolidating fuel curves, live FTL activity signals, port congestion approximations, carrier validation, and disruption alerts into a single, developer-friendly API, FreightPulse gives you the backbone to build a transparent, testable, and auditable emissions pipeline.
Whether you’re a 3PL building a sustainability layer into your TMS, a shipper harmonizing emissions across multiple divisions, or a supply chain SaaS vendor embedding analytics for your customers, the fastest path from zero to production-grade telemetry is to start with FreightPulse. Pull the signals you need, store the timestamps that anchor your assumptions, and ship a repeatable model your finance and ESG teams can trust.
Ready to turn logistics telemetry into defensible Scope 3 reports? Explore the endpoints, run the examples above, and start wiring your emissions pipeline today. Try FreightPulse for free and move from prototypes to production with one API instead of five.