Skip to main content

API Guide: Transfer Product

Updated over a week ago

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

clientIdentifier

String

Yes

The unique identifier for the client account.

sourceWarehouseIdentifier

String

Yes

The identifier of the warehouse where the transfer is occurring.

productIdentifier or productSku

String

Yes

The identifier for the product being transferred. You must provide one of these.

sourceWarehouseLocationIdentifier or sourceWarehouseLocationCode

String

Yes

The identifier of the location from which the product is being moved. You must provide one of these.

targetWarehouseLocationIdentifier or targetWarehouseLocationCode

String

Yes

The identifier of the location to which the product is being moved. You must provide one of these.

quantity

Integer

Yes

The total quantity of the product to transfer.

packTypeIdentifier or packTypeName

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

sourceLicensePlateIdentifier or sourceLicensePlateNumber

String

No

The source LPN. Required only if the inventory is being moved from an LPN.

targetLicensePlateIdentifier or targetLicensePlateNumber

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

lotBatchNumber

String

No

The lot or batch number of the product. Required for lot-tracked items.

expiryDate

String

No

The expiration date of the product (e.g., "YYYY-MM-DD").

productionDate

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

damageReasonIdentifier or damageReasonName

String

No

Specifies the damage status of the inventory at the source location. Use this if transferring already damaged stock.

newDamageReasonIdentifier or newDamageReasonName

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

clientDisplayName

String

The display name of the client.

sourceWarehouseCode

String

The human-readable code for the source warehouse.

productSku

String

The SKU of the product. Alternative to productIdentifier.

packTypeName

String

The name of the pack type. Alternative to packTypeIdentifier.

sourceWarehouseLocationCode

String

The code for the source location. Alternative to sourceWarehouseLocationIdentifier.

sourceLicensePlateNumber

String

The number of the source LPN. Alternative to sourceLicensePlateIdentifier.

targetWarehouseLocationCode

String

The code for the target location. Alternative to targetWarehouseLocationIdentifier.

targetLicensePlateNumber

String

The number of the target LPN. Alternative to targetLicensePlateIdentifier.


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
}
Did this answer your question?