Skip to main content

API Guide: Transfer Product

Use the Logiwa IO Open API inventory/transfer/product endpoint to move a quantity of one product between locations or LPs, change its damage status, or convert cases to units as it moves.

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

clientIdentifier

String

Yes

The unique identifier for the client account.

sourceWarehouseIdentifier

String

Yes

The warehouse where the transfer happens.

productIdentifier or productSku

String

Yes

The product being transferred. Provide one.

sourceWarehouseLocationIdentifier or sourceWarehouseLocationCode

String

Yes

The location the product moves from. Provide one.

targetWarehouseLocationIdentifier or targetWarehouseLocationCode

String

Yes

The location the product moves to. Provide one.

quantity

Integer

Yes

The quantity to transfer, in the pack type given below.

packTypeIdentifier or packTypeName

String

Yes

The pack type being moved (for example Each, Case). Provide one.

LP identifiers

Parameter

Type

Required

Description

sourceLicensePlateIdentifier or sourceLicensePlateNumber

String

No

The source LP. Required only if the stock is on an LP.

targetLicensePlateIdentifier or targetLicensePlateNumber

String

No

The target LP, if moving stock onto an LP.

Inventory attribute fields

Parameter

Type

Required

Description

lotBatchNumber

String

No

Lot or batch number. Required for lot-tracked products.

expiryDate

String

No

Expiry date (e.g. "YYYY-MM-DD"). Required for expiry-tracked products.

productionDate

String

No

Production date (e.g. "YYYY-MM-DD").

Inventory status fields

Parameter

Type

Required

Description

damageReasonIdentifier or damageReasonName

String

No

The damage status of the stock at the source. Use it when moving stock that is already damaged.

newDamageReasonIdentifier or newDamageReasonName

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

breakHigherPackTypeToUom

Boolean

No (default false)

When true, the stock is converted from its higher pack type (Case, Pallet, Box…) to UOM units as part of the transfer.

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

packTypeName/packTypeIdentifier must be a higher pack type

"packTypeName": "Each" with conversion on

The source stock must have no damage reason

damageReasonName is "Crushed"

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 breakHigherPackTypeToUom: true and newDamageReasonName sent

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

clientDisplayName

Display name of the client.

sourceWarehouseCode

Code of the source warehouse.

productSku

SKU of the product. Alternative to productIdentifier.

packTypeName

Name of the pack type. Alternative to packTypeIdentifier.

sourceWarehouseLocationCode

Code of the source location.

sourceLicensePlateNumber

Number of the source LP.

targetWarehouseLocationCode

Code of the target location.

targetLicensePlateNumber

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.

Did this answer your question?