API reference - Public Overview

FreightForge Carrier Data API

REST API for accessing the FreightForge verified carrier dataset. This page covers endpoints, authentication, field schema, webhooks, rate limits, and error codes. Contact FreightForge to request API access.

Base URL api.freightforge.com/v1

Authentication: API key (HMAC-signed)

Response format: JSON

API version v1: current

Overview

What you can build with the FreightForge API

The FreightForge REST API provides programmatic access to a dataset of 200,000+ available pieces of capacity that has been verified against FMCSA records and enriched with location-zone and lane data. It is designed for integration into TMS platforms, 3PL compliance systems, and freight technology products.
The API is versioned, JSON-first, and authenticated with an API key - either a simple bearer token or, for production tiers, an HMAC-signed request. All endpoints are served over HTTPS only.

What this public reference covers

This page documents the public API overview — endpoints, field schema, webhook events, rate limits, and error codes. It is intentionally complete enough for a technical evaluation. Full integration support and credentials are provided through the FreightForge onboarding process.
Authentication

Client credentials

Every request authenticates with an API key issued to your account. The Free tier accepts a simple bearer token. Basic and higher tiers require each request to be HMAC-signed, which protects against replay and tampering. There are no login or token-refresh round-trips - you sign each request directly.
Token requestcopy
GET /v1/carriers/usdot/3506070
Host: api.freightforge.com
 
X-FF-Api-Key: ffk_your_api_key
X-FF-Timestamp: 1733500800
X-FF-Signature: 3a7bd3e2c9f1...
Token response
# string to sign
timestamp + "." + method + "." + route + "." + sha256(body)
 
# route = the path you called
/v1/carriers/usdot/3506070
 
X-FF-Signature = HMAC-SHA256(secret, string)
For bearer authentication (Free tier), pass your key in the Authorization: header:Authorization: Bearer {api_key}.

Signing a request

For HMAC authentication, send three headers with every request: X-FF-Api-Key (your key), X-FF-Timestamp (current Unix time, valid for a 5-minute window) and X-FF-Signature. The signature is HMAC-SHA256 of your API secret over the string timestamp.method.route.sha256(body), where route is the path you called, beginning /v1. Access to specific endpoints and to bulk export is governed by your subscription tier, not by request scopes.
Making requests

Base URL, headers, and response structure

All API requests are made over HTTPS to the base URL below. Every request must be authenticated - a bearer token in the Authorization header on the Free tier or an HMAC signature on Basic and above.

Base URL

https://api.freightforge.com/v1 — prefix all endpoint paths with this URL. The version segment is included in every path. Prior versions remain available for a minimum of 12 months after a new version is released.

Required headers

X-FF-Api-KeyHMAC
Your API key. Required on HMAC-authenticated requests.
X-FF-TimestampHMAC
Current Unix timestamp. Requests must arrive within a 5-minute window.
X-FF-SignatureHMAC
HMAC-SHA256 signature of the request. See Authentication.
AuthorizationFree tier
Format: Bearer {api_key}. Simple bearer auth, Free tier only.
Content-TypePOST only
Must be application/json for POST request bodies.

Minimal working request

curl examplecopy
curl -X GET
  https://api.freightforge.com/v1/carriers/usdot/3506070
  -H "Authorization: Bearer ffk_your_api_key"
200 OK — response envelope
{
  ; "data": { /* carrier object */ }
}
 
// X-Request-ID and X-RateLimit-* are returned as response headers

Pagination

List endpoints return paginated results. Use page and per_page query parameters to navigate.
Paginated response envelope
{
  ; "data": [ /* array of carrier objects */ ],
  "meta": {
    "total": 4820,
    "page": 1, "per_page": 25, "total_pages": 193,
    "has_more": true,
    "filters": { /* echo of applied filters */ }
  }
}
pageinteger
Page to retrieve. Starts at 1. Default: 1.
per_pageinteger
Results per page. Default: 25. Max: 100.
has_moreresponse
Boolean in meta. True when more pages remain — use it to detect end of results.
Errors

HTTP status codes and error format

All errors return a JSON body with a machine-readable code and a human-readable message. The code field is stable across API versions; message is for debugging only and may change.
Error response format
{
  ; "code": "not_found",
  "message": "Carrier not found with USDOT: 9999999"
}
400invalid_payloadMalformed request body or a missing/invalid parameter. The message field names the problem.
401unauthorizedMissing or invalid API key or HMAC signature, or a timestamp outside the 5-minute window.
403tier_access_deniedThis endpoint is not available on your subscription tier, or the carrier is outside your permitted source.
404not_foundNo carrier in the FreightForge dataset matches the provided USDOT or MC number.
429rate_limit_exceededRate limit exceeded. The Retry-After response header gives the seconds to wait before retrying.
Rate limits

Per-plan request limits

Rate limits are enforced per API key, per hour and per day - not per minute.Every response carries X-RateLimit-Limit-Hour, -Remaining-Hour, -Limit-Day, Remaining-Day and -Reset headers. The Free evaluation tier allows 100 requests/hour. Bulk lookup requests count as 1 request regardless of batch size."
Basic
1,000 / hr
10,000 / day
Professional
5,000 / hr
50,000 / day
Enterprise
25,000 / hr
250,000 / day

Bulk lookup rate weighting

A single POST /v1/carriers/lookup request with 100 identifiers counts as 1 request against your rate limit, not 100. This makes batch operations significantly more efficient than individual lookups for database audits and bulk verification workflows.
Endpoints

Carrier data endpoints

GET
/v1/carriers/usdot/{usdot_number}
Returns a single verified carrier profile by USDOT number, including all available fields - authority status, insurance, safety rating, equipment, power units, headquarters and lane zones, and verification metadata. A companion lookup by internal ID is available at /v1/carriers/{id}.
Path parameter
usdot_numberrequiredThe carrier's USDOT number. Returns all available fields; there is no field-subset parameter on reads.
GET
/v1/carriers
Paginated, compliance-gated list of carriers with rich filtering — by location, fleet size, equipment, proximity, and zone. Every carrier is returned with its full field set. Results are ordered by most recently updated, or nearest-first when a proximity radius is supplied.
Query parameters
searchstringCompany name, USDOT, or MC number.
state, countrystringState/province (e.g. TX) and country.
min_power_units, max_power_unitsintegerFleet size range.
equipmentstringComma-separated equipment tokens (van, reefer, flatbed, and more). Add equipment_match_all=1 to require all.
lat, lng, radiusnumberProximity search in miles. Returns distance_miles, nearest first.
zonestringHeadquarters zone (zone_0 through zone_9, canada_zone_western/central/eastern).
origin_zone, destination_zonestringCarriers running a lane from or to a zone. Both together match one origin-to-destination lane.
modified_sincedatetimeOnly carriers modified after this timestamp.
page, per_pageintegerPagination. per_page max 100, default 25.
POST
/v1/carriers/lookup
Batch carrier lookup. Submit up to 100 USDOT or MC numbers in a single request. Prefix MC numbers with MC-; a bare number is treated as a USDOT. Returns a verified profile or a structured error for each input, in the same order as the input array. Ideal for auditing an existing carrier database.
Body
identifiersrequiredarrayMC or DOT strings. Max 100.
id_typestringmc | dot | auto. Default auto.
fieldsstringComma-separated subset.
POST
/v1/export
Triggers an asynchronous bulk export of filtered carrier data. Returns an export_id immediately; poll GET /v1/export/{export_id} for status and download the file when complete. The request body accepts the same filters as GET /v1/carriers, plus an optional fields array to select specific columns. Available on Professional and above.
Body
filtersobjectSame keys as GET /v1/carriers
formatstringjson | csv. Default json.
fieldsstringComma-separated subset.
callback_urlstringWebhook URL when ready. Optional.
Data reference

Carrier object — selected fields

The carrier object contains up to 143 fields. Only fields that have a value are returned, so the exact set varies by carrier - a typical carrier returns around 90. Nineteen core identity and status fields are present on every carrier. A selection of key fields is documented below; contact the FreightForge team for the complete field reference.
FMCSA auto-populated
System-generated
Carrier-submitted
FieldTypeSourceDescription
usdot_numberstringFMCSAUSDOT number
mc_numberstringFMCSAMC / docket number
carrier_legal_namestringFMCSALegal business name
usdot_statusstringFMCSAActive or Inactive
allowed_to_operatestringFMCSAYes or No
state_province, citystringCarrierPhysical location
company_location_zonestringSystemHeadquarters zone
number_of_power_unitsintegerCarrierFleet size
equipmentarrayCarrierEquipment tokens
origin_zones, destination_zonesarraySystemLane zones served
safety_ratingstringFMCSAe.g. Satisfactory
number_of_oos_eventsintegerFMCSAOut-of-service events
liability_amount, cargo_amountstringFMCSAInsurance on file
insurance_company_namestringFMCSAInsurer
CSA BASIC scoresobjectFMCSAPercentile scores across 7 BASIC safety categories
Full field reference

The complete reference — all 143 fields with types and value notes — is available on request.

Contact the FreightForge team for the full field reference and integration support during onboarding.
Data reference

Zone schema

The origin_zones and destination_zones fields return arrays of zone tokens. Zones are also accepted as filters on GET /v1/carriers: zone filters by the carrier's headquarters zone, while origin_zone and destination_zone filter by the lanes a carrier runs. The 13 zones below are the complete set of valid tokens; an unrecognized token is ignored.

zone_0

Zone 0

CT, MA, ME, NH, NJ, RI, VT

zone_1

Zone 1

DC, DE, NY, PA

zone_2

Zone 2

MD, NC, SC, VA, WV

zone_3

Zone 3

AL, FL, GA, MS, TN

zone_4

Zone 4

IN, KY, MI, OH

zone_5

Zone 5

IA, MN, MT, ND, SD, WI

zone_6

Zone 6

IL, KS, MO, NE

zone_7

Zone 7

AR, LA, OK, TX

zone_8

Zone 8

AZ, CO, ID, NM, NV, UT, WY

zone_9

Zone 9

AK, CA, OR, WA

canada_zone_central

Canada - Zone Central

ON, QC

canada_zone_eastern

Canada - Zone Eastern

NB, NL, NS, PE

canada_zone_western

Canada - Zone Western

AB, BC, MB, SK

Multiple zones per carrier

A carrier can serve multiple origin and destination zones. zone=zone_5 matches carriers headquartered in Zone 5. origin_zone=zone_5 matches any carrier running a lane originating in Zone 5, and destination_zone=zone_7 any carrier with a lane ending in Zone 7. Supplying both matches a single origin-to-destination lane.
Data reference

Equipment type

The equipment field returns an array of equipment tokens. These same tokens are accepted as filter values on GET /v1/carriers?equipment={token}. The table below lists all valid tokens.
ValueLabelDescription
vanVanStandard dry van trailer
reeferReeferRefrigerated trailer
flatbedFlatbedOpen flatbed trailer
cargoCargoEnclosed cargo van
straight_truckStraight TruckSingle-unit box truck
box_truckBox TruckBox / cube truck
hotshotHotshotHotshot / expedited
power_onlyPower OnlyTractor without trailer
sprinterSprinterSprinter van
rgn_trailerRGN TrailerRemovable gooseneck
specialized_trailerSpecialized TrailerSpecialized / oversize
lowboy_trailerLowboy TrailerLowboy / heavy haul
stepdeck_trailerStep Deck TrailerStep deck / drop deck
hopperHopperHopper bottom
car_haulerCar HaulerAuto transport

Multiple equipment types per carrier

Carriers can list multiple equipment types. Filtering with GET /v1/carriers?equipment=reefer returns any carrier whose equipment array contains reefer. To filter by multiple types, pass a comma-separated list: equipment=van,reefer returns carriers running either type. Add equipment_match_all=1 to require all listed types instead.
Webhooks

Event types and payload format

Subscribe to carrier profile change events by registering a webhook endpoint. FreightForge delivers an HTTP POST to your endpoint shortly after a qualifying event. Delivery is at-least-once — your endpoint must be idempotent.

Event types

Available events
carrier.createdA new carrier is added to the directory
carrier.updatedA carrier profile data field changes
carrier.status_changedA carrier authority or operating status changes
carrier.insurance_changedA carrier insurance on file changes

Example payload

carrier.status_changed
{
  "event": "carrier.status_changed",
  "timestamp": "2026-06-25T14:22:00Z",
  "data": {
    "usdot_number": "3506070",
    "usdot_status": "Inactive"
  }
}

Retry behavior

If your endpoint returns a non-2xx response or times out, FreightForge retries with backoff: 1 min, 5 min, 15 min, 1 hr, 4 hr. After 5 failed attempts the event is marked undelivered.