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#
serviceis the transportation mode:LTL(the default) orTL.FTLandtruckloadalso meanTL. A quote can ask for both modes ("LTL,TL"); an order uses the first.equipment_categoryandequipment_typeare RXO's equipment codes. The default is a dry van,VNandV. UseRFandRfor a reefer orFBandFfor a flatbed. RXO's list includesV53,R53,F48,SD,CONEand many more; values pass through as given.- Each package is one handling unit.
packaging_typeis the handling unit (PALLETby default),piecesthe number of units on it andsub_packaging_typetheir packaging. Common names such asPALLET,SKID,BOX,CARTON,CRATEandDRUMare 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_unitandlength_unitare converted. freight_classis the NMFC class. A package'sinsured_valueis the declared value of its goods.- A package
hazmatblock with a chemical record sends the UN number, class, packing group, proper shipping name and emergency phone, and adds theHZMaccessorial. - The pickup stop is the
ship_*address onship_date, betweenready_timeandclose_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 theto_*address. reference_code/reference_value(and the2and3pairs) become reference numbers. RXO takes EDI qualifiers such asPO,BMandSI; a blank code is sent asCR. Each package'spo_numberis sent as aPOreference.
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,LTLorTL.carrier_nameandcarrier_code- the carrier RXO would tender the load to and its SCAC.desccombines them ("RXO LTL Saia Motor Freight").rate- RXO's total cost, accessorials included, incurrency.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-trueon RXO's lowest guaranteed quote and on carriers whose name says guaranteed.rate_id- RXO's quote id. Pass it back asrate_idonsubmitshipmentto 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_idfromgetallrates, 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,voidshipmentandgettrackingdocumentstake it back asshipment_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: ...".