# Inventory

Stock levels per product and per location

Section: api. Audience: public. Updated: 2026-10-10.

---
Stock levels per product and per location.

5 operations, generated from the [OpenAPI file](/openapi/horizon-api.yaml). Authentication and the base URL are described in the [API overview](/api/).

## <span class="nh-method nh-method-get" id="inventory_list">GET</span> `/api/inventory/`

List stock levels

Operation ID `inventory_list`. Authentication: `ApiKeyAuth`.

#### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `expiring_within_days` | query | integer | No | Rows holding a batch that expires within this many days. |
| `location` | query | integer | No | Location id. |
| `low_stock` | query | boolean | No | Rows with a reorder point whose available stock is at or below it, and above zero. |
| `out_of_stock` | query | boolean | No | Rows with no available stock. |
| `page` | query | integer | No | A page number within the paginated result set. |
| `page_size` | query | integer | No | Number of results to return per page. |
| `q` | query | string | No | Search SKU, GTIN, name or brand. |

#### Responses

| Status | Description | Body |
| --- | --- | --- |
| `200` |  | [`PaginatedStockLevelList`](#schema-PaginatedStockLevelList) (`application/json`) |

#### Example

```bash
curl "https://api.horizonlogistics.eu/api/inventory/" \
  -H "Authorization: Api-Key $HORIZON_API_KEY"
```

## <span class="nh-method nh-method-get" id="inventory_location_stock_retrieve">GET</span> `/api/inventory/location-stock/`

Stock totals per location

Operation ID `inventory_location_stock_retrieve`. Authentication: `ApiKeyAuth`.

#### Responses

| Status | Description | Body |
| --- | --- | --- |
| `200` |  | [`LocationStockTotals`](#schema-LocationStockTotals) (`application/json`) |

#### Example

```bash
curl "https://api.horizonlogistics.eu/api/inventory/location-stock/" \
  -H "Authorization: Api-Key $HORIZON_API_KEY"
```

## <span class="nh-method nh-method-get" id="inventory_retrieve">GET</span> `/api/inventory/{product_id}/`

Retrieve a product's stock

Operation ID `inventory_retrieve`. Authentication: `ApiKeyAuth`.

#### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `product_id` | path | integer | Yes |  |

#### Responses

| Status | Description | Body |
| --- | --- | --- |
| `200` |  | [`ProductStock`](#schema-ProductStock) (`application/json`) |

#### Example

```bash
curl "https://api.horizonlogistics.eu/api/inventory/{product_id}/" \
  -H "Authorization: Api-Key $HORIZON_API_KEY"
```

## <span class="nh-method nh-method-get" id="locations_list">GET</span> `/api/locations/`

List locations

Operation ID `locations_list`. Authentication: `ApiKeyAuth`.

#### Responses

| Status | Description | Body |
| --- | --- | --- |
| `200` |  | array of [`Location`](#schema-Location) (`application/json`) |

#### Example

```bash
curl "https://api.horizonlogistics.eu/api/locations/" \
  -H "Authorization: Api-Key $HORIZON_API_KEY"
```

## <span class="nh-method nh-method-get" id="locations_retrieve">GET</span> `/api/locations/{id}/`

Retrieve a location

Operation ID `locations_retrieve`. Authentication: `ApiKeyAuth`.

#### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | integer | Yes |  |

#### Responses

| Status | Description | Body |
| --- | --- | --- |
| `200` |  | [`Location`](#schema-Location) (`application/json`) |

#### Example

```bash
curl "https://api.horizonlogistics.eu/api/locations/{id}/" \
  -H "Authorization: Api-Key $HORIZON_API_KEY"
```

## Schemas

The objects the operations above send and receive. Fields of a nested object are listed under their parent (`address.city`, `lines[].sku`); a nested named object links to its own entry.

### <span class="nh-anchor" id="schema-InventoryBatchRef">InventoryBatchRef</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | integer | Yes |  |
| `batch_code` | string | Yes |  |
| `produced_at` | string (date-time), nullable | Yes |  |
| `expires_at` | string (date-time), nullable | Yes |  |
| `days_until_expiry` | integer, nullable | Yes |  |
| `recall_state` | string | Yes |  |

### <span class="nh-anchor" id="schema-InventoryBinRef">InventoryBinRef</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | integer | Yes |  |
| `code` | string | Yes |  |
| `zone` | string | Yes |  |

### <span class="nh-anchor" id="schema-InventoryLocationRef">InventoryLocationRef</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | integer | Yes |  |
| `code` | string | Yes |  |
| `name` | string | Yes |  |

### <span class="nh-anchor" id="schema-InventoryMovementSummary">InventoryMovementSummary</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | integer | Yes |  |
| `delta` | integer | Yes |  |
| `movement_type` | string | Yes |  |
| `source` | string | Yes |  |
| `source_ref` | string | Yes |  |
| `shopify_order_url` | string, nullable | Yes |  |
| `occurred_at` | string (date-time) | Yes |  |
| `actor_id` | integer, nullable | Yes |  |
| `notes` | string | Yes |  |
| `location_code` | string, nullable | Yes |  |
| `bin_code` | string, nullable | Yes |  |

### <span class="nh-anchor" id="schema-Location">Location</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | integer | Yes | Read-only. |
| `code` | string | Yes | Max length 320. |
| `name` | string | Yes | Max length 128. |
| `location_type` | string (enum) | Yes | `warehouse` - warehouse; `store` - store; `3pl` - 3pl; `dropship` - dropship; `transit` - transit; `virtual` - virtual. |
| `address1` | string | No | Max length 200. |
| `city` | string | No | Max length 100. |
| `postal_code` | string | No | Max length 20. |
| `country` | string | Yes | Max length 2. |
| `geo` | any, nullable | No |  |
| `is_active` | boolean | No |  |
| `is_fulfillable` | boolean | No |  |
| `is_default` | boolean | No |  |
| `shopify_location_id` | integer, nullable | Yes | Read-only. |
| `floor_area_m2` | string (decimal), nullable | No | Pattern `^-?\d{0,8}(?:\.\d{0,2})?$`. |
| `storage_type` | string (enum), may be blank | No | One of: `ambient`, `racked`, `bulk`, `mezzanine`, `automated`, `cross_dock`. |
| `temperature_zone` | string (enum), may be blank | No | One of: `ambient`, `chilled`, `frozen`, `controlled`. |
| `created_at` | string (date-time) | Yes | Read-only. |
| `updated_at` | string (date-time) | Yes | Read-only. |

### <span class="nh-anchor" id="schema-LocationStockTotal">LocationStockTotal</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `location_id` | integer | Yes |  |
| `units_on_hand` | integer | Yes |  |
| `sku_count` | integer | Yes | Products with stock on hand. |
| `last_movement_at` | string (date-time), nullable | Yes |  |

### <span class="nh-anchor" id="schema-LocationStockTotals">LocationStockTotals</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `results` | array of [`LocationStockTotal`](#schema-LocationStockTotal) | Yes |  |

### <span class="nh-anchor" id="schema-PaginatedStockLevelList">PaginatedStockLevelList</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `count` | integer | Yes |  |
| `next` | string (uri), nullable | No |  |
| `previous` | string (uri), nullable | No |  |
| `results` | array of [`StockLevel`](#schema-StockLevel) | Yes |  |

### <span class="nh-anchor" id="schema-ProductStock">ProductStock</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `product` | [`ProductStockProduct`](#schema-ProductStockProduct) | Yes |  |
| `levels` | array of [`ProductStockLocation`](#schema-ProductStockLocation) | Yes |  |
| `movements_recent` | array of [`InventoryMovementSummary`](#schema-InventoryMovementSummary) | Yes | The latest stock movements of the product, newest first. |

### <span class="nh-anchor" id="schema-ProductStockBatch">ProductStockBatch</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `batch` | [`InventoryBatchRef`](#schema-InventoryBatchRef) | Yes |  |
| `on_hand` | integer | Yes |  |
| `committed` | integer | Yes |  |
| `available` | integer | Yes |  |

### <span class="nh-anchor" id="schema-ProductStockBin">ProductStockBin</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `bin` | [`InventoryBinRef`](#schema-InventoryBinRef), nullable | Yes | Null for stock not assigned to a bin. |
| `on_hand` | integer | Yes |  |
| `committed` | integer | Yes |  |
| `reserved` | integer | Yes |  |
| `available` | integer | Yes |  |

### <span class="nh-anchor" id="schema-ProductStockLocation">ProductStockLocation</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `location` | [`InventoryLocationRef`](#schema-InventoryLocationRef) | Yes |  |
| `on_hand_total` | integer | Yes |  |
| `committed_total` | integer | Yes |  |
| `reserved_total` | integer | Yes |  |
| `available_total` | integer | Yes |  |
| `reorder_point` | integer, nullable | Yes |  |
| `reorder_point_source` | string | Yes |  |
| `bin_breakdown` | array of [`ProductStockBin`](#schema-ProductStockBin) | Yes |  |
| `batch_breakdown` | array of [`ProductStockBatch`](#schema-ProductStockBatch) | Yes | Batches with stock at this location, soonest expiry first. |

### <span class="nh-anchor" id="schema-ProductStockProduct">ProductStockProduct</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `recall` | string (enum), nullable | Yes | The strictest open recall of the product's batches, or null.; `voluntary` - voluntary; `mandatory` - mandatory. One of: `voluntary`, `mandatory`. |
| `id` | integer | Yes |  |
| `sku` | string | Yes |  |
| `gtin` | string, nullable | Yes |  |
| `name` | string | Yes |  |
| `brand` | string, nullable | Yes |  |
| `image` | string | Yes | Product image URL, or an empty string. |
| `ppwr_grade` | string | Yes | Always an empty string for now. |
| `is_kit` | boolean | Yes |  |

### <span class="nh-anchor" id="schema-StockLevel">StockLevel</span>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `location` | [`InventoryLocationRef`](#schema-InventoryLocationRef) | Yes |  |
| `recall` | string (enum), nullable | Yes | The strictest open recall of the product's batches, or null.; `voluntary` - voluntary; `mandatory` - mandatory. One of: `voluntary`, `mandatory`. |
| `product_id` | integer | Yes |  |
| `sku` | string | Yes |  |
| `gtin` | string, nullable | Yes |  |
| `name` | string | Yes |  |
| `brand` | string, nullable | Yes |  |
| `is_kit` | boolean | Yes |  |
| `image` | string | Yes | Product image URL, or an empty string. |
| `on_hand` | integer | Yes |  |
| `committed` | integer | Yes |  |
| `reserved` | integer | Yes |  |
| `available` | integer | Yes | On hand less committed and reserved. |
| `ppwr_grade` | string | Yes | Always an empty string for now. |
| `earliest_expiry` | string (date-time), nullable | Yes |  |
| `expiring_soon` | boolean | Yes |  |
| `batch_count` | integer | Yes |  |
| `stock_status` | string | Yes |  |
| `reorder_point` | integer, nullable | Yes |  |
| `reorder_point_source` | string | Yes | `auto`, `manual`, or empty when no reorder point is set. |
| `abc_class` | string | Yes |  |
| `last_counted_at` | string (date-time), nullable | Yes |  |