# StockRecord

object type

One StockRecord bin/lot SHARD of an InventoryItem: NOT a construct — sysId-less and FSM-less, existing only where stock has landed in a bin (zero records = everything un-binned, the small-merchant case). Carries ONLY the three LOCATABLE buckets (reserved is a claim overlay, in_transit is not physically here — both stay on the item caches); quantities are NON-NEGATIVE (a relocate refuses driving a record negative — CONFLICT/INSUFFICIENT_STOCK). The DERIVED un-binned pool = item caches minus the record sums (see verifyInventoryItem). Records persist at zero; a zeroed record does NOT block its bin (the moved-or-zeroed rule).

## Fields

| Field | Type | Notes |
| --- | --- | --- |
| `inventoryItemId` | [ID](/types/#scalars) `ID!` | The owning InventoryItem. |
| `binId` | [ID](/types/#scalars) `ID!` | The Bin holding this shard. |
| `lotCode` | [String](/types/#scalars) | The lot identity. |
| `lotExpiresAt` | [String](/types/#scalars) | The lot expiry (UTC instant) — birth-stamped; a later mismatch refuses; a record missing it is enriched by the next lotted relocate that supplies one. |
| `onHandQty` | [String](/types/#scalars) `String!` | No further notes. |
| `damagedQty` | [String](/types/#scalars) `String!` | No further notes. |
| `heldQty` | [String](/types/#scalars) `String!` | No further notes. |
| `createdAt` | [String](/types/#scalars) `String!` | No further notes. |
| `updatedAt` | [String](/types/#scalars) `String!` | No further notes. |
| `revisionNum` | [Int](/types/#scalars) `Int!` | No further notes. |

## Used by

- [binStock](/reference/reading-your-records/binStock/)
- [stockRecords](/reference/reading-your-records/stockRecords/)
