# RelocateStockInput

input type

Relocate-input for relocateStock. A location is a Bin or (side absent) the DERIVED un-binned pool: bin-to-bin, pool-to-bin (put-away), bin-to-pool (take-out); at least ONE side names a bin and an equal pair refuses. Both bins must belong to the item logical facility (relocate is intra-LF by law); the to-bin must be ACTIVE (the from-bin may be any status — the healing direction). Lot fields ride ONLY on lot-controlled items.

## Fields

| Field | Type | Required | Notes |
| --- | --- | --- | --- |
| `inventoryItemId` | [ID](/types/#scalars) `ID!` | yes | The InventoryItem id — tenant-scoped + ACTIVE-gated + STOCKED-gated server-side. |
| `quantity` | [String](/types/#scalars) `String!` | yes | The moved quantity — a strictly POSITIVE decimal string. |
| `bucket` | [StockBucket](/types/StockBucket/) | no | The relocated bucket — on_hand \| damaged \| held; DEFAULTED to on_hand when omitted. |
| `fromBinId` | [ID](/types/#scalars) | no | The source Bin id; ABSENT = the un-binned pool. |
| `toBinId` | [ID](/types/#scalars) | no | The target Bin id; ABSENT = the un-binned pool. |
| `lotCode` | [String](/types/#scalars) | no | The lot identity. |
| `lotExpiresAt` | [String](/types/#scalars) | no | The lot expiry (UTC instant) — birth-stamps the lot record; a later mismatch refuses; a record missing it is enriched. |
| `caption` | [String](/types/#scalars) | no | No further notes. |
| `refs` | [String](/types/#scalars) `[String!]` | no | No further notes. |

## Used by

- [relocateStock](/reference/inventory-operations/relocateStock/)
