Overview
The inventory/transfer/product endpoint moves a quantity of one product within a single warehouse. Use it for simple location-to-location moves and for transfers involving LPs (license plates), lot-tracked items, changes to inventory status (for example marking stock as damaged), and converting a higher pack type to UOM units on the way.
You can identify entities by their unique Identifier (GUID) or, for convenience, by human-readable codes (for example productSku, sourceWarehouseLocationCode).
To move a whole LP or everything in a location, use API Guide: Transfer Location or License Plate instead.
When to use it
Your WMS integration or robot controller moves stock between bins and needs Logiwa IO to reflect it.
You need to move damaged stock to a quarantine location, or mark good stock as damaged as it moves.
You break cases into units when moving them to a pick face.
Endpoint details
URL:v3.1/inventory/transfer/productMethod:POST
Request body parameters
Primary transaction details
Parameter | Type | Required | Description |
| String | Yes | The unique identifier for the client account. |
| String | Yes | The warehouse where the transfer happens. |
| String | Yes | The product being transferred. Provide one. |
| String | Yes | The location the product moves from. Provide one. |
| String | Yes | The location the product moves to. Provide one. |
| Integer | Yes | The quantity to transfer, in the pack type given below. |
| String | Yes | The pack type being moved (for example Each, Case). Provide one. |
LP identifiers
Parameter | Type | Required | Description |
| String | No | The source LP. Required only if the stock is on an LP. |
| String | No | The target LP, if moving stock onto an LP. |
Inventory attribute fields
Parameter | Type | Required | Description |
| String | No | Lot or batch number. Required for lot-tracked products. |
| String | No | Expiry date (e.g. "YYYY-MM-DD"). Required for expiry-tracked products. |
| String | No | Production date (e.g. "YYYY-MM-DD"). |
Inventory status fields
Parameter | Type | Required | Description |
| String | No | The damage status of the stock at the source. Use it when moving stock that is already damaged. |
| String | No | Changes the damage status as part of the transfer, for example to mark good stock as "Damaged" while moving it to a damage location. |
Pack type conversion
Parameter | Type | Required | Description |
| Boolean | No (default | When |
When conversion is requested, Logiwa IO checks every rule below before moving anything. Conversion and the move happen in one step: if anything fails, nothing changes.
Rule | Example of a rejected request |
|
|
The source stock must have no damage reason |
|
The source stock must be in Stock status (not allocated, picked, packed, sorted or loaded) | The case line is allocated to a shipment order |
Conversion can't be combined with a new damage reason | Both |
The product must have a UOM ratio | Case has no units-per-case set |
The resulting units keep the lot, expiry date, production date, receiving date and PO number of the original stock. The damage reason and serial numbers are not carried over. See Understanding Pack Type Conversion: Lineage, Limitations and Audit Trail.
Alternative human-readable identifiers
Parameter | Description |
| Display name of the client. |
| Code of the source warehouse. |
| SKU of the product. Alternative to |
| Name of the pack type. Alternative to |
| Code of the source location. |
| Number of the source LP. |
| Code of the target location. |
| Number of the target LP. |
How the quantity is taken
If the product sits on several inventory lines at the source (for example different receiving dates), Logiwa IO takes from them in turn until the quantity is reached. If the total isn't enough, the request is rejected and nothing moves.
Example: You request 12 cases. One line has 5 and another has 20. Logiwa IO moves 5 + 7. A request for 30 cases with only 25 available is rejected.
Example requests
1. Basic transfer using codes
{
"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
{
"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
{
"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"
}4. Converting cases to units during transfer
The product has 12 units per case. Two cases leave BULK-05-D and arrive at PICK-02-B as 24 units.
{
"clientIdentifier": "69205154-6C72-440C-ACC1-8F207CC3092D",
"sourceWarehouseCode": "WH1",
"productSku": "CASE-ITEM-010",
"packTypeName": "Case",
"sourceWarehouseLocationCode": "BULK-05-D",
"targetWarehouseLocationCode": "PICK-02-B",
"quantity": 2,
"breakHigherPackTypeToUom": true
}Responses
Success: HTTP 200 OK:
{ "value" : true }Failure: an error status (for example 400 Bad Request) with a message explaining why. Example for an expiry-tracked product sent without expiryDate:
{
"message" : "This product has expiry date tracking, the expiry date field cannot be empty",
"data" : false,
"code" : "BadRequest",
"status" : 2
}Conversion errors return these messages:
Situation | Message |
Source has a damage reason | "Pack type conversion could not be completed because this stock line has a damage reason recorded. Remove the damage reason or transfer without conversion." |
New damage reason sent too | "Pack type conversion and marking inventory as damaged cannot be performed in the same operation. Remove the damage reason field or set breakHigherPackTypeToUom to false." |
UOM pack type sent | "Pack type conversion requires a higher pack type. The selected inventory is already at unit level and cannot be converted." |
Common questions
Can I convert part of a case? No. quantity is in whole packs of the pack type you send, and each pack becomes its full number of units.
Can I transfer allocated stock with this endpoint? Yes. Allocated stock can be moved, and the related task is updated accordingly. It can't be converted to units in the same transfer, because conversion needs stock in Stock status.
Can the source and target location be the same? Only if something else changes, such as the LP or the damage status. Otherwise the request is rejected.
