> 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.

# Update Warehouse Receiving Order


PATCH https://api.shipbob.com/Experimental/receiving/{id}
Content-Type: application/json

Updates an existing warehouse receiving order. Only the fields included in the request body are changed; omit a field to leave it as it is. The fulfillment center, expected arrival date and boxes can only be changed while the order is awaiting arrival and none of its boxes have started processing, and not once ShipBob shipping labels have been purchased or generated for it. The purchase order number can be changed in any status except complete. Supplying boxes replaces the entire set of boxes and their contents, so send the complete set rather than only the ones that changed.


Reference: https://developer.shipbob.com/experimental/api/receiving/update-warehouse-receiving-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

### Path parameters

- `id` (integer, required) — Id of the receiving order

### Body (application/json)

This endpoint expects an object.

- `boxes` (list of object, optional, nullable) — Replaces every box on this receiving order and their contents — boxes that are not included are removed, so send the complete set. Only editable while the receiving order is awaiting arrival and none of its boxes have started processing.
  - `box_items` (list of object, required) — Items contained in this box. A receiving order may reference at most 10,000 unique inventory items (SKUs) across all of its boxes; exceeding this returns a 422 with the WRO_UNIQUE_SKU_LIMIT_EXCEEDED reason code. The limit applies to distinct inventory_ids across the whole order, not to a single box.
    - `quantity` (integer, required) — Quantity of the items in the box
    - `inventory_id` (integer, optional, nullable) — Unique inventory id of the items in the box (optional if sku is provided)
    - `lot_date` (datetime, optional, nullable) — Lot expiration date for the items in the box. Optional; may be null or omitted. When provided, requires a full RFC 3339 date-time, for example 2026-08-05T00:00:00Z; a bare date such as 2026-08-05 is rejected.
    - `lot_number` (string, optional, nullable) — Lot number of the items in the box
    - `sku` (string, optional, nullable) — SKU identifier for the items in the box (optional if inventory_id is provided)
  - `tracking_number` (string, required) — Tracking number for the box shipment
- `expected_arrival_date` (datetime, optional, nullable) — Expected arrival date of all the box shipments in this receiving order. Must be in the future, and only editable while the receiving order is awaiting arrival and none of its boxes have started processing.
- `fulfillment_center` (object, optional, nullable) — Fulfillment center this receiving order is being shipped to. Only editable while the receiving order is awaiting arrival and none of its boxes have started processing. Wrapped in allOf so the nullability applies: in OpenAPI 3.0 a keyword alongside $ref is ignored.
  - `id` (integer, required) — ID of the fulfillment center to assign this receiving order to
- `purchase_order_number` (string, optional, nullable) — Purchase order number for this receiving order. Send an empty or blank string to clear it. Surrounding whitespace is trimmed. Editable in any status except complete.

## Response

### 200

Success

- `box_labels_uri` (string, optional, nullable) — URL to the packing slip to be included in each box shipment for this receiving order
- `box_packaging_type` (enum, optional)
  - Allowed values: `EverythingInOneBox`, `OneSkuPerBox`, `MultipleSkuPerBox`
- `expected_arrival_date` (datetime, optional) — Expected date that all packages will have arrived. Returned as a full RFC 3339 date-time, for example 2026-08-05T00:00:00Z.
- `external_sync_timestamp` (datetime, optional, nullable) — The timestamp in UTC when a 3rd party integrator has set in our system
- `freight` (object, optional, nullable) — Optional container/freight metadata for this receiving order (null when none was provided)
  - `bol_number` (string, optional, nullable) — Bill of Lading number (the BOL number string, distinct from any uploaded BOL document)
  - `carrier` (string, optional, nullable) — Carrier name (e.g. Maersk, DHL, FedEx)
  - `container_number` (string, optional, nullable) — Shipping container number
  - `freight_forwarder` (string, optional, nullable) — Freight forwarder company name
  - `notes` (string, optional, nullable) — Free-text freight notes
  - `vessel_name` (string, optional, nullable) — Vessel (ship) name
- `fulfillment_center` (object, optional) — Information about a fulfillment center
  - `address1` (string, optional, nullable) — Address line one of the fulfillment center
  - `address2` (string, optional, nullable) — Address line two of the fulfillment center
  - `city` (string, optional, nullable) — City the fulfillment center is located in
  - `country` (string, optional, nullable) — Country the fulfillment center is located in
  - `email` (string, optional, nullable) — Email contact for the fulfillment center
  - `id` (integer, optional) — Unique identifier of the fulfillment center
  - `name` (string, optional, nullable) — Name of the fulfillment center
  - `phone_number` (string, optional, nullable) — Phone number contact for the fulfillment center
  - `state` (string, optional, nullable) — State the fulfillment center is located in
  - `timezone` (string, optional, nullable) — Timezone the fulfillment center is located in
  - `zip_code` (string, optional, nullable) — Postal code of the fulfillment center
- `id` (integer, optional) — Unique id of the warehouse receiving order
- `insert_date` (datetime, optional) — Insert date of the receiving order. Returned as a full RFC 3339 date-time, for example 2026-08-05T00:00:00Z.
- `inventory_quantities` (list of object, optional, nullable) — Inventory items and quantities within the WRO
  - `expected_quantity` (integer, optional) — Quantity of the inventory item submitted in the WRO
  - `inventory_id` (integer, optional) — ID of the inventory item
  - `received_quantity` (integer, optional) — Quantity of the inventory item received by the warehouse
  - `sku` (string, optional, nullable) — Sku of the inventory item
  - `stowed_quantity` (integer, optional) — Quantity of the inventory item stowed by the warehouse
- `last_updated_date` (datetime, optional) — Last date the receiving order was updated. Returned as a full RFC 3339 date-time, for example 2026-08-05T00:00:00Z.
- `package_type` (enum, optional)
  - Allowed values: `Package`, `Pallet`, `FloorLoadedContainer`
- `purchase_order_number` (string, optional, nullable) — Purchase order number for a receiving order
- `status` (enum, optional)
  - Allowed values: `Awaiting`, `Processing`, `Completed`, `Cancelled`, `Incomplete`, `Arrived`, `PartiallyArrived`, `PartiallyArrivedAtHub`, `ArrivedAtHub`, `ProcessingAtHub`, `InternalTransfer`
- `status_history` (list of object, optional, nullable) — The history of status changes for this receiving order
  - `id` (integer, optional) — Unique id of the status
  - `status` (string, optional, nullable) — Name of the status
  - `timestamp` (datetime, optional) — Timestamp when the status was recorded

## Errors

### 401 Unauthorized Error

Authorization missing or invalid

- `any`

### 403 Forbidden Error

The provided credentials are not authorized to access this resource

- `any`

### 404 Not Found Error

Not Found

- `detail` (string, optional, nullable)
- `instance` (string, optional, nullable)
- `status` (integer, optional, nullable)
- `title` (string, optional, nullable)
- `type` (string, optional, nullable)

### 422 Unprocessable Entity Error

Unprocessable Content. Validation errors are returned keyed by field; business-rule errors that are not tied to a specific field are returned under an empty key. Changing the fulfillment center, expected arrival date or boxes is rejected here once the order has left Awaiting Arrival, once any of its boxes has started processing, once ShipBob shipping labels have been purchased or generated for it, once an unidentified receiving order has been linked to it, or when the order was created by an internal inventory transfer. A request that only changes the purchase order number is still accepted in all of those cases, and is rejected only once the order is complete.

- `map from string to list of string`

## Examples

### default

**Request**

```json
{
  "boxes": [
    {
      "box_items": [
        {
          "quantity": 1,
          "inventory_id": 0,
          "lot_date": "2019-08-24T14:15:22+00:00",
          "lot_number": "2222",
          "sku": "string"
        }
      ],
      "tracking_number": "860C8CDC8F0B4FC7AB69AC86C20539EC"
    }
  ],
  "expected_arrival_date": "2099-08-24T14:15:22+00:00",
  "fulfillment_center": {
    "id": 0
  },
  "purchase_order_number": "string"
}
```

**Response**

```json
{
  "box_labels_uri": "https://api.shipbob.com/1.0/receiving/1/labels",
  "box_packaging_type": "EverythingInOneBox",
  "expected_arrival_date": "2019-08-24T14:15:22+00:00",
  "external_sync_timestamp": "2019-08-24T14:15:22+00:00",
  "fulfillment_center": {
    "address1": "5900 W Ogden Ave",
    "address2": "Suite 100",
    "city": "Cicero",
    "country": "USA",
    "email": "example@example.com",
    "id": 0,
    "name": "Cicero (IL)",
    "phone_number": "555-555-5555",
    "state": "IL",
    "timezone": "Central Standard Time",
    "zip_code": "60804"
  },
  "id": 0,
  "insert_date": "2019-08-24T14:15:22+00:00",
  "inventory_quantities": [
    {
      "expected_quantity": 0,
      "inventory_id": 0,
      "received_quantity": 0,
      "sku": "string",
      "stowed_quantity": 0
    }
  ],
  "last_updated_date": "2019-08-24T14:15:22+00:00",
  "package_type": "Package",
  "purchase_order_number": "string",
  "status": "Awaiting",
  "status_history": [
    {
      "id": 0,
      "status": "Processing",
      "timestamp": "2019-08-24T14:15:22+00:00"
    }
  ]
}
```

**SDK Code**

```python default
import requests

url = "https://api.shipbob.com/Experimental/receiving/1"

payload = {
    "boxes": [
        {
            "box_items": [
                {
                    "quantity": 1,
                    "inventory_id": 0,
                    "lot_date": "2019-08-24T14:15:22+00:00",
                    "lot_number": "2222",
                    "sku": "string"
                }
            ],
            "tracking_number": "860C8CDC8F0B4FC7AB69AC86C20539EC"
        }
    ],
    "expected_arrival_date": "2099-08-24T14:15:22+00:00",
    "fulfillment_center": { "id": 0 },
    "purchase_order_number": "string"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript default
const url = 'https://api.shipbob.com/Experimental/receiving/1';
const options = {
  method: 'PATCH',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"boxes":[{"box_items":[{"quantity":1,"inventory_id":0,"lot_date":"2019-08-24T14:15:22+00:00","lot_number":"2222","sku":"string"}],"tracking_number":"860C8CDC8F0B4FC7AB69AC86C20539EC"}],"expected_arrival_date":"2099-08-24T14:15:22+00:00","fulfillment_center":{"id":0},"purchase_order_number":"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/Experimental/receiving/1"

	payload := strings.NewReader("{\n  \"boxes\": [\n    {\n      \"box_items\": [\n        {\n          \"quantity\": 1,\n          \"inventory_id\": 0,\n          \"lot_date\": \"2019-08-24T14:15:22+00:00\",\n          \"lot_number\": \"2222\",\n          \"sku\": \"string\"\n        }\n      ],\n      \"tracking_number\": \"860C8CDC8F0B4FC7AB69AC86C20539EC\"\n    }\n  ],\n  \"expected_arrival_date\": \"2099-08-24T14:15:22+00:00\",\n  \"fulfillment_center\": {\n    \"id\": 0\n  },\n  \"purchase_order_number\": \"string\"\n}")

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

	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/Experimental/receiving/1")

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

request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"boxes\": [\n    {\n      \"box_items\": [\n        {\n          \"quantity\": 1,\n          \"inventory_id\": 0,\n          \"lot_date\": \"2019-08-24T14:15:22+00:00\",\n          \"lot_number\": \"2222\",\n          \"sku\": \"string\"\n        }\n      ],\n      \"tracking_number\": \"860C8CDC8F0B4FC7AB69AC86C20539EC\"\n    }\n  ],\n  \"expected_arrival_date\": \"2099-08-24T14:15:22+00:00\",\n  \"fulfillment_center\": {\n    \"id\": 0\n  },\n  \"purchase_order_number\": \"string\"\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.patch("https://api.shipbob.com/Experimental/receiving/1")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"boxes\": [\n    {\n      \"box_items\": [\n        {\n          \"quantity\": 1,\n          \"inventory_id\": 0,\n          \"lot_date\": \"2019-08-24T14:15:22+00:00\",\n          \"lot_number\": \"2222\",\n          \"sku\": \"string\"\n        }\n      ],\n      \"tracking_number\": \"860C8CDC8F0B4FC7AB69AC86C20539EC\"\n    }\n  ],\n  \"expected_arrival_date\": \"2099-08-24T14:15:22+00:00\",\n  \"fulfillment_center\": {\n    \"id\": 0\n  },\n  \"purchase_order_number\": \"string\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.shipbob.com/Experimental/receiving/1', [
  'body' => '{
  "boxes": [
    {
      "box_items": [
        {
          "quantity": 1,
          "inventory_id": 0,
          "lot_date": "2019-08-24T14:15:22+00:00",
          "lot_number": "2222",
          "sku": "string"
        }
      ],
      "tracking_number": "860C8CDC8F0B4FC7AB69AC86C20539EC"
    }
  ],
  "expected_arrival_date": "2099-08-24T14:15:22+00:00",
  "fulfillment_center": {
    "id": 0
  },
  "purchase_order_number": "string"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp default
using RestSharp;

var client = new RestClient("https://api.shipbob.com/Experimental/receiving/1");
var request = new RestRequest(Method.PATCH);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"boxes\": [\n    {\n      \"box_items\": [\n        {\n          \"quantity\": 1,\n          \"inventory_id\": 0,\n          \"lot_date\": \"2019-08-24T14:15:22+00:00\",\n          \"lot_number\": \"2222\",\n          \"sku\": \"string\"\n        }\n      ],\n      \"tracking_number\": \"860C8CDC8F0B4FC7AB69AC86C20539EC\"\n    }\n  ],\n  \"expected_arrival_date\": \"2099-08-24T14:15:22+00:00\",\n  \"fulfillment_center\": {\n    \"id\": 0\n  },\n  \"purchase_order_number\": \"string\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift default
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "boxes": [
    [
      "box_items": [
        [
          "quantity": 1,
          "inventory_id": 0,
          "lot_date": "2019-08-24T14:15:22+00:00",
          "lot_number": "2222",
          "sku": "string"
        ]
      ],
      "tracking_number": "860C8CDC8F0B4FC7AB69AC86C20539EC"
    ]
  ],
  "expected_arrival_date": "2099-08-24T14:15:22+00:00",
  "fulfillment_center": ["id": 0],
  "purchase_order_number": "string"
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.shipbob.com/Experimental/receiving/1")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PATCH"
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()
```

### rename_purchase_order_only

**Request**

```json
{
  "purchase_order_number": "PO 12345 REV A"
}
```

**Response**

```json
{
  "box_labels_uri": "https://api.shipbob.com/1.0/receiving/1/labels",
  "box_packaging_type": "EverythingInOneBox",
  "expected_arrival_date": "2019-08-24T14:15:22+00:00",
  "external_sync_timestamp": "2019-08-24T14:15:22+00:00",
  "fulfillment_center": {
    "address1": "5900 W Ogden Ave",
    "address2": "Suite 100",
    "city": "Cicero",
    "country": "USA",
    "email": "example@example.com",
    "id": 0,
    "name": "Cicero (IL)",
    "phone_number": "555-555-5555",
    "state": "IL",
    "timezone": "Central Standard Time",
    "zip_code": "60804"
  },
  "id": 0,
  "insert_date": "2019-08-24T14:15:22+00:00",
  "inventory_quantities": [
    {
      "expected_quantity": 0,
      "inventory_id": 0,
      "received_quantity": 0,
      "sku": "string",
      "stowed_quantity": 0
    }
  ],
  "last_updated_date": "2019-08-24T14:15:22+00:00",
  "package_type": "Package",
  "purchase_order_number": "string",
  "status": "Awaiting",
  "status_history": [
    {
      "id": 0,
      "status": "Processing",
      "timestamp": "2019-08-24T14:15:22+00:00"
    }
  ]
}
```

**SDK Code**

```python rename_purchase_order_only
import requests

url = "https://api.shipbob.com/Experimental/receiving/1"

payload = { "purchase_order_number": "PO 12345 REV A" }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript rename_purchase_order_only
const url = 'https://api.shipbob.com/Experimental/receiving/1';
const options = {
  method: 'PATCH',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"purchase_order_number":"PO 12345 REV A"}'
};

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

```go rename_purchase_order_only
package main

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

func main() {

	url := "https://api.shipbob.com/Experimental/receiving/1"

	payload := strings.NewReader("{\n  \"purchase_order_number\": \"PO 12345 REV A\"\n}")

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

	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 rename_purchase_order_only
require 'uri'
require 'net/http'

url = URI("https://api.shipbob.com/Experimental/receiving/1")

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

request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"purchase_order_number\": \"PO 12345 REV A\"\n}"

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

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

HttpResponse<String> response = Unirest.patch("https://api.shipbob.com/Experimental/receiving/1")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"purchase_order_number\": \"PO 12345 REV A\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.shipbob.com/Experimental/receiving/1', [
  'body' => '{
  "purchase_order_number": "PO 12345 REV A"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp rename_purchase_order_only
using RestSharp;

var client = new RestClient("https://api.shipbob.com/Experimental/receiving/1");
var request = new RestRequest(Method.PATCH);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"purchase_order_number\": \"PO 12345 REV A\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift rename_purchase_order_only
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["purchase_order_number": "PO 12345 REV A"] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.shipbob.com/Experimental/receiving/1")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PATCH"
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()
```