Overview
This article outlines how to use the inventory/transfer/product
API endpoint to perform inventory transfers within a single warehouse. This is a powerful endpoint that can be used for simple location-to-location moves, as well as more complex transfers involving LPNs, lot-tracked items, and changes to inventory status (e.g., marking items as damaged).
You can identify entities using their unique Identifier
(GUID) or, for convenience, their human-readable codes (e.g., productSku
, sourceWarehouseLocationCode
).
Endpoint Details
URL: v3.1/inventory/transfer/product
Method: POST
Request Body Parameters
The parameters are grouped by function for clarity.
Primary Transaction Details
These are the fundamental fields required for most transfers.
Parameter | Type | Required | Description |
| String | Yes | The unique identifier for the client account. |
| String | Yes | The identifier of the warehouse where the transfer is occurring. |
| String | Yes | The identifier for the product being transferred. You must provide one of these. |
| String | Yes | The identifier of the location from which the product is being moved. You must provide one of these. |
| String | Yes | The identifier of the location to which the product is being moved. You must provide one of these. |
| Integer | Yes | The total quantity of the product to transfer. |
| String | Yes | The package type of the product being moved (e.g., Each, Case). You must provide one of these. |
LPN (License Plate Number) Identifiers
Use these optional fields when transferring inventory from or to an LPN.
Parameter | Type | Required | Description |
| String | No | The source LPN. Required only if the inventory is being moved from an LPN. |
| String | No | The target LPN. Use this if moving inventory to an LPN. |
Inventory Attribute Fields
Use these fields when transferring products that have specific tracking requirements.
Parameter | Type | Required | Description |
| String | No | The lot or batch number of the product. Required for lot-tracked items. |
| String | No | The expiration date of the product (e.g., "YYYY-MM-DD"). |
| String | No | The production date of the product (e.g., "YYYY-MM-DD"). |
Inventory Status Fields
Use these fields to manage the condition of the inventory during the transfer.
Parameter | Type | Required | Description |
| String | No | Specifies the damage status of the inventory at the source location. Use this if transferring already damaged stock. |
| String | No | Changes the inventory status as part of the transfer. For example, use this to move good stock to a damage location and mark it as "Damaged". |
Alternative Human-Readable Identifiers
These fields are provided as alternatives to the GUID Identifier
fields for convenience.
Parameter | Type | Description |
| String | The display name of the client. |
| String | The human-readable code for the source warehouse. |
| String | The SKU of the product. Alternative to |
| String | The name of the pack type. Alternative to |
| String | The code for the source location. Alternative to |
| String | The number of the source LPN. Alternative to |
| String | The code for the target location. Alternative to |
| String | The number of the target LPN. Alternative to |
Example Requests
1. Basic Transfer Using Codes
This shows a simple transfer of good-quality stock from one location to another.
{
"clientIdentifier": "69205154-6C72-440C-ACC1-8F207CC3092D",
"sourceWarehouseCode": "WH1",
"productSku": "STD-ITEM-002",
"packTypeName": "Each",
"sourceWarehouseLocationCode": "BULK-05-D",
"targetWarehouseLocationCode": "PICK-02-B",
"quantity": 50
}
2. Transferring Already Damaged Inventory
This shows how to move inventory that is already damaged. The damageReasonName
field specifies the status of the inventory being moved.
{
"clientIdentifier": "69205154-6C72-440C-ACC1-8F207CC3092D",
"sourceWarehouseCode": "WH1",
"productSku": "LOT-ITEM-001",
"packTypeName": "Each",
"sourceWarehouseLocationCode": "INSPECT-01",
"targetWarehouseLocationCode": "QUARANTINE-A",
"quantity": 10,
"lotBatchNumber": "LOT54321",
"damageReasonName": "Scratched"
}
3. Changing Inventory Status During Transfer
This example shows moving good inventory and marking it as damaged during the transfer by using the newDamageReasonName
field.
{
"clientIdentifier": "69205154-6C72-440C-ACC1-8F207CC3092D",
"sourceWarehouseCode": "WH1",
"productSku": "LOT-ITEM-001",
"packTypeName": "Each",
"sourceWarehouseLocationCode": "PICK-01-A",
"targetWarehouseLocationIdentifier": "9b7d8c0f-a1b2-3c4d-5e6f-7a8b9c0d1e2f",
"quantity": 10,
"lotBatchNumber": "LOT54321",
"expiryDate": "2028-12-31",
"newDamageReasonName": "Damaged In Transit"
}
Success Response
A successful request will return an HTTP status code 200 OK
and the following response body.
JSON
{ "value" : true }
Failed Response
If a request is invalid or cannot be processed, the API will return an error with an appropriate HTTP status code (e.g., 400 Bad Request
). The response body will contain a message explaining the reason for the failure.
Example Failed Response
This error occurs when attempting to transfer an expiry-tracked product without providing the required expiryDate
field.
JSON
{
"message" : "This product has expiry date tracking, the expiry date field cannot be empty",
"data" : false,
"code" : "BadRequest",
"status" : 2
}