> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developer.shipbob.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.shipbob.com/_mcp/server.

# Estimate Fulfillment Cost For Order

POST https://api.shipbob.com/2026-01/order:estimate
Content-Type: application/json

This endpoint will provide, where possible, an estimate of pricing and fulfillment center assignment of a potential standard (direct to consumer) order. Keep in mind that there are ways for the merchant to change FC assignment or product configuration after order creation that could invalidate this estimate. Estimates cannot be returned for items that are unknown, out of stock, or too large for fulfillment using standard box sizes. Additional services such as high-pick fees, shipping insurance, auto-splitting or auto-adding items to orders, and signature required are not included in this estimate.

Reference: https://developer.shipbob.com/2026-01/api/orders/estimate-fulfillment-cost-for-order

## Authentication

- `Authorization` header (bearer token, required) — Authentication using Personal Access Token (PAT) token
- `Authorization` header (bearer token, required) — OAuth2 authentication using JWT tokens

## Servers

- `https://api.shipbob.com` (https://api.shipbob.com, default)
- `https://sandbox-api.shipbob.com` (https://sandbox-api.shipbob.com)

## Request

### Headers

- `shipbob_channel_id` (integer, required) — Channel Id for Operation

### Body (application/json)

This endpoint expects an object.

- `address` (object, required)
  - `country` (string, required) — The country (Must be ISO Alpha-2 for estimates)
  - `address1` (string, optional, nullable) — First line of the address
  - `address2` (string, optional, nullable) — Second line of the address
  - `city` (string, optional, nullable) — The city
  - `company_name` (string, optional, nullable) — Name of the company receiving the shipment
  - `state` (string, optional, nullable) — The state or province
  - `zip_code` (string, optional, nullable) — The zip code or postal code
- `products` (list of object, required) — Products to be included in the order. Each product must include one of reference_id or id
  - `quantity` (integer, required) — The quantity of this product ordered
  - `id` (integer, optional, nullable) — Unique id of the product (Must be provided if reference_id is unknown)
  - `reference_id` (string, optional, nullable) — Unique reference id of the product (Must be provided if ID is unknown)
- `shipping_methods` (list of string, optional, nullable) — Array of strings specifying shipping methods for which to fetch estimates. If this field is omitted we will return estimates for all shipping methods defined in ShipBob

## Response

### 200

Success

- `estimates` (list of object, optional, nullable) — Array of estimates for each shipping method
  - `estimated_currency_code` (string, optional, nullable) — Estimated local currency code
  - `estimated_price` (double, optional) — Estimated price in dollars for the provided shipping method
  - `fulfillment_center` (object, optional) — Information about a fulfillment center that a shipment can belong to
    - `id` (integer, optional) — Id of the fulfillment center
    - `name` (string, optional, nullable) — Name of the fulfillment center
  - `shipping_method` (string, optional, nullable) — Provided shipping method. Maps to ship option in ShipBob.
  - `total_weight_oz` (double, optional) — Total weight of items in cart including packaging.

## Errors

### 400 Bad Request Error

Bad Request

- `map from string to list of string`

### 401 Unauthorized Error

No access right at this time

- `any`

### 403 Forbidden Error

No access

- `any`

### 422 Unprocessable Entity Error

Client Error

- `map from string to list of string`

## Examples

**Request**

```json
{
  "address": {
    "country": "US",
    "address1": "100 Nowhere Blvd",
    "address2": "Suite 100",
    "city": "Gotham City",
    "company_name": "Wayne Enterprises",
    "state": "NJ",
    "zip_code": "07093"
  },
  "products": [
    {
      "quantity": 1,
      "id": 0,
      "reference_id": "TShirtBlueM"
    }
  ],
  "shipping_methods": [
    "string"
  ]
}
```

**Response**

```json
{
  "estimates": [
    {
      "estimated_currency_code": "string",
      "estimated_price": 0.1,
      "fulfillment_center": {
        "id": 0,
        "name": "Cicero (IL)"
      },
      "shipping_method": "string",
      "total_weight_oz": 0.1
    }
  ]
}
```

**SDK Code**

```python default
import requests

url = "https://api.shipbob.com/2026-01/order:estimate"

payload = {
    "address": {
        "country": "US",
        "address1": "100 Nowhere Blvd",
        "address2": "Suite 100",
        "city": "Gotham City",
        "company_name": "Wayne Enterprises",
        "state": "NJ",
        "zip_code": "07093"
    },
    "products": [
        {
            "quantity": 1,
            "id": 0,
            "reference_id": "TShirtBlueM"
        }
    ],
    "shipping_methods": ["string"]
}
headers = {
    "shipbob_channel_id": "1",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript default
const url = 'https://api.shipbob.com/2026-01/order:estimate';
const options = {
  method: 'POST',
  headers: {
    shipbob_channel_id: '1',
    Authorization: 'Bearer <token>',
    'Content-Type': 'application/json'
  },
  body: '{"address":{"country":"US","address1":"100 Nowhere Blvd","address2":"Suite 100","city":"Gotham City","company_name":"Wayne Enterprises","state":"NJ","zip_code":"07093"},"products":[{"quantity":1,"id":0,"reference_id":"TShirtBlueM"}],"shipping_methods":["string"]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go default
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.shipbob.com/2026-01/order:estimate"

	payload := strings.NewReader("{\n  \"address\": {\n    \"country\": \"US\",\n    \"address1\": \"100 Nowhere Blvd\",\n    \"address2\": \"Suite 100\",\n    \"city\": \"Gotham City\",\n    \"company_name\": \"Wayne Enterprises\",\n    \"state\": \"NJ\",\n    \"zip_code\": \"07093\"\n  },\n  \"products\": [\n    {\n      \"quantity\": 1,\n      \"id\": 0,\n      \"reference_id\": \"TShirtBlueM\"\n    }\n  ],\n  \"shipping_methods\": [\n    \"string\"\n  ]\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("shipbob_channel_id", "1")
	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby default
require 'uri'
require 'net/http'

url = URI("https://api.shipbob.com/2026-01/order:estimate")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["shipbob_channel_id"] = '1'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"address\": {\n    \"country\": \"US\",\n    \"address1\": \"100 Nowhere Blvd\",\n    \"address2\": \"Suite 100\",\n    \"city\": \"Gotham City\",\n    \"company_name\": \"Wayne Enterprises\",\n    \"state\": \"NJ\",\n    \"zip_code\": \"07093\"\n  },\n  \"products\": [\n    {\n      \"quantity\": 1,\n      \"id\": 0,\n      \"reference_id\": \"TShirtBlueM\"\n    }\n  ],\n  \"shipping_methods\": [\n    \"string\"\n  ]\n}"

response = http.request(request)
puts response.read_body
```

```java default
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.shipbob.com/2026-01/order:estimate")
  .header("shipbob_channel_id", "1")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"address\": {\n    \"country\": \"US\",\n    \"address1\": \"100 Nowhere Blvd\",\n    \"address2\": \"Suite 100\",\n    \"city\": \"Gotham City\",\n    \"company_name\": \"Wayne Enterprises\",\n    \"state\": \"NJ\",\n    \"zip_code\": \"07093\"\n  },\n  \"products\": [\n    {\n      \"quantity\": 1,\n      \"id\": 0,\n      \"reference_id\": \"TShirtBlueM\"\n    }\n  ],\n  \"shipping_methods\": [\n    \"string\"\n  ]\n}")
  .asString();
```

```php default
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.shipbob.com/2026-01/order:estimate', [
  'body' => '{
  "address": {
    "country": "US",
    "address1": "100 Nowhere Blvd",
    "address2": "Suite 100",
    "city": "Gotham City",
    "company_name": "Wayne Enterprises",
    "state": "NJ",
    "zip_code": "07093"
  },
  "products": [
    {
      "quantity": 1,
      "id": 0,
      "reference_id": "TShirtBlueM"
    }
  ],
  "shipping_methods": [
    "string"
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
    'shipbob_channel_id' => '1',
  ],
]);

echo $response->getBody();
```

```csharp default
using RestSharp;

var client = new RestClient("https://api.shipbob.com/2026-01/order:estimate");
var request = new RestRequest(Method.POST);
request.AddHeader("shipbob_channel_id", "1");
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"address\": {\n    \"country\": \"US\",\n    \"address1\": \"100 Nowhere Blvd\",\n    \"address2\": \"Suite 100\",\n    \"city\": \"Gotham City\",\n    \"company_name\": \"Wayne Enterprises\",\n    \"state\": \"NJ\",\n    \"zip_code\": \"07093\"\n  },\n  \"products\": [\n    {\n      \"quantity\": 1,\n      \"id\": 0,\n      \"reference_id\": \"TShirtBlueM\"\n    }\n  ],\n  \"shipping_methods\": [\n    \"string\"\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift default
import Foundation

let headers = [
  "shipbob_channel_id": "1",
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "address": [
    "country": "US",
    "address1": "100 Nowhere Blvd",
    "address2": "Suite 100",
    "city": "Gotham City",
    "company_name": "Wayne Enterprises",
    "state": "NJ",
    "zip_code": "07093"
  ],
  "products": [
    [
      "quantity": 1,
      "id": 0,
      "reference_id": "TShirtBlueM"
    ]
  ],
  "shipping_methods": ["string"]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.shipbob.com/2026-01/order:estimate")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```