RXO API: Truckload and LTL Quotes, Orders, Tracking and Documents

RXO (formerly XPO's truck brokerage) publishes the RXO Connect APIs, and the rxo carrier talks to them. RXO is a broker: a quote lists the carriers RXO can tender your load to, each with its price and transit time, and an order books the load with RXO, which then manages the carrier. Truckload (TL) and LTL are both supported.

Credentials#

RXO issues five values through [email protected]:

Parameter RXO value
key Your RXO API key, sent in the x-api-key header
client_id OAuth client id
client_secret OAuth client secret
scope OAuth scope
partner_code Your partner identifier code (partnerIdentifierCode), such as 2-1-ABCDEFGH

The same values can come from the environment as RS_RXO_KEY, RS_RXO_CLIENT_ID, RS_RXO_CLIENT_SECRET, RS_RXO_SCOPE and RS_RXO_PARTNER_CODE.

RocketShipIt exchanges the client credentials for a token that lives two hours. RXO asks callers not to request a token more than once in that time and may rate limit the token endpoint, so RocketShipIt keeps the token and reuses it for later requests with the same credentials. If RXO rejects a kept token, RocketShipIt fetches a new one and retries the call once. The authenticate action always fetches a new token and returns it in data.access_token. The client secret, the API key and the token are redacted from meta.debug_information.

{
  "carrier": "RXO",
  "action": "authenticate",
  "params": {
    "key": "YOUR_RXO_API_KEY",
    "client_id": "YOUR_RXO_CLIENT_ID",
    "client_secret": "YOUR_RXO_CLIENT_SECRET",
    "scope": "YOUR_RXO_SCOPE"
  }
}

Test and production#

Requests go to api-rxoconnect.rxo.com, which allows 5 calls per second. "test": true sends them to RXO's UAT gateway api-uat-rxoconnect.rxo.com, which allows 1 call per second and 2,500 calls per day. RXO's older developer portal names api-main-rxoconnect.rxo.com as the test host; to use it, set "endpoint": "https://api-main-rxoconnect.rxo.com". Ask RXO whether your test and production credentials differ.

Supported actions#

Action RXO endpoint
authenticate POST /oAuthAPI/rest/v1/token
getallrates POST /quoteAPI/rest/v1/Create
submitshipment POST /quoteAPI/rest/v1/ConvertToOrder with rate_id, else POST /orderAPI/rest/v1/Order
track GET /eventAPI/rest/v1/OrderStatus
voidshipment POST /orderAPI/rest/v1/CancelOrder
gettrackingdocuments POST /documentAPI/rest/v1/OrderDocuments, then GET /documentAPI/rest/v1/Document for any document listed without content

Describing the freight#

  • service is the transportation mode: LTL (the default) or TL. FTL and truckload also mean TL. A quote can ask for both modes ("LTL,TL"); an order uses the first.
  • equipment_category and equipment_type are RXO's equipment codes. The default is a dry van, VN and V. Use RF and R for a reefer or FB and F for a flatbed. RXO's list includes V53, R53, F48, SD, CONE and many more; values pass through as given.
  • Each package is one handling unit. packaging_type is the handling unit (PALLET by default), pieces the number of units on it and sub_packaging_type their packaging. Common names such as PALLET, SKID, BOX, CARTON, CRATE and DRUM are converted to RXO's codes (PLTS, SKID, BOXES, CTN, CRTS, DRUM); RXO's own codes pass through.
  • Weights go out in whole pounds and dimensions in inches. Kilograms and centimeters in weight_unit and length_unit are converted.
  • freight_class is the NMFC class. A package's insured_value is the declared value of its goods.
  • A package hazmat block with a chemical record sends the UN number, class, packing group, proper shipping name and emergency phone, and adds the HZM accessorial.
  • The pickup stop is the ship_* address on ship_date, between ready_time and close_time. The window is 08:00 to 17:00 when they are blank. RXO asks for LTL pickups and deliveries inside business hours (8am to 5pm). The delivery stop is the to_* address.
  • reference_code / reference_value (and the 2 and 3 pairs) become reference numbers. RXO takes EDI qualifiers such as PO, BM and SI; a blank code is sent as CR. Each package's po_number is sent as a PO reference.

Accessorials#

accessorials and addons take RXO's accessorial codes and are sent as additional services. lift_gate_required adds LFD, residential adds RSD and a hazmat package adds HZM. Other carriers' common codes are translated:

RXO code Meaning Also accepted
LFD Liftgate delivery LGATE, LFTD, HYD, liftgate_delivery
LFP Liftgate pickup LGATEP, LFTP, HYO, liftgate_pickup
RSD Residential delivery RES, HD, RDC, residential_delivery
RSP Residential pickup REP, HPU, RPC, residential_pickup
HZM Hazardous material HAZ, hazmat

Ask RXO for the full list of codes your account can use.

Rates#

{
  "carrier": "RXO",
  "action": "getallrates",
  "params": {
    "key": "YOUR_RXO_API_KEY",
    "client_id": "YOUR_RXO_CLIENT_ID",
    "client_secret": "YOUR_RXO_CLIENT_SECRET",
    "scope": "YOUR_RXO_SCOPE",
    "partner_code": "YOUR_RXO_PARTNER_CODE",
    "service": "LTL",
    "shipper": "RocketShipIt",
    "ship_contact": "John Doe",
    "ship_phone": "8705551234",
    "ship_email": "[email protected]",
    "ship_addr1": "1202 Chalet Ln",
    "ship_city": "Harrison",
    "ship_state": "AR",
    "ship_code": "72601",
    "ship_country": "US",
    "to_company": "ABC Widget Co",
    "to_addr1": "1234 Main St",
    "to_city": "Akron",
    "to_state": "OH",
    "to_code": "44333",
    "to_country": "US",
    "ship_date": "2026-12-15",
    "weight_unit": "LB",
    "length_unit": "IN",
    "accessorials": ["LFD"],
    "packages": [
      { "weight": 500, "length": 48, "width": 40, "height": 36, "freight_class": "70", "packaging_type": "PALLET", "pieces": 4, "sub_packaging_type": "BOX", "insured_value": 1500, "description": "machine parts" }
    ]
  }
}

RXO requires a contact for the quote: ship_contact (or shipper), ship_email and ship_phone. One rate comes back for each quote RXO returns:

  • service_code - the mode, LTL or TL.
  • carrier_name and carrier_code - the carrier RXO would tender the load to and its SCAC. desc combines them ("RXO LTL Saia Motor Freight").
  • rate - RXO's total cost, accessorials included, in currency.
  • rate_detail - the line haul (LNH), the fuel surcharge (FSF) and each accessorial by its code.
  • est_delivery_days - RXO's estimated transit days.
  • guaranteed - true on RXO's lowest guaranteed quote and on carriers whose name says guaranteed.
  • rate_id - RXO's quote id. Pass it back as rate_id on submitshipment to book that quote.

RXO's master quote id for the whole set comes back as a Note in errors.

Booking a shipment#

submitshipment books the load as an RXO order in one of two ways:

  • With rate_id from getallrates, RocketShipIt converts that quote to an order.
  • Without rate_id, RocketShipIt creates an order that RXO prices on your contract rates. Use this when you have contract rates on file with RXO.

Send the same addresses, service, equipment and packages you quoted with. special_instructions becomes an order note. billing sets the payment method: prepaid (PPD) by default, COL when a transportation billing entry has payment_type recipient, and THIRDPARTY for third_party or bill_third_party.

The response carries:

  • shipment_id - RXO's order id. track, voidshipment and gettrackingdocuments take it back as shipment_id.
  • tracking_number - the BOL number.
  • packages[].alternative_tracking_ids - the order id, the PRO number when RXO has assigned one, and the order number when RXO returns it.
  • charges - the price RXO booked the order at, when RXO returns it.

RXO returns no label with the order. Fetch the BOL and shipping labels with gettrackingdocuments once RXO has generated them.

Tracking#

track takes the BOL number in tracking_number. Set reference_type to look up another reference instead:

reference_type Looks up
(blank) BOL number
pro PRO number
order RXO order id
shipment RXO shipment id
gtn Global tracking number
po Customer order number
container Container number

With only shipment_id, the order id is tracked. Events are returned in activity, newest first, with RXO's event code in status_code, its event name (ARRIVED_AT_PICKUP, IN_TRANSIT, ...) in status_description and a grouped status_type (PRE_TRANSIT, APPOINTMENT, PICKUP, IN_TRANSIT, DELIVERED, EXCEPTION, CANCELLED). estimated_delivery is RXO's latest estimated arrival, and the carrier moving the load is in service.

Cancelling#

voidshipment sends a cancel request for the order in shipment_id. RXO logs the request and notifies its sales team, so a load that is already dispatched may not cancel. RXO's message is returned in status.

Documents#

gettrackingdocuments fetches the documents for the order in shipment_id (or for an RXO shipment id in tracking_number with reference_type shipment), content included. document_type narrows the list, comma separated: RXO lists BOL and SPL (shipping label) for LTL, and also POD and CSNV for TL. Set service to TL for a truckload order. Each document comes back with its type as code, its MIME type and the base64 content, plus RXO's document id, file name and upload time as metadata. When RXO lists a document without its content, RocketShipIt downloads it by id in a second call; a document that fails to download is reported in errors and still listed, with no content.

Errors#

RXO rejects a request with a status code, a message and a context list: {"statusCode": "400", "message": "Bad Request", "context": [{"Key": "api-error", "value": "No rates found for the requested load!"}]}. Each context entry becomes an error with the key as its code. A refused token request is reported in errors as "RXO authentication failed: ...".