Purpose
GET /v1/loads is the canonical pull route for partner load synchronization.
The route is designed for incremental polling, deterministic paging, and shipment-scoped tracking visibility.
Recommended Polling Pattern
Recommended flow:- Poll
GET /v1/loadswitheligibleOnly=true. - Use
updatedAfterfor incremental sync windows. - Use
statuses=ASSIGNED,LOADED,IN_TRANSITwhen only actively trackable freight is needed. - Use
include=tracking,customer,carrier,stopsonly when those related objects are required in the same response. - If
nextCursoris present, continue paging withcursor=<nextCursor>. - Stop paging when
nextCursorisnull.
Query Parameters
Supported query parameters:updatedAfterReturns only loads updated on or after the provided Unix timestamp in milliseconds.statusesComma-separated list of load statuses to include.externalIdReturns the load mapped to the partner-facing external identifier.includeComma-separated related objects to embed:customer,carrier,vehicle,stops,tracking.eligibleOnlyWhentrue, returns only loads currently eligible for shipment-scoped tracking visibility.cursorOpaque cursor returned by the previous page.limitPage size from1to100.
Pagination Contract
GET /v1/loads returns:
datanextCursorrequestId
nextCursor as opaque. Do not parse, modify, or persist assumptions about its internal format.
Identifier Behavior
Trailflow uses two identifier types on the load surface:idCanonical Trailflow load identifierexternalIdPartner-facing mapped identifier when one exists
GET /v1/loads/{id} accepts either:
- the canonical Trailflow
id - the mapped partner
externalId
GET /v1/tracking/{loadId} follows the same identifier behavior.
Tracking Eligibility
eligibleForTracking appears on both load and tracking responses.
Trackable statuses:
LOADEDASSIGNEDIN_TRANSIT
eligibleForTracking: falseeligibilityReason: "load_status_not_trackable"
Include Expansion
Useinclude only when the integration needs related records inline.
Supported values:
customercarriervehiclestopstracking
Recommended First Sync
For an initial backfill:- pick the approved start timestamp
- request a bounded page size such as
100 - keep paging with
nextCursor - once paging finishes, store the newest observed
updatedAt - switch to incremental sync using
updatedAfter
Failure Handling
If a partner reports missed or duplicate rows, verify:- the last successful
updatedAftervalue - whether paging continued until
nextCursorbecamenull - whether
statusesoreligibleOnlyfilters excluded the expected rows - whether the partner is mixing canonical
idandexternalIdincorrectly - the affected
requestIdvalues