LTL freight API
Less than truckload. Shared trailer space across real carriers: XPO, ABF, SAIA, Estes, FedEx Freight. Dry freight only. LTL requires 7 fields to produce a firm quote. Freight class is optional because Warp uses FAK rates.
Required fields (7)
- origin_zip -- 5 digit US zip code
- destination_zip -- 5 digit US zip code
- pallets -- number of pallets
- weight_lbs_per_pallet -- weight per pallet in pounds
- commodity -- description of what you're shipping
- length_in, width_in, height_in -- pallet dimensions in inches
- pickup_date -- requested pickup date (YYYY-MM-DD)
Optional fields
- freight_class -- NMFC freight class (50 to 500). Doesn't affect price. Include for BOL documentation if known.
- stackable -- whether pallets can be double stacked
- hazmat -- hazardous materials flag
Why freight class is optional
FAK (Freight All Kinds) rates
Warp negotiates FAK rates with all LTL carriers. FAK means your freight class doesn't affect your price. Traditional LTL carriers price by NMFC class -- if your shipment gets reclassed at the dock, your invoice changes. With FAK rates, that doesn't happen. You pay the quoted price regardless of class.
Include freight_class in your request if you want it on the BOL, but it won't change the rate.
Warp negotiates FAK rates with all LTL carriers. FAK means your freight class doesn't affect your price. Traditional LTL carriers price by NMFC class -- if your shipment gets reclassed at the dock, your invoice changes. With FAK rates, that doesn't happen. You pay the quoted price regardless of class.
Include freight_class in your request if you want it on the BOL, but it won't change the rate.
curl example
curl -X POST https://wearewarp.com/api/v1/ltl/quote \
-H "Authorization: Bearer wk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"origin_zip": "90001",
"destination_zip": "10001",
"pallets": 2,
"weight_lbs_per_pallet": 600,
"commodity": "auto parts",
"length_in": 48,
"width_in": 40,
"height_in": 48,
"pickup_date": "2026-04-14"
}'
# Optional: add "freight_class": "70" for BOL documentation (doesn't affect price)MCP tool call
{
"tool": "warp_ltl_quote",
"args": {
"origin_zip": "90001",
"destination_zip": "10001",
"pallets": 2,
"weight_lbs_per_pallet": 600,
"commodity": "auto parts",
"length_in": 48,
"width_in": 40,
"height_in": 48,
"pickup_date": "2026-04-14"
// Optional: "freight_class": "70" (for BOL, doesn't affect price)
}
}CLI example
warp-agent ltl quote 90001 10001 \
--pallets 2 --weight 600 \
--commodity "auto parts" --length 48 --width 40 --height 48 \
--date 2026-04-14
# Optional: add --class 70 for BOL documentation (doesn't affect price)Understanding quote_tier
quote_tier tells your agent whether the quote is ready to book.
firm -- the quote is firm. You can book it immediately by calling warp_book with the quote_id. missing_for_ship will be an empty array.
indicative -- the price is an estimate. Check the missing_for_ship array for which fields you need to supply before booking. Re-quote with those fields to get a firm tier.
firm -- the quote is firm. You can book it immediately by calling warp_book with the quote_id. missing_for_ship will be an empty array.
indicative -- the price is an estimate. Check the missing_for_ship array for which fields you need to supply before booking. Re-quote with those fields to get a firm tier.
Response: firm
When you provide all 7 required fields (weight, commodity, dims, date, origin, dest, pallets), the quote is firm.
{
"quote_id": "wq_...",
"lane_id": "ln_900_100",
"mode": "ltl",
"price_usd": 485.00,
"currency": "USD",
"transit_days": 7,
"pickup_date": "2026-04-14",
"delivery_date": "2026-04-21",
"expires_at": "2026-04-11T15:30:00Z",
"quote_tier": "firm",
"assumptions": {
"weight_lbs_per_pallet": 600,
"dims_in": { "length": 48, "width": 40, "height": 48 }
},
"missing_for_ship": [],
"booking_url": "https://wearewarp.com/agents/book/wq_...",
"book_tool_call": {
"tool": "warp_book",
"args": { "quote_id": "wq_..." }
}
}Response: indicative
When you omit weight or commodity, the API returns an indicative quote. The missing_for_ship array tells you what to add.
{
"quote_id": "wq_...",
"lane_id": "ln_900_100",
"mode": "ltl",
"price_usd": 520.00,
"currency": "USD",
"transit_days": 7,
"pickup_date": "2026-04-14",
"delivery_date": "2026-04-21",
"expires_at": "2026-04-11T15:30:00Z",
"quote_tier": "indicative",
"assumptions": {
"weight_lbs_per_pallet": 800,
"dims_in": { "length": 48, "width": 40, "height": 48 }
},
"missing_for_ship": ["weight_lbs_per_pallet"],
"booking_url": null,
"book_tool_call": null
}Understanding missing_for_ship
missing_for_ship is an array of field names. If it is empty, the quote is bookable. If it contains entries like
"weight_lbs_per_pallet" or "commodity", re-quote with those fields to get a firm quote_tier.