Introduction
Send Full Truckload (FTL) tracking updates to project44 through the Universal PUSH endpoint:
- Send a Status Event with a Position Update
- Send Just a Position Update
- Send Just a Status Event
- Send a Status Event and a Reefer Temperature with a Position Update
- Update a Carrier ETA or Appointment Window
Each request carries the FTL data under the truckload key. The endpoint validates synchronously and returns 202 Accepted with an ingestion ID before processing the payload asynchronously.
If you send Truckload tracking data to /api/v4/capacityproviders/tl/shipments/statusUpdates today, see Migrating from the Truckload Status-Update Endpoint for a field-by-field and event-by-event mapping.
Best Practices
Keep these in mind as you build your integration:
- Authenticate every request. See Authentication for OAuth2 setup.
- Nest the FTL data under the
truckloadkey. - Provide at least one resolving identifier —
billOfLadingNumberororderNumber— in theidentifiersobject. - If you push for another carrier, name that carrier in the same
identifiersobject withscac,dotNumber, ormcNumber. See Pushing for Another Carrier. - Spell every identifier key exactly as documented. An unrecognized key sent alongside a valid resolving identifier is not rejected — it is accepted with a
202and then ignored, so a misspelled carrier key fails silently. A misspelled resolving key is different: it leaves the request with no resolver and returns400. See Identifier Reference. - To couple an event to a stop, set a stop identifier on
shipmentEvent(stopReferenceId,stopId, orstopNumber). See Stop Coupling. - The
shipmentEventandreadingsslots each carry their owndateTime, so you can report a past event alongside a current sensor reading in one request. - To update a stop's ETA or appointment window, send
stops[]. It can travel on its own or alongsideshipmentEventandreadingsin the same request. See Update a Carrier ETA or Appointment Window. - Timestamps must be ISO 8601 date-times (for example
2026-06-01T08:30:00Z) and not more than 5 minutes in the future. - Sending status events together with position updates is preferred. Sending only position updates is preferred to sending only status events.
Send a Status Event with a Position Update
Requirements
Have the following information:
- A resolving identifier:
billOfLadingNumberororderNumber - The event type. See FTL Event Types.
- The UTC timestamp of the event
- Position coordinates of the update: latitude, longitude
- A carrier identifier (
scac,dotNumber, ormcNumber) — required when you push for another carrier, otherwise omit it - [OPTIONAL] A stop identifier (
stopReferenceId,stopId, orstopNumber) to couple the event to a stop - [OPTIONAL] A reefer temperature reading
Workflow
Complete these steps:
- Call the
POST/services/carrier-push/v1/tracking-updates endpoint. - Enter the shipment update information in the request body. For example,
{ "customerAccountNumber": "1559052698636", "truckload": { "identifiers": { "billOfLadingNumber": "BOL-20260601-001" }, "shipmentEvent": { "type": "ARRIVAL_AT_STOP", "stopNumber": 1, "dateTime": "2026-06-01T08:30:00Z" }, "readings": { "dateTime": "2026-06-01T08:30:05Z", "position": { "latitude": 41.8781, "longitude": -87.6298, "speedUnit": "MILES_PER_HOUR" }, "sensor": { "zones": [ { "id": "ZONE1", "returnAirTemperature": 2.5, "setPoint": 2, "temperatureUnit": "CELSIUS" } ], "fuel": { "type": "DIESEL", "currentLevel": 72, "fuelUnit": "PERCENT_REMAINING" } } } } }
- Submit the request.
Expected Response
The request is successfully submitted and confirmed when a 202 Accepted response is received. The response body contains an ingestion ID:
{ "ingestionId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" }
Include the ingestionId when contacting project44 support about a specific push.
Errors
If there was a problem with your request, you will receive one of the following error codes:
400 Bad Request401 Unauthorized403 Forbidden404 Not Found413 Content Too Large
See Error Response Codes in the Appendix for more information.
Fields & Objects
The table below describes the relevant fields for sending a status event with a position update. See the Appendix for the full identifier, object, and limit reference.
| Field | Description | Notes |
|---|---|---|
customerAccountNumber | The project44 tenant ID of the customer the tracking data is for. | Maximum 128 characters. Optional. |
truckload.identifiers | Resolving identifier keys used to match the shipment. | At least one of billOfLadingNumber or orderNumber. |
truckload.identifiers.scac | The SCAC of the carrier the data is about. | Send at least one of scac, dotNumber or mcNumber when you push for another carrier; otherwise omit all three. Use this one when the carrier has a SCAC. |
truckload.shipmentEvent.type | The event type. | See FTL Event Types. |
truckload.shipmentEvent.dateTime | ISO 8601 date-time of the event. | |
truckload.readings.dateTime | ISO 8601 date-time of the reading. | Independent of shipmentEvent.dateTime. |
truckload.readings.position | Vehicle latitude and longitude in decimal degrees. | |
truckload.readings.sensor.zones | Reefer temperature zones. | Maximum 5 items. |
Send Just a Position Update
Requirements
Have the following information:
- A resolving identifier:
billOfLadingNumberororderNumber - Position coordinates of the update: latitude, longitude
- The UTC timestamp of the reading
- A carrier identifier (
scac,dotNumber, ormcNumber) — required when you push for another carrier, otherwise omit it
Workflow
Complete these steps:
- Prepare a
POSTrequest to /services/carrier-push/v1/tracking-updates. - Enter the position update in the request body. For example,
{ "customerAccountNumber": "1559052698636", "truckload": { "identifiers": { "billOfLadingNumber": "BOL-20260601-002", "scac": "XPPP" }, "readings": { "dateTime": "2026-06-01T10:15:00Z", "position": { "latitude": 41.9022, "longitude": -87.6550 } } } }
scac names the carrier the data is about and is only needed when you push for another carrier; see Pushing for Another Carrier. For the full request schema and descriptions of all fields and objects, see the reference documentation. - Send the request.
Expected Response
The request is successfully submitted and confirmed when a 202 Accepted response with an ingestionId is received.
Errors
If there was a problem with your request, you will receive one of the following error codes:
400 Bad Request401 Unauthorized403 Forbidden404 Not Found413 Content Too Large
See Error Response Codes in the Appendix for more information.
Fields & Objects
| Field | Description | Notes |
|---|---|---|
customerAccountNumber | The project44 tenant ID of the customer the tracking data is for. | Maximum 128 characters. Optional. |
truckload.identifiers.billOfLadingNumber | Bill of lading number used to match the shipment. | |
truckload.identifiers.scac | The SCAC of the carrier the data is about. | Send at least one of scac, dotNumber or mcNumber when you push for another carrier; otherwise omit all three. Use this one when the carrier has a SCAC. |
truckload.readings.dateTime | ISO 8601 date-time of the reading. | |
truckload.readings.position | Vehicle latitude and longitude in decimal degrees. |
Send Just a Status Event
Requirements
Have the following information:
- A resolving identifier:
billOfLadingNumberororderNumber - The event type. See FTL Event Types.
- The UTC timestamp of the event
- A carrier identifier (
scac,dotNumber, ormcNumber) — required when you push for another carrier, otherwise omit it - [OPTIONAL] A stop identifier (
stopReferenceId,stopId, orstopNumber) to couple the event to a stop
Workflow
Complete these steps:
- Prepare a
POSTrequest to /services/carrier-push/v1/tracking-updates. - Enter the status event in the request body. For example,
{ "customerAccountNumber": "1559052698636", "truckload": { "identifiers": { "billOfLadingNumber": "BOL-20260601-003" }, "shipmentEvent": { "type": "DELIVERY", "stopNumber": 2, "dateTime": "2026-06-01T16:45:00Z" } } }
- Send the request.
Expected Response
The request is successfully submitted and confirmed when a 202 Accepted response with an ingestionId is received.
Errors
If there was a problem with your request, you will receive one of the following error codes:
400 Bad Request401 Unauthorized403 Forbidden404 Not Found413 Content Too Large
See Error Response Codes in the Appendix for more information.
Fields & Objects
| Field | Description | Notes |
|---|---|---|
customerAccountNumber | The project44 tenant ID of the customer the tracking data is for. | Maximum 128 characters. Optional. |
truckload.identifiers | Resolving identifier keys used to match the shipment. | At least one of billOfLadingNumber or orderNumber. |
truckload.identifiers.scac | The SCAC of the carrier the data is about. | Send at least one of scac, dotNumber or mcNumber when you push for another carrier; otherwise omit all three. Use this one when the carrier has a SCAC. |
truckload.shipmentEvent.type | The event type. | See FTL Event Types. |
truckload.shipmentEvent.dateTime | ISO 8601 date-time of the event. | |
truckload.shipmentEvent.stopNumber | 1-based stop the event applies to. | Optional. |
Send a Status Event and a Reefer Temperature with a Position Update
Requirements
Have the following information:
- A resolving identifier:
billOfLadingNumberororderNumber - The event type. See FTL Event Types.
- Position coordinates of the update: latitude, longitude
- A reefer temperature reading
- The UTC timestamps of the event and reading
- A carrier identifier (
scac,dotNumber, ormcNumber) — required when you push for another carrier, otherwise omit it - [OPTIONAL] A stop identifier on the event
Workflow
Complete these steps:
- Prepare a
POSTrequest to /services/carrier-push/v1/tracking-updates. - Enter the combined update in the request body. For example,
{ "customerAccountNumber": "1559052698636", "truckload": { "identifiers": { "billOfLadingNumber": "BOL-20260601-004" }, "shipmentEvent": { "type": "DEPARTURE_FROM_STOP", "stopNumber": 1, "dateTime": "2026-06-01T12:05:00Z" }, "readings": { "dateTime": "2026-06-01T12:05:10Z", "position": { "latitude": 41.7508, "longitude": -88.1535, "speed": 55, "heading": 90, "speedUnit": "MILES_PER_HOUR" }, "sensor": { "ignitionStatus": "ON", "reefer": { "state": "ON", "powerSource": "DIESEL", "operatingMode": "CONTINUOUS" }, "ambientTemperature": { "value": 6.5, "unit": "CELSIUS" }, "zones": [ { "id": "ZONE1", "returnAirTemperature": 1.0, "setPoint": 2, "temperatureUnit": "CELSIUS", "doorState": "CLOSED" } ] } } } }
- Send the request.
Expected Response
The request is successfully submitted and confirmed when a 202 Accepted response with an ingestionId is received.
Errors
If there was a problem with your request, you will receive one of the following error codes:
400 Bad Request401 Unauthorized403 Forbidden404 Not Found413 Content Too Large
See Error Response Codes in the Appendix for more information.
Fields & Objects
| Field | Description | Notes |
|---|---|---|
customerAccountNumber | The project44 tenant ID of the customer the tracking data is for. | Maximum 128 characters. Optional. |
truckload.identifiers | Resolving identifier keys used to match the shipment. | At least one of billOfLadingNumber or orderNumber. |
truckload.identifiers.scac | The SCAC of the carrier the data is about. | Send at least one of scac, dotNumber or mcNumber when you push for another carrier; otherwise omit all three. Use this one when the carrier has a SCAC. |
truckload.shipmentEvent.type | The event type. | See FTL Event Types. |
truckload.shipmentEvent.dateTime | ISO 8601 date-time of the event. | |
truckload.readings.dateTime | ISO 8601 date-time of the reading. | Independent of shipmentEvent.dateTime. |
truckload.readings.position | Vehicle latitude and longitude in decimal degrees. | |
truckload.readings.sensor.ambientTemperature | Ambient temperature reading with its value and unit. | |
truckload.readings.sensor.zones | Reefer temperature zones. | Maximum 5 items. |
Update a Carrier ETA or Appointment Window
Use stops[] to update a stop that already exists on the shipment — your estimated arrival, the dock appointment window, or both. project44 never creates, removes or reorders stops from this array.
Requirements
Have the following information:
- A resolving identifier:
billOfLadingNumberororderNumber - A stop identifier for each stop you are updating:
stopNumber(recommended) orstopReferenceId - At least one value to set per stop:
carrierEstimatedArrivalDateTime,carrierAppointmentWindow, or both - A carrier identifier (
scac,dotNumber, ormcNumber) — required when you push for another carrier, otherwise omit it
Workflow
Complete these steps:
- Prepare a
POSTrequest to /services/carrier-push/v1/tracking-updates. - Enter the stop updates in the request body. For example,
{ "customerAccountNumber": "1559052698636", "truckload": { "identifiers": { "orderNumber": "ORD-10025" }, "stops": [ { "stopNumber": 2, "carrierEstimatedArrivalDateTime": "2026-06-01T14:30:00-05:00", "carrierAppointmentWindow": { "startDateTime": "2026-06-01T15:00:00", "endDateTime": "2026-06-01T16:00:00" } } ] } }
carrierEstimatedArrivalDateTime and carrierAppointmentWindow use different time formats on purpose. An ETA is an instant, so carrierEstimatedArrivalDateTime must include a UTC offset or the Z designator. An appointment window is a wall-clock commitment at the dock, so its times are local to the stop and an offset is optional — send the plain wall-clock time. - Send the request.
You can send stops[] on its own, as above, or include it alongside shipmentEvent and readings in the same request.
Expected Response
The request is successfully submitted and confirmed when a 202 Accepted response with an ingestionId is received.
Errors
If there was a problem with your request, you will receive one of the following error codes:
400 Bad Request401 Unauthorized403 Forbidden404 Not Found413 Content Too Large
See Error Response Codes in the Appendix for more information.
Fields & Objects
| Field | Description | Notes |
|---|---|---|
customerAccountNumber | The project44 tenant ID of the customer the tracking data is for. | Maximum 128 characters. Optional. |
truckload.identifiers | Resolving identifier keys used to match the shipment. | At least one of billOfLadingNumber or orderNumber. |
truckload.stops | Updates to stops that already exist on the shipment. | Maximum 100 items. See stops[]. |
truckload.stops[].stopNumber | 1-based position of the stop on the shipment. | The most reliable way to identify a stop. |
truckload.stops[].stopReferenceId | Your reference id for the stop. | Alternative to stopNumber. Maximum 255 characters. |
truckload.stops[].carrierEstimatedArrivalDateTime | Your estimated arrival at the stop. | Must include a UTC offset or Z. |
truckload.stops[].carrierAppointmentWindow | The dock appointment window for the stop. | startDateTime and endDateTime, local to the stop. |