Last updated

Rate Shopping

With the Rates endpoint, you can get shipping rates for multiple carrier and service options. You can then select the desired service for the shipment based on the response or display these at checkout to let your customers choose the fastest, cheapest, or most-trusted service.

There are multiple methods available for getting rates, each with their own use cases:

Additionally, you can get rates for multiple shipments and get rate estimates with a subset of the information required to create a label.

Requirements

No matter which method you use, you’ll always need the carrier_ids, which will be included in the rate_options object. You can get rates for one or multiple carrier IDs. List carriers to locate your carrier IDs.

There may also be additional requirements, depending on which method you use.

About the /rates/ Endpoint

POST /v2/rates/

  • Given some shipment details and rate options, this endpoint returns a list of rate quotes. You can then use a rate to print a label.
  • You can also choose to validate the address as part of the rate request to help ensure you receive the most-accurate rates possible. There are three address validation options:
    • no_validation: This is the default option and does not validate addresses nor does it confirm the accuracy of an address.
    • validate_only: Validates address accuracy but returns an error if the validation fails.
    • validate_and_clean: Validates address accuracy and updates the address with recommended adjustments.

Example: Find Rates with Shipment Details

Requirements:

  • carrier_ids
  • shipment object

Sample Request

In this example, the shipment details has the no_validation value in the validate_address property.

POST /v2/rates HTTP/1.1
Host: api.shipstation.com
API-Key: __YOUR_API_KEY_HERE__
Content-Type: application/json

{
 "rate_options": {
   "carrier_ids": [
     "se-123890"
   ]
 },
 "shipment": {
   "validate_address": "no_validation",
   "ship_to": {
     "name": "The President",
     "phone": "222-333-4444",
     "company_name": "",
     "address_line1": "1600 Pennsylvania Avenue NW",
     "city_locality": "Washington",
     "state_province": "DC",
     "postal_code": "20500",
     "country_code": "US",
     "address_residential_indicator": "no"
   },
   "ship_from": {
     "name": "ShipStation Team",
     "phone": "222-333-4444",
     "company_name": "ShipStation",
     "address_line1": "4301 Bull Creek Road",
     "city_locality": "Austin",
     "state_province": "TX",
     "postal_code": "78731",
     "country_code": "US",
     "address_residential_indicator": "no"
   },
   "packages": [
     {
       "package_code": "package",
       "weight": {
         "value": 6,
         "unit": "ounce"
       }
     }
   ]
 }
}

Example: Find Rates with Shipment ID

If you've already created a shipment, you can pass the shipment_id instead of the full shipment details.

Requirements:

  • carrier_ids
  • shipment_id for a previously created shipment

Sample Request

POST /v2/rates HTTP/1.1
Host: api.shipstation.com
API-Key: __YOUR_API_KEY_HERE__
Content-Type: application/json

{
 "shipment_id": "se-123",
 "rate_options": {
   "carrier_ids": [
     "se-123890"
   ]
 }
}

You can pass either the full shipment details or a shipment_id, but you cannot pass both in the same request.


Example: Find Rates with Package Types

Use this method to filter the response by a specific set of package types. If no package type is specified, the default package type for that carrier is used, not all package types.

Requirements:

  • carrier_ids
  • shipment_id or shipment details
  • package_types object and desired values

Sample Request

POST /v2/rates HTTP/1.1
Host: api.shipstation.com
API-Key: __YOUR_API_KEY_HERE__
Content-Type: application/json

{
 "shipment_id": "se-123",
 "rate_options": {
   "carrier_ids": [
     "se-123890"
   ],
   "service_codes": [],
   "package_types": [
     "flat_rate_envelope",
     "medium_flat_rate_box"
   ]
 }
}

Example: Find Rates with Service Codes

Use this method to filter the response by a specific set of service codes. If no service code is specified, all service codes are returned.

Requirements:

  • carrier_ids
  • shipment_id or shipment details
  • service_codes object and desired values

Sample Request

POST /v2/rates HTTP/1.1
Host: api.shipstation.com
API-Key: __YOUR_API_KEY_HERE__
Content-Type: application/json

{
 "shipment_id": "se-123",
 "rate_options": {
   "carrier_ids": [
     "se-123890"
   ],
   "service_codes": [
     "usps_first_class_mail",
     "usps_priority_mail"
   ],
   "package_types": []
 }
}

Example: Find Rates with Service Codes & Package Types

Use this method to filter the response by a combination of service codes and package types.

Requirements:

  • carrier_ids
  • shipment_id or shipment details
  • package_types object and desired values
  • service_codes object and desired values

Sample Request

POST /v2/rates HTTP/1.1
Host: api.shipstation.com
API-Key: __YOUR_API_KEY_HERE__
Content-Type: application/json

{
 "shipment_id": "se-123",
 "rate_options": {
   "carrier_ids": [
     "se-123890"
   ],
   "service_codes": [
     "usps_first_class_mail",
     "usps_priority_mail",
     "ups_next_day_air_early_am"
   ],
   "package_types": [
     "flat_rate_envelope",
     "medium_flat_rate_box"
   ]
 }
}

About the Response

Each rate includes the itemized prices for:

PropertyDescription
shipment_amountCost of shipment only.
insurance_amountCost to insure shipment.
confirmation_amountCost to confirm shipment delivery.
other_amountFees and surcharges from the carrier.

The total rate is the sum of all these amounts.

You may want some additional details about the rates in the response. When it's available, we provide this additional information in the rate_details object.

Here is the structure:

PropertyDescription
rate_detail_typeNormalized type for the additional rate information. These types are enumerated as: uncategorized, shipping, insurance, confirm, discount, fuel_charge, additional_fees, tariff, tax, delivery, handling, special_goods, pickup, location_fee, oversize, returns, notifications, tip, duties_and_taxes, brokerage_fee, admin_fee, adjustment
carrier_descriptionPlain text description of the rate detail as provided by the carrier.
carrier_billing_codeCode for the billing type provided by the carrier.
carrier_memoAdditional text regarding this charge. Usually null.
amountThe currency and amount of the detailed charge.

The rate_details object should match the total of the shipment_amount, insurance_amount, confirmation_amount, and other_amount when it is provided.

Don't want to wait for rates?

We support asynchronous requests using webhooks. However, we recommend waiting if you need to display the rates as a 'next step' for your user or if you're developing for a platform that does not support webhooks.

Sample Response

The response can be lengthy depending on how many carriers you requested rates for. This sample response excludes all but one.

{
   "rate_response": {
       "rates": [
           {
               "rate_id": "se-321654",
               "rate_type": "shipment",
               "carrier_id": "se-123890",
               "shipping_amount": {
                   "currency": "usd",
                   "amount": 10.1
               },
               "insurance_amount": {
                   "currency": "usd",
                   "amount": 0.0
               },
               "confirmation_amount": {
                   "currency": "usd",
                   "amount": 0.0
               },
               "other_amount": {
                   "currency": "usd",
                   "amount": 1.52
               },
               "rate_details": [
                   {
                       "rate_detail_type": "fuel_charge",
                       "carrier_description": "FedEx Ground Fuel",
                       "carrier_billing_code": null,
                       "carrier_memo": null,
                       "amount": {
                           "currency": "usd",
                           "amount": 1.52
                       },
                       "billing_source": "Carrier"
                   },
                   {
                       "rate_detail_type": "shipping",
                       "carrier_description": "Total Net Freight",
                       "carrier_billing_code": null,
                       "carrier_memo": null,
                       "amount": {
                           "currency": "usd",
                           "amount": 10.1
                       },
                       "billing_source": "Carrier"
                   }
               ],
               "zone": 6,
               "package_type": null,
               "delivery_days": 3,
               "guaranteed_service": false,
               "estimated_delivery_date": "2023-04-28T23:59:00Z",
               "carrier_delivery_days": "3",
               "ship_date": "2023-04-25T00:00:00Z",
               "negotiated_rate": false,
               "service_type": "FedEx Ground®",
               "service_code": "fedex_ground",
               "trackable": true,
               "carrier_code": "fedex",
               "carrier_nickname": "My FedEx account",
               "carrier_friendly_name": "FedEx",
               "validation_status": "has_warnings",
               "warning_messages": [
                   "FedEx may add a Home Delivery Surcharge to this shipment later if this is a residential address."
               ],
               "error_messages": []
           }
       ]
       "invalid_rates": [],
       "rate_request_id": "se-987",
       "shipment_id": "se-12345",
       "created_at": "2023-04-25T22:44:33.8102925Z",
       "status": "completed",
       "errors": []
   },
   "shipment_id": "se-12345",
   "carrier_id": "se-123890",
   "service_code": null,
   "external_shipment_id": null,
   "shipment_number": null,
   "ship_date": "2023-04-25T00:00:00Z",
   "created_at": "2023-04-25T22:44:32.887Z",
   "modified_at": "2023-04-25T22:44:32.88Z",
   "shipment_status": "pending",
   "ship_to": {
       "instructions": null,
       "name": "The President",
       "phone": "222-333-4444",
       "company_name": "",
       "address_line1": "1600 Pennsylvania Avenue NW",
       "address_line2": null,
       "address_line3": null,
       "city_locality": "Washington",
       "state_province": "DC",
       "postal_code": "20500",
       "country_code": "US",
       "address_residential_indicator": "no"
   },
   "ship_from": {
       "instructions": null,
       "name": "ShipStation Team",
       "phone": "222-333-4444",
       "company_name": "ShipStation",
       "address_line1": "4301 Bull Creek Road",
       "address_line2": null,
       "address_line3": null,
       "city_locality": "Austin",
       "state_province": "TX",
       "postal_code": "78731",
       "country_code": "US",
       "address_residential_indicator": "no"
   },
   "warehouse_id": null,
   "return_to": {
       "instructions": null,
       "name": "ShipStation Team",
       "phone": "222-333-4444",
       "company_name": "ShipStation",
       "address_line1": "4301 Bull Creek Road",
       "address_line2": null,
       "address_line3": null,
       "city_locality": "Austin",
       "state_province": "TX",
       "postal_code": "78731",
       "country_code": "US",
       "address_residential_indicator": "no"
   },
   "is_return": false,
   "confirmation": "none",
   "customs": {
       "contents": "merchandise",
       "contents_explanation": null,
       "customs_items": [],
       "non_delivery": "return_to_sender",
       "buyer_shipping_amount_paid": null,
       "duties_paid": null,
       "terms_of_trade_code": null,
       "declaration": null,
       "invoice_additional_details": {
           "freight_charge": null,
           "insurance_charge": null,
           "other_charge": null,
           "discount": null
       },
       "importer_of_record": null
   },
   "external_order_id": null,
   "order_source_code": null,
   "advanced_options": {
       "bill_to_account": null,
       "bill_to_country_code": null,
       "bill_to_party": null,
       "bill_to_postal_code": null,
       "contains_alcohol": false,
       "delivered_duty_paid": false,
       "non_machinable": false,
       "saturday_delivery": false,
       "dry_ice": false,
       "dry_ice_weight": null,
       "fedex_freight": null,
       "third_party_consignee": false,
       "ancillary_endorsements_option": null,
       "freight_class": null,
       "custom_field1": null,
       "custom_field2": null,
       "custom_field3": null,
       "collect_on_delivery": null,
       "return_pickup_attempts": null,
       "additional_handling": false
   },
   "insurance_provider": "none",
   "tags": [],
   "packages": [
       {
           "shipment_package_id": "se-65432",
           "package_id": "se-3",
           "package_code": "package",
           "package_name": "Package",
           "weight": {
               "value": 6.00,
               "unit": "ounce"
           },
           "dimensions": {
               "unit": "inch",
               "length": 0.0,
               "width": 0.0,
               "height": 0.0
           },
           "insured_value": {
               "currency": "usd",
               "amount": 0.00
           },
           "label_messages": {
               "reference1": null,
               "reference2": null,
               "reference3": null
           },
           "external_package_id": null,
           "content_description": null,
           "products": []
       }
   ],
   "total_weight": {
       "value": 6.00,
       "unit": "ounce"
   },
   "items": []
}

Rate Multiple Shipments

You can request rates for shipments in bulk using the /v2/rates/bulk endpoint. If you subscribe to webhooks, you will receive a notification when the operation is complete. You can then retrieve the rates and create a label using the rate_id.

Sample Request

POST /v2/rates/bulk

In this sample, we request rates for shipments that were previously created by passing the desired shipment IDs in the shipment_ids array.

POST /v2/rates/bulk HTTP/1.1
Host: api.shipstation.com
API-Key: __YOUR_API_KEY_HERE__
Content-Type: application/json

{
 "shipment_ids": [
   "se-2127226",
   "se-2127227"
 ],
 "rate_options": {
   "carrier_ids": [
     "se-123890",
     "se-121861"
   ]
 }
}

Alternatively, you can include the shipment object in the rate request rather than referencing an existing shipment. In this case, a shipment will be created for you and include a shipment_id with each rate.

POST /v2/rates/bulk HTTP/1.1
Host: api.shipstatione.com
API-Key: __YOUR_API_KEY_HERE__
Content-Type: application/json

{
 "rate_options": {
   "carrier_ids": [
     "se-123890",
     "se-123890"
   ]
 },
 "shipments": [{
     "ship_to": {
       "name": "Amanda Miller",
       "phone": "555-555-5555",
       "address_line1": "525 S Winchester Blvd",
       "city_locality": "San Jose",
       "state_province": "CA",
       "postal_code": "95128",
       "country_code": "US",
       "address_residential_indicator": "yes"
     },
     "ship_from": {
       "company_name": "Example Corp.",
       "name": "John Doe",
       "phone": "111-111-1111",
       "address_line1": "4009 Marathon Blvd",
       "address_line2": "Suite 300",
       "city_locality": "Austin",
       "state_province": "TX",
       "postal_code": "78756",
       "country_code": "US",
       "address_residential_indicator": "no"
     },
     "confirmation": "none",
     "packages": [{
       "package_code": "package",
       "weight": {
         "value": 12,
         "unit": "ounce"
       }
     }]
   },
   {
     "ship_to": {
       "name": "Amanda Miller",
       "phone": "555-555-5555",
       "address_line1": "525 S Winchester Blvd",
       "city_locality": "San Jose",
       "state_province": "CA",
       "postal_code": "95128",
       "country_code": "US",
       "address_residential_indicator": "yes"
     },
     "ship_from": {
       "company_name": "Example Corp.",
       "name": "John Doe",
       "phone": "111-111-1111",
       "address_line1": "4009 Marathon Blvd",
       "address_line2": "Suite 300",
       "city_locality": "Austin",
       "state_province": "TX",
       "postal_code": "78756",
       "country_code": "US",
       "address_residential_indicator": "no"
     },
     "confirmation": "none",
     "packages": [{
       "package_code": "package",
       "weight": {
         "value": 1,
         "unit": "pound"
       }
     }]
   },
   {
     "ship_to": {
       "name": "Waffle HQ",
       "company_name": "Waffle House",
       "address_line1": "5986 Financial Drive",
       "address_line2": null,
       "address_line3": null,
       "city_locality": "Norcross",
       "state_province": "GA",
       "postal_code": "30071",
       "country_code": "US",
       "phone": "111-111-1111"
     },
     "ship_from": {
       "company_name": "Example Corp.",
       "name": "John Doe",
       "phone": "111-111-1111",
       "address_line1": "4009 Marathon Blvd",
       "address_line2": "Suite 300",
       "city_locality": "Austin",
       "state_province": "TX",
       "postal_code": "78756",
       "country_code": "US",
       "address_residential_indicator": "no"
     },
     "confirmation": "none",
     "packages": [{
       "package_code": "package",
       "weight": {
         "value": 1,
         "unit": "ounce"
       }
     }]
   },
   {
     "ship_to": {
       "name": "Jony Ive",
       "company_name": "Apple",
       "address_line1": "1 Infinite Loop",
       "address_line2": null,
       "address_line3": null,
       "city_locality": "Cupertino",
       "state_province": "CA",
       "postal_code": "95014",
       "country_code": "US",
       "phone": "408-996-1010"
     },
     "ship_from": {
       "company_name": "Example Corp.",
       "name": "John Doe",
       "phone": "111-111-1111",
       "address_line1": "4009 Marathon Blvd",
       "address_line2": "Suite 300",
       "city_locality": "Austin",
       "state_province": "TX",
       "postal_code": "78756",
       "country_code": "US",
       "address_residential_indicator": "no"
     },
     "confirmation": "none",
     "packages": [{
       "package_code": "package",
       "weight": {
         "value": 1,
         "unit": "ounce"
       }
     }]
   },
   {
     "ship_to": {
       "name": "Amanda Miller",
       "phone": "555-555-5555",
       "address_line1": "525 S Winchester Blvd",
       "city_locality": "San Jose",
       "state_province": "CA",
       "postal_code": "95128",
       "country_code": "US",
       "address_residential_indicator": "yes"
     },
     "ship_from": {
       "company_name": "Example Corp.",
       "name": "John Doe",
       "phone": "111-111-1111",
       "address_line1": "4009 Marathon Blvd",
       "address_line2": "Suite 300",
       "city_locality": "Austin",
       "state_province": "TX",
       "postal_code": "78756",
       "country_code": "US",
       "address_residential_indicator": "no"
     },
     "confirmation": "none",
     "packages": [{
       "package_code": "package",
       "weight": {
         "value": 1,
         "unit": "ounce"
       }
     }]
   }
 ]
}

Sample Response

Due to the length of the response, we have truncated this sample to only show a single rate. When you run this command, you will notice many more rates returned in the response.

[
 {
   "rate_request_id": 501846,
   "shipment_id": "se-2127226",
   "status": "working",
   "created_at": "2019-07-25T15:24:46.657Z"
 },
 {
   "rate_request_id": 501847,
   "shipment_id": "se-2127227",
   "status": "working",
   "created_at": "2019-07-25T15:24:46.657Z"
 }
]

Rate Estimates

You may find it useful to quickly estimate a rate so you can, for example, add shipping charges to your customer's shopping cart. Estimates work by providing a subset of the information required to create a label using the /v2/rates/estimate endpoint. You can use this method to allow customers to quickly compare rates across services, carriers, and more without having to fill in all the information required to create a label.

Limitations of Rate Estimates

This endpoint does not support multi-package shipments or filtering using the rate_options property. You can filter by carrier adding the desired carrier IDs to the carrier_ids array.

When requesting an estimate, we recommend including the following for the best results:

  • Postal Code To
  • Postal Code From
  • Weight
  • Dimensions (optional, but recommended)

Sample Request

POST /v2/rates/estimate

POST /v2/rates/estimate HTTP/1.1
Host: api.shipstation.com
API-Key: __YOUR_API_KEY_HERE__
Content-Type: application/json

{
 "carrier_ids": [
   "se-123890"
 ],
 "from_country_code": "US",
 "from_postal_code": "78756",
 "to_country_code": "US",
 "to_postal_code": "95128",
 "to_city_locality": "San Jose",
 "to_state_province": "CA",
 "weight": {
   "value": 1.0,
   "unit": "ounce"
 },
 "dimensions": {
   "unit": "inch",
   "length": 5.0,
   "width": 5.0,
   "height": 5.0
 },
 "confirmation": "none",
 "address_residential_indicator": "no"
}
Only an Estimate!

Rate estimates are not exact quotes. They do not include things like insurance_amount and may not include other items such as fuel surcharges, customs charges, or other carrier fees.