When products arrive from your supplier, use the receive endpoint to record the receipt, update inventory levels, and track quality issues. This endpoint automatically updates your inventory and manages purchase order status.
Use the POST method with /v2/purchase_orders/{purchase_order_id}/receives to record product receipts from a purchase order.
| Parameter | Type | Description |
|---|---|---|
purchase_order_id | string | The unique identifier of the purchase order being received |
| Property | Type | Description |
|---|---|---|
product_receives | array | Array of products being received (required, minimum 1 product) |
Each product in the product_receives array requires:
| Property | Type | Required | Description |
|---|---|---|---|
inventory_location_id | string | Required | Location where the inventory is being received |
received_quantity | integer | Optional | Quantity actually received (minimum: 1). At least one of received_quantity or rejected_quantity must be provided and greater than 0. |
sku | string | Required | Stock Keeping Unit identifier |
rejected_quantity | integer | Optional | Quantity rejected due to quality issues (minimum: 1). At least one of received_quantity or rejected_quantity must be provided and greater than 0. |
lot | string | Optional | Lot number for tracking batches |
expiration_date | string (date-time) | Optional | Expiration date for perishable items (ISO 8601 format) |
When you receive products, ShipStation automatically:
- Updates Inventory: Adds
received_quantityto the specifiedinventory_location_id - Updates Purchase Order Status:
- First partial receive:
open→receiving - All products fully received:
open→receivedorreceiving→received
- First partial receive:
- Records Receive History: Tracks what was received, when, and where
POST /v2/purchase_orders/{purchase_order_id}/receives
- Productionhttps://api.shipstation.com/v2/purchase_orders/{purchase_order_id}/receives
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://api.shipstation.com/v2/purchase_orders/se-234/receives \
-H 'Content-Type: application/json' \
-H 'api-key: YOUR_API_KEY_HERE' \
-d '{
"product_receives": [
{
"sku": "WIDGET-001",
"inventory_location_id": "se-12345",
"received_quantity": 95,
"rejected_quantity": 5,
"lot": "LOT-2025-001",
"expiration_date": "2026-01-01T00:00:00Z"
}
]
}'Receive all ordered quantity in one shipment:
{
"product_receives": [
{
"sku": "WIDGET-001",
"inventory_location_id": "se-12345",
"received_quantity": 100
}
]
}Receive part of an order (remaining quantity can be received later):
{
"product_receives": [
{
"sku": "WIDGET-001",
"inventory_location_id": "se-12345",
"received_quantity": 60
}
]
}After receiving 60 of 100 units, the purchase order status changes to receiving. You can make additional receive calls later for the remaining 40 units.
Record damaged or rejected items:
{
"product_receives": [
{
"sku": "WIDGET-001",
"inventory_location_id": "se-12345",
"received_quantity": 95,
"rejected_quantity": 5
}
]
}The inventory will be increased by 95 units (only the received_quantity). The 5 rejected units are not added to inventory but are tracked.
Track lot numbers and expiration dates:
{
"product_receives": [
{
"sku": "WIDGET-001",
"inventory_location_id": "se-12345",
"received_quantity": 100,
"lot": "LOT-2025-001",
"expiration_date": "2026-01-01T00:00:00Z"
}
]
}Receive multiple products from the same purchase order:
{
"product_receives": [
{
"sku": "WIDGET-001",
"inventory_location_id": "se-12345",
"received_quantity": 100
},
{
"sku": "GADGET-002",
"inventory_location_id": "se-12345",
"received_quantity": 50
}
]
}Receive the same product into different warehouse locations:
{
"product_receives": [
{
"sku": "WIDGET-001",
"inventory_location_id": "se-12345",
"received_quantity": 60
},
{
"sku": "WIDGET-001",
"inventory_location_id": "se-67890",
"received_quantity": 40
}
]
}Purchase order with 100 units ordered:
- Initial State: Status is
open - First Receive (60 units): Status →
receiving - Second Receive (40 units): Status →
received(order complete)
Purchase order with multiple products:
- Product A: Ordered 100, Received 100 ✓
- Product B: Ordered 50, Received 30 (partial)
- Status:
receiving(because Product B is incomplete) - Product B: Additional receive of 20 units
- Status:
received(all products complete)
Common errors when receiving products:
- 400 Bad Request: Missing required fields or invalid data format
- Invalid inventory location
- Purchase order in invalid state for receiving
- 404 Not Found: Purchase order or product ID doesn't exist
- Cannot receive products from a
cancelledpurchase order - Cannot receive products from a
receivedpurchase order (already complete) inventory_location_idmust exist and be active- At least one of
received_quantityorrejected_quantitymust be provided and greater than 0