---
title: "Get quote for your shipment"
method: POST
path: "/freights/quote"
tags: ["Freight"]
---

# Get quote for your shipment

`POST /freights/quote`

## Request

- Base URL: `https://stg.wearewarp.com/api/v1`
- URL: `https://stg.wearewarp.com/api/v1/freights/quote`
- Auth: API key in header `apikey`

Returns the **single cheapest rate** for the shipment. To compare every available option (carriers, service levels, parcel services) use POST /freights/freight-quote instead.

**Rate limit:** this endpoint counts towards the quoting rate limit of your API key (per UTC hour and per UTC day). Above the limit the API answers **429** `rate_limit_exceeded` and the `Retry-After` header tells how many seconds remain until the window resets.

**Request parameters**

| Name                       | Type                                | Required/Optional | Description                                                                                                            |
|----------------------------|-------------------------------------|-------------------|------------------------------------------------------------------------------------------------------------------------|
| pickupDate                 | String                              | Required          | The earliest date when a carrier can pickup the shipment, in **YYYY-MM-DD** format. Date is in the timezone of the pickup stop. |
| pickupInfo                 | Object                              | Required          | The details of the pick up stop.                                                                                       |
| pickupInfo.zipcode         | String                              | Required          | The postal code of the pick up stop. The pick up stop is where the shipment will be picked up.                         |
| pickupInfo.country         | String                              | Optional          | The country code (ISO 3166-1 alpha-2) of the pick up stop. Supported: "US", "CA". Defaults to "US" if not provided.   |
| deliveryInfo               | Object                              | Required          | The details of the delivery stop.                                                                                      |
| deliveryInfo.zipcode       | String                              | Required          | The postal code of the delivery stop. The delivery stop is where the shipment will be delivered.                       |
| deliveryInfo.country       | String                              | Optional          | The country code (ISO 3166-1 alpha-2) of the delivery stop. Supported: "US", "CA". Defaults to "US" if not provided.  |
| pickupServices             | Array<**PickupService**>            | Optional          | Any pickup services required to service the shipment in the pickup location.                                           |
| deliveryServices           | Array<**DeliveryService**>          | Optional          | Any delivery services required to service the shipment in the delivery location.                                       |
| additionalServices         | Array<**AdditionalService**>        | Optional          | Any additional services required to service the shipment.                                                              |
| listItems                  | Array<**Item**>                     | Required          | The list of commodities being shipped.                                                                                 |
| shipmentType               | String ("LTL", "FTL" or "PARCEL")   | Optional          | The type of shipment. Defaults to "LTL" when not provided. PARCEL returns a single FedEx rate (use POST /freights/freight-quote to compare every parcel service level); for PARCEL the items may be sent as `listItems[]` (or `items[]`) and each package must respect the FedEx limits (see **PARCEL limits** below). |
| vehicleType                | VehicleType                         | Optional          | The vehicle. If not provided, the system will automatically select the best vehicle based on the items. Ignored for PARCEL. |
| insuranceInfo              | Object                              | Optional          | Provide to receive an insurance quote alongside the freight quote. If either field below is missing or invalid, the insurance block is silently skipped and the freight quote is still returned. |
| insuranceInfo.commodity    | String                              | Required when insuranceInfo is provided | A description of the commodity being shipped.                                                            |
| insuranceInfo.insuredValue | Number                              | Required when insuranceInfo is provided | The declared value of the goods to be insured (in USD).                                                  |


<br /> 
**Item** schema:

| Name                  | Type            | Required/Optional | Description                                                                           |
|-----------------------|-----------------|-------------------|---------------------------------------------------------------------------------------|
| name                  | String          | Optional          | The name of the shipment item.                                                        |
| height                | Number          | Required          | The height of the shipment item.                                                      |
| length                | Number          | Required          | The length of the shipment item.                                                      |
| width                 | Number          | Required          | The width of the shipment item.                                                       |
| sizeUnit              | String          | Required          | The unit for the length, height, width. One of "IN" (inches) or "FT" (feets).         |
| quantity              | Number          | Required          | The quantity of this particular shipment item.                                        |
| totalWeight           | Number          | Required          | Total weight of all packages composing this line item                                                |
| weightUnit            | String          | Required          | The unit for the weight. One of "lbs" (pounds) or "kgs" (kilograms).                  |
| packaging             | String          | Optional          | Packaging unit of the line item (e.g. "Pallet"). Defaults to "Pallet".               |
| temperature_limit     | Object          | Optional          | **Do not send.** Temperature-controlled (reefer) freight is not supported yet: any non-zero min/max is rejected with 400 `Reefer Shipment is not supported yet!`. |
| temperature_limit.min | Number          | Optional          | The minimum temperature, if applicable (see above).                                   |
| temperature_limit.max | Number          | Optional          | The maximum temperature, if applicable (see above).                                   |
| stackable             | Boolean         | Optional          | stackable = True if the shipment item can be stacked on the trailer, False otherwise. |
| notes                 | String          | Optional          | any notes.                                                                            |
| freightClass          | String          | Optional          | NMFC freight class of the line item (e.g. "70").                                      |
| barcodes              | Array<*String*> | Optional          | The barcodes of the shipment items.                                                   |

<br /> 
**PARCEL limits** (checked per package, after converting to inches and pounds): weight per package (`totalWeight` / `quantity`) <= 150 lbs, longest side <= 108 in, length + girth (longest side + 2 x (the other two sides)) <= 165 in. Length, width, height, weight and quantity must all be greater than 0, otherwise the request is rejected with 400 `invalid_field_data`.

<br /> 
**Response notes**

- `quote_id` is the value to pass as `quoteId` to POST /freights/booking, before `expiration_time_utc` (epoch seconds). The booking payload must match this request exactly (zipcodes, every item's dimensions/weight/quantity, and the service lists), otherwise the booking is rejected. For PARCEL quotes send the items in `IN` and `lbs` on both the quote and the booking: the quote stores parcel items converted to inches/pounds and the booking compares the raw values.
- `transit_time` is in **days**. `transit_time_without_team` (days, nullable) is the transit time when the load is driven by a single driver instead of a team.
- `shipmentType` echoes the type that was priced: LTL, FTL or PARCEL.
- `charges`: the TOTAL row equals `price.amount`; each SERVICE_OPTION row (the `code` may also be the carrier-specific accessorial code) is an accessorial and the TRANSIT row is the base freight, so the non-TOTAL rows sum to the TOTAL row.
- `insurance` is only present when `insuranceInfo` was sent. When the insurance quote fails the block is `{ "insuranceQuoteId": null, "errorMessage": "..." }` and the freight quote is still returned.

## Request body

- QuoteBody
  - `pickupDate` string, date, required: The earliest pickup date in YYYY-MM-DD format, in the timezone of the pickup stop.
  - `pickupInfo` object, required
    - `zipcode` string, required
    - `country` 'US' | 'CA': Country code (ISO 3166-1 alpha-2). Supported: US, CA. Defaults to US.
  - `deliveryInfo` object, required
    - `zipcode` string, required
    - `country` 'US' | 'CA': Country code (ISO 3166-1 alpha-2). Supported: US, CA. Defaults to US.
  - `pickupServices` PickupService[]
    - `quantity` number, required
    - `service` 'photo-required-pickup' | 'liftgate-pickup' | 'convention-trade-show-pickup' | 'inside-pickup' | 'limited-access-pickup' | 'residential-pickup' | 'construction-site-pickup' | 'pickup-appointment' | 'pickup-layover' | 'detention-shipper' | 'drop-empty' | 'driver-assist-pickup' | 'drop-and-hook-pickup' | 'inside-pickup-upstairs-mezzanine-trash-removal' | 'inside-pickup-back-side-of-the-house' | 'inside-pickup-living-space-garage', required: Pickup service options
  - `deliveryServices` DeliveryService[]
    - `quantity` number, required
    - `service` 'photo-required-delivery' | 'liftgate-delivery' | 'convention-trade-show-delivery' | 'inside-delivery' | 'limited-access-delivery' | 'residential-delivery' | 'construction-site-delivery' | 'delivery-appointment' | 'delivery-layover' | 'lumper' | 'detention-receiver' | 'redelivery' | 'drop-loaded' | 'driver-assist-delivery' | 'drop-and-hook-delivery' | 'inside-delivery-upstairs-mezzanine-trash-removal' | 'inside-delivery-back-side-of-the-house' | 'inside-delivery-living-space-garage', required: Delivery service options
  - `additionalServices` AdditionalService[]
    - `quantity` number, required
    - `service` 'photo-required' | 'sort-n-seg' | 'extra-stop' | 'extra-miles' | 'driver-assist' | 'notify' | 'check_calls' | 'otp_late_fee' | 'otd_late_fee' | 'carrier_otp' | 'carrier_otd' | 'tonu' | 'miscellaneous' | 'deduction' | 'racket_straps' | 'trailer_rental' | 'storage' | 'cross_dock_charge' | 'drop_loaded_equipment' | 'drop_and_hook' | 'drop_equipment' | 'reweigh_reclass' | 'insurance' | 'chassis_rental', required: Addtional service options
  - `listItems` BookShipmentItem[], required
    - `name` string
    - `height` number, required: Maximum 108 on POST /freights/booking; maximum 85 on POST /freights/freight-quote, /freights/book and the multi-stops endpoints (checked on the raw value, whatever the sizeUnit).
    - `length` number, required
    - `width` number, required
    - `sizeUnit` 'IN' | 'FT', required
    - `totalWeight` number, required
    - `weightUnit` 'lbs' | 'kgs', required
    - `quantity` integer, required
    - `packaging` string: Packaging unit of the line item (e.g. Pallet). Defaults to Pallet.
    - `temperature_limit` object: Temperature-controlled (reefer) freight is NOT supported yet by the quote endpoints: POST /freights/quote rejects any non-zero min/max and POST /freights/freight-quote rejects the field entirely with 400 `Reefer Shipment is not supported yet!`. Omit this field unless instructed otherwise by WARP.
      - `min` number: Minimum temperature.
      - `max` number: Maximum temperature.
    - `stackable` boolean
    - `notes` string
    - `freightClass` string: NMFC freight class of the line item (e.g. 70).
    - `barcodes` string[]
  - `shipmentType` 'LTL' | 'FTL' | 'PARCEL': The type of shipment (optional, defaults to LTL when omitted). PARCEL returns a single FedEx rate; use /freights/freight-quote to compare every parcel service level. PARCEL items are checked against the FedEx limits per package: weight per package (totalWeight / quantity) <= 150 lbs, longest side <= 108 in, length + girth (longest side + 2 x (the other two sides)) <= 165 in; dimensions, weight and quantity must all be > 0. PARCEL accepts `listItems[]` (or `items[]`).
  - `vehicleType` VehicleType
    - `code` 'DRY_VAN_53' | 'STRAIGHT_TRUCK_26' | 'CARGO_VAN': The type of vehicle (optional. If not provided, the system will automatically select the best vehicle type based on the shipment type and the items.)
  - `insuranceInfo` object: Optional. Provide to receive an insurance quote alongside the freight quote. Both fields are required to get an insurance quote; if omitted or incomplete, the insurance block is skipped.
    - `commodity` string: A description of the commodity being shipped.
    - `insuredValue` number: The declared value of the goods to be insured (in USD).

## Response `200`

successful creation

- QuoteResult
  - `quote_id` string: Unique quote ID (prefixed with W, 27 characters). Use this ID when booking.
  - `price` object
    - `amount` number
    - `currency_code` string
  - `charges` object[]: Rate lines. The TOTAL row is price.amount. Every other row is a component: the TRANSIT row is the base freight charge and each SERVICE_OPTION row is an accessorial (its code may also be the carrier-specific accessorial code), so the non-TOTAL rows sum to the TOTAL row. The TRANSIT row is omitted when it cannot be derived so that the rows always reconcile.
    - `code` string
    - `description` string
    - `amount` number
  - `transit_time` number, nullable: Predicted transit time in DAYS. `null` when the carrier does not publish a transit duration - FedEx only publishes one for Ground; its Express services (Overnight, 2Day, Express Saver) commit to an absolute date instead, exposed as `estimated_delivery_date`.
  - `transit_time_without_team` number, nullable: Transit time in DAYS when the load is driven by a single driver instead of a team. `null` when not applicable.
  - `estimated_delivery_date` string, date, nullable: Carrier-committed delivery date (`YYYY-MM-DD`). `null` when the carrier does not commit to a date. For FedEx Express services this is the only delivery estimate available, since `transit_time` is not published for them.
  - `expiration_time_utc` number
  - `status` string
  - `notes` string
  - `shipmentType` 'LTL' | 'FTL' | 'PARCEL': The shipment type that was priced.
  - `insurance` object: Insurance quote block. Only present when insuranceInfo is provided in the request. Kept separate from price/charges (the freight rate) - it is an independent, optional quote. If the customer opts in, the total payable = price.amount + insurance.total. When the insurance quote fails the block is `{ "insuranceQuoteId": null, "errorMessage": "..." }` and the freight quote is still returned.
    - `insuranceQuoteId` string, nullable: The insurance quote id. Pass this as insuranceQuoteId when booking to purchase the insurance. `null` when the insurance quote failed (see errorMessage).
    - `premium` number: The insurance premium.
    - `processingFee` number: The WARP processing fee for insurance.
    - `total` number: Total insurance charge (premium + processingFee).
    - `currency_code` string
    - `errorMessage` string: Only present when the insurance quote failed. Explains why (e.g. commodity excluded, insurer unavailable).

## Other responses

- `400`: Bad Request - the request payload is missing fields or contains invalid data.
- `401`: Unauthorized - the apikey header is missing or does not match any active API key.
- `403`: Forbidden - the customer account is suspended. The body carries `message` only, without `code`.
- `429`: Too Many Requests - the quoting rate limit of the API key was exceeded (only POST /freights/quote, /freights/freight-quote and /freights/quote/multi-stops are rate limited; limits apply per UTC hour and per UTC day). The `Retry-After` header holds the number of seconds until the window resets.
- `500`: Internal Server Error - an unknown error has occurred.

---

[API](https://skmtc.dev/wearewarp/apis/warp-api-documentation.md) · [All operations](https://skmtc.dev/wearewarp/apis/warp-api-documentation/llms.txt) · [OpenAPI document](https://skmtc.dev/wearewarp/apis/warp-api-documentation/revisions/01526741bb48?raw)
