List stock
Was this page helpful?
List stock
Get the stock of your items, with a breakdown per warehouse.
Overview
Returns the stock of your items: the number on sale, the units on hand, each stock state, and the same per warehouse.
Request
GET/stock
Needs the permission stock:read
cURL
curl "https://api.o2m.in/api/v1/stock?limit=50" \
-H "X-Access-Key: $O2M_ACCESS_KEY" \
-H "X-Secret-Key: $O2M_SECRET_KEY"Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
sku | string | No | One exact SKU. |
warehouse_id | string | No | Show only this warehouse's numbers. sellable stays company-wide. |
updated_since | date and time | No | Only items whose stock changed at or after this time, for example 2026-10-02T10:00:00Z. |
limit | number | No | Rows per page, from 1 to 500. The default is 100. |
cursor | string | No | The next value of the page before. See Pagination. |
Response
200 with items and next.
Response
{
"items": [
{
"sku": "MUG-BLUE",
"title": "Blue mug",
"product_id": "MP-000123",
"variant_id": null,
"sellable": 15,
"on_hand": 15,
"available": 15,
"committed": 0,
"qc_hold": 0,
"damaged": 0,
"quarantine": 0,
"reserved": 0,
"incoming": 0,
"in_transit": 0,
"warehouses": [
{
"id": "1",
"code": "DEFAULT",
"name": "Default warehouse",
"on_hand": 10,
"available": 10,
"committed": 0,
"qc_hold": 0,
"damaged": 0,
"quarantine": 0,
"reserved": 0,
"incoming": 0,
"in_transit": 0
},
{
"id": "2",
"code": "BLR",
"name": "Bengaluru",
"on_hand": 5,
"available": 5,
"committed": 0,
"qc_hold": 0,
"damaged": 0,
"quarantine": 0,
"reserved": 0,
"incoming": 0,
"in_transit": 0
}
],
"client": null,
"updated_at": "2026-10-02T09:30:00.000Z"
}
],
"next": null
}| Field | Type | Description |
|---|---|---|
sku | string | The item's SKU. |
title | string | The product name. |
product_id | string | The product's ID in O2M. |
variant_id | string or null | The variant's ID, or null for a product without variants. |
sellable | number | The number O2M offers to your sales channels, across the whole company. A warehouse filter does not change it. |
on_hand | number | Units physically in the warehouses this request covers. |
available | number | On hand and free to sell. |
committed | number | On hand and held for orders. |
qc_hold | number | Waiting for a quality check. |
damaged | number | Damaged and not sellable. |
quarantine | number | Expired, recalled or not found. |
reserved | number | Kept aside by hand. |
incoming | number | Ordered from a supplier and not yet received. |
in_transit | number | On the way between warehouses. |
warehouses | array | The same numbers per warehouse, each with id, code and name. |
client | string or null | The code of the 3PL client that owns the item, or null. |
updated_at | string or null | When the stock last changed. |
Good to know An item O2M has not yet started tracking per warehouse shows its stock as sellable and available, with an empty warehouses list. It is left out when you filter by updated_since.
Errors
| Status | Code | Message | What to do |
|---|---|---|---|
| 403 | — | This key cannot read that warehouse | The key is limited to other warehouses. |
| 422 | — | updated_since must be a date and time, for example 2026-10-02T10:00:00Z | Correct the value. |
| 422 | — | warehouse_id must be a warehouse id | Use an id from List warehouses. |
Every endpoint can also return the common errors: a missing or invalid key, a missing permission, the rate limit, or a temporary failure.