# Movements

**GET** `/v1/inventory/movements`

Returns the immutable stock movement ledger. Every stock change — receive, transfer, adjustment, sale, return — is recorded here. Rows are never edited or deleted.

### Query parameters

| Field | Type | Description |
|---|---|---|
| `listing_id` | integer | Filter by listing |
| `location_id` | integer | Filter by location |
| `movement_type` | string | Filter by type: `receive`, `transfer_in`, `transfer_out`, `adjustment`, `sale`, `return` |
| `page` | integer | Page number (0-indexed, default 0) |
| `page_size` | integer | Results per page (max 200, default 50) |

### Response fields

| Field | Type | Description |
|---|---|---|
| `count` | integer | Total matching movements |
| `movements` | array | List of movement objects |

**Movement object**

| Field | Type | Description |
|---|---|---|
| `id` | integer | Movement ID |
| `movement_type` | string | Type of movement |
| `quantity_delta` | integer | Change in quantity (positive = in, negative = out) |
| `quantity_after` | integer | Snapshot of total quantity at the location after this movement |
| `batch_id` | integer | Linked batch (nullable) |
| `reference_type` | string | What triggered this movement (e.g. `purchase_order`, `stock_transfer`) |
| `reference_id` | integer | ID of the triggering record |
| `note` | string | Free-text note |
| `created_by` | integer | User ID who triggered the movement |
| `created_at` | timestamp | When the movement occurred |
| `listing` | object | Associated listing (`id`, `sku`, `barcode`) |
| `location` | object | Associated location (`id`, `name`, `code`) |
| `batch` | object | Associated batch (`id`, `lot_number`, `expiry_date`) if applicable |
