Last updated

Introduction

Beta. The Universal PUSH endpoint is in active development; documentation and behavior are subject to change before general availability.

Send Full Truckload (FTL) tracking updates to project44 through the Universal PUSH endpoint:

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 truckload key.
  • Provide at least one resolving identifier — billOfLadingNumber or orderNumber — in the identifiers object.
  • If you push for another carrier, name that carrier in the same identifiers object with scac, dotNumber, or mcNumber. 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 202 and then ignored, so a misspelled carrier key fails silently. A misspelled resolving key is different: it leaves the request with no resolver and returns 400. See Identifier Reference.
  • To couple an event to a stop, set a stop identifier on shipmentEvent (stopReferenceId, stopId, or stopNumber). See Stop Coupling.
  • The shipmentEvent and readings slots each carry their own dateTime, 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 alongside shipmentEvent and readings in 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: billOfLadingNumber or orderNumber
  • 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, or mcNumber) — required when you push for another carrier, otherwise omit it
  • [OPTIONAL] A stop identifier (stopReferenceId, stopId, or stopNumber) to couple the event to a stop
  • [OPTIONAL] A reefer temperature reading

Workflow

Complete these steps:

  1. Call the POST /services/carrier-push/v1/tracking-updates endpoint.
  2. Enter the shipment update information in the request body. For example,
JSON
{
  "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"
        }
      }
    }
  }
}

This is an example of a potential request. For the full request schema and descriptions of all fields and objects, see the reference documentation.

  1. 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:

JSON
{
  "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 Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 413 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.

FieldDescriptionNotes
customerAccountNumberThe project44 tenant ID of the customer the tracking data is for.Maximum 128 characters. Optional.
truckload.identifiersResolving identifier keys used to match the shipment.At least one of billOfLadingNumber or orderNumber.
truckload.identifiers.scacThe 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.typeThe event type.See FTL Event Types.
truckload.shipmentEvent.dateTimeISO 8601 date-time of the event.
truckload.readings.dateTimeISO 8601 date-time of the reading.Independent of shipmentEvent.dateTime.
truckload.readings.positionVehicle latitude and longitude in decimal degrees.
truckload.readings.sensor.zonesReefer temperature zones.Maximum 5 items.

Send Just a Position Update

Requirements

Have the following information:

  • A resolving identifier: billOfLadingNumber or orderNumber
  • Position coordinates of the update: latitude, longitude
  • The UTC timestamp of the reading
  • A carrier identifier (scac, dotNumber, or mcNumber) — required when you push for another carrier, otherwise omit it

Workflow

Complete these steps:

  1. Prepare a POST request to /services/carrier-push/v1/tracking-updates.
  2. Enter the position update in the request body. For example,
JSON
{
  "customerAccountNumber": "1559052698636",
  "truckload": {
    "identifiers": {
      "billOfLadingNumber": "BOL-20260601-002",
      "scac": "XPPP"
    },
    "readings": {
      "dateTime": "2026-06-01T10:15:00Z",
      "position": {
        "latitude": 41.9022,
        "longitude": -87.6550
      }
    }
  }
}

This is an example of a potential request. 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.

  1. 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 Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 413 Content Too Large

See Error Response Codes in the Appendix for more information.

Fields & Objects

FieldDescriptionNotes
customerAccountNumberThe project44 tenant ID of the customer the tracking data is for.Maximum 128 characters. Optional.
truckload.identifiers.billOfLadingNumberBill of lading number used to match the shipment.
truckload.identifiers.scacThe 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.dateTimeISO 8601 date-time of the reading.
truckload.readings.positionVehicle latitude and longitude in decimal degrees.

Send Just a Status Event

Requirements

Have the following information:

  • A resolving identifier: billOfLadingNumber or orderNumber
  • The event type. See FTL Event Types.
  • The UTC timestamp of the event
  • A carrier identifier (scac, dotNumber, or mcNumber) — required when you push for another carrier, otherwise omit it
  • [OPTIONAL] A stop identifier (stopReferenceId, stopId, or stopNumber) to couple the event to a stop

Workflow

Complete these steps:

  1. Prepare a POST request to /services/carrier-push/v1/tracking-updates.
  2. Enter the status event in the request body. For example,
JSON
{
  "customerAccountNumber": "1559052698636",
  "truckload": {
    "identifiers": {
      "billOfLadingNumber": "BOL-20260601-003"
    },
    "shipmentEvent": {
      "type": "DELIVERY",
      "stopNumber": 2,
      "dateTime": "2026-06-01T16:45:00Z"
    }
  }
}

This is an example of a potential request. For the full request schema and descriptions of all fields and objects, see the reference documentation.

  1. 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 Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 413 Content Too Large

See Error Response Codes in the Appendix for more information.

Fields & Objects

FieldDescriptionNotes
customerAccountNumberThe project44 tenant ID of the customer the tracking data is for.Maximum 128 characters. Optional.
truckload.identifiersResolving identifier keys used to match the shipment.At least one of billOfLadingNumber or orderNumber.
truckload.identifiers.scacThe 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.typeThe event type.See FTL Event Types.
truckload.shipmentEvent.dateTimeISO 8601 date-time of the event.
truckload.shipmentEvent.stopNumber1-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: billOfLadingNumber or orderNumber
  • 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, or mcNumber) — required when you push for another carrier, otherwise omit it
  • [OPTIONAL] A stop identifier on the event

Workflow

Complete these steps:

  1. Prepare a POST request to /services/carrier-push/v1/tracking-updates.
  2. Enter the combined update in the request body. For example,
JSON
{
  "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"
          }
        ]
      }
    }
  }
}

This is an example of a potential request. For the full request schema and descriptions of all fields and objects, see the reference documentation.

  1. 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 Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 413 Content Too Large

See Error Response Codes in the Appendix for more information.

Fields & Objects

FieldDescriptionNotes
customerAccountNumberThe project44 tenant ID of the customer the tracking data is for.Maximum 128 characters. Optional.
truckload.identifiersResolving identifier keys used to match the shipment.At least one of billOfLadingNumber or orderNumber.
truckload.identifiers.scacThe 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.typeThe event type.See FTL Event Types.
truckload.shipmentEvent.dateTimeISO 8601 date-time of the event.
truckload.readings.dateTimeISO 8601 date-time of the reading.Independent of shipmentEvent.dateTime.
truckload.readings.positionVehicle latitude and longitude in decimal degrees.
truckload.readings.sensor.ambientTemperatureAmbient temperature reading with its value and unit.
truckload.readings.sensor.zonesReefer 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: billOfLadingNumber or orderNumber
  • A stop identifier for each stop you are updating: stopNumber (recommended) or stopReferenceId
  • At least one value to set per stop: carrierEstimatedArrivalDateTime, carrierAppointmentWindow, or both
  • A carrier identifier (scac, dotNumber, or mcNumber) — required when you push for another carrier, otherwise omit it

Workflow

Complete these steps:

  1. Prepare a POST request to /services/carrier-push/v1/tracking-updates.
  2. Enter the stop updates in the request body. For example,
JSON
{
  "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.

  1. 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 Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 413 Content Too Large

See Error Response Codes in the Appendix for more information.

Fields & Objects

FieldDescriptionNotes
customerAccountNumberThe project44 tenant ID of the customer the tracking data is for.Maximum 128 characters. Optional.
truckload.identifiersResolving identifier keys used to match the shipment.At least one of billOfLadingNumber or orderNumber.
truckload.stopsUpdates to stops that already exist on the shipment.Maximum 100 items. See stops[].
truckload.stops[].stopNumber1-based position of the stop on the shipment.The most reliable way to identify a stop.
truckload.stops[].stopReferenceIdYour reference id for the stop.Alternative to stopNumber. Maximum 255 characters.
truckload.stops[].carrierEstimatedArrivalDateTimeYour estimated arrival at the stop.Must include a UTC offset or Z.
truckload.stops[].carrierAppointmentWindowThe dock appointment window for the stop.startDateTime and endDateTime, local to the stop.

The carrier appointment window is displayed separately from the customer appointment window and does not override it. Both remain visible.