The inventory plane covers what no single catalog resource owns. Reads use read_inventory; writes use write_inventory.
A SKU is a store-wide address: simple products, variants, and inventory groups share one SKU registry, so POST /inventory/adjustments resolves any of the three from the SKU alone. Adjustments are batched with per-row results — one bad row never rolls back the others — and each applied row writes the movement ledger with your app as the actor, re-evaluates low-stock, and emits inventory_levels/update. Prefer adjust (signed delta, safe under concurrency) over set unless you are reconciling a physical count; reasons come from the same six-value enum merchants use.
Two fields are scope-gated for privacy. Movement reference_type/reference_id (the order behind a sale) appear only when your token also holds read_orders. Restock request contact details appear only with read_customers — otherwise they arrive redacted and can_view_contact is false.
Transfers move stock between locations: create (pending), ship (in_transit), then complete — completion is the stock-mutating step, writing transfer_out/transfer_in ledger rows and stock-level webhooks for both locations atomically. Only pending transfers can be deleted.
Endpoints#
Inventory limits
Fetch inventory plane limits and enums.
Returns the paging caps, sort columns, item types, the user reason enum accepted by adjustments, the adjustment batch cap, and the movement retention window enforced by the services.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
List stock levels
List per-location stock for every tracked item.
Returns one row per (item, location) across simple products, variants, and inventory groups: on-hand quantity, reserved, available, backorder/preorder demand, low-stock threshold and state. Filter by location, item type, SKU search, or low-stock only. Query validation is strict: invalid sort or filter values return coded 400s, never silent defaults.
Query parameters
| Name | Type | Description |
|---|---|---|
location_id
|
string |
Only stock at this location (UUID). |
item_type
|
string |
|
search
|
string |
Matches SKU exactly or item title as a prefix search. |
low_stock_only
|
boolean |
Only rows at or below their low-stock threshold. |
page
|
integer |
Page number, starting at 1. |
limit
|
integer |
Rows per page, up to the limits endpoint's |
sort_by
|
string |
One of the limits endpoint's |
sort_direction
|
string |
|
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400STOCK_LEVEL_PER_PAGE_RANGELimit is outside 1..list_max_limit.
-
400STOCK_LEVEL_INVALID_SORT_BYSort column is not in sort_columns.
-
400STOCK_LEVEL_INVALID_SORT_DIRSort direction must be asc or desc.
-
400STOCK_LEVEL_SEARCH_TOO_LONGSearch exceeds the search length limit.
-
400STOCK_LEVEL_ITEM_TYPE_FILTER_INVALIDitem_type is not simple, variant, or group.
List movements
List the unified stock movement ledger.
Returns the append-only ledger every stock change writes — admin edits, imports, scanner sessions, transfers, order fulfillment, and your own adjustments — newest first. reference_type and reference_id (e.g. the order behind a movement) are included only when the token also holds read_orders; without it the movement row is returned with those fields omitted. Rows are retained for the window reported by the limits endpoint.
Query parameters
| Name | Type | Description |
|---|---|---|
location_id
|
string |
Only movements at this location (UUID). |
item_type
|
string |
|
reason
|
string |
One movement reason (see the limits endpoint's |
search
|
string |
Matches SKU or item title. |
from_date
|
string |
Inclusive start date, |
to_date
|
string |
Inclusive end date, |
page
|
integer |
Page number, starting at 1. |
limit
|
integer |
Rows per page, up to the limits endpoint's |
sort_by
|
string |
One of the limits endpoint's |
sort_direction
|
string |
|
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400INVENTORY_MOVEMENT_LIST_INVALID_SORT_BYSort column is not in sort_columns.
-
400INVENTORY_MOVEMENT_LIST_INVALID_SORT_DIRECTIONSort direction must be asc or desc.
-
400INVENTORY_MOVEMENT_LIST_INVALID_TYPEitem_type is not simple, variant, or group.
-
400INVENTORY_MOVEMENT_SEARCH_TOO_LONGSearch exceeds the search length limit.
List low-stock items
List items at or below their low-stock threshold.
Returns items whose available stock is at or below the configured threshold, with the deficit (threshold minus available). Covers per-location thresholds and inventory-group overall thresholds; filter by scope, type, or location.
Query parameters
| Name | Type | Description |
|---|---|---|
location_id
|
string |
Only alerts at this location. Ignored when |
type
|
string |
|
scope
|
string |
|
search
|
string |
Matches SKU or item title. |
page
|
integer |
Page number, starting at 1. |
limit
|
integer |
Rows per page, up to the limits endpoint's |
sort_by
|
string |
One of the limits endpoint's |
sort_direction
|
string |
|
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400LOW_STOCK_LIST_INVALID_SORT_BYSort column is not in sort_columns.
-
400LOW_STOCK_LIST_INVALID_SORT_DIRECTIONSort direction must be asc or desc.
-
400LOW_STOCK_LIST_INVALID_TYPEtype is not simple, variant, or group.
-
400LOW_STOCK_LIST_INVALID_SCOPEscope is not per_location or overall.
-
400LOW_STOCK_SEARCH_TOO_LONGSearch exceeds the search length limit.
Apply adjustments
Apply a batch of stock adjustments by SKU.
Applies up to the batch cap of adjustments in one request. Each row addresses an item by SKU — simple product, variant, or inventory group resolve identically — at one location, and either adjusts by a signed delta (adjust) or writes an absolute quantity (set). App tokens may target merchant-managed locations and locations owned by their own active installation; they cannot write another app's location. Rows are applied independently: the response reports per-row success or a coded error, and one bad row never rolls back the others. Every applied row writes the movement ledger with your app as the actor, re-evaluates low-stock, and emits inventory_levels/update. Deltas are safe under concurrency; prefer them over set unless you are reconciling a physical count.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
location_id
required
|
string |
Location every row in this batch applies to (UUID). |
items
required
|
array |
Up to the limits endpoint's |
Errors
-
400STOCK_LEVEL_BATCH_ITEMS_REQUIREDThe batch has no rows.
-
400STOCK_LEVEL_BATCH_TOO_LARGEThe batch exceeds the adjustment batch cap.
-
400STOCK_LEVEL_REASON_INVALIDA row's reason is not one of the user reasons.
-
400LOCATION_NOT_FOUNDThe location does not exist in this store.
-
403LOCATION_APP_MANAGED_NO_EDITThe location belongs to another app or its owning installation is inactive.
List transfers
List stock transfers.
Returns paginated transfers with status, locations, item counts, and total quantity. Filter by status or date range; search matches the reference number.
Query parameters
| Name | Type | Description |
|---|---|---|
status
|
string |
|
search
|
string |
Matches the reference number. |
from_date
|
string |
Inclusive start date, |
to_date
|
string |
Inclusive end date, |
page
|
integer |
Page number, starting at 1. |
limit
|
integer |
Rows per page, up to the limits endpoint's |
sort_by
|
string |
One of the limits endpoint's |
sort_direction
|
string |
|
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400TRANSFER_LIST_INVALID_SORT_BYSort column is not in sort_columns.
-
400TRANSFER_LIST_INVALID_SORT_DIRECTIONSort direction must be asc or desc.
-
400TRANSFER_STATUS_FILTER_INVALIDStatus filter is not a transfer status.
-
400TRANSFER_SEARCH_TOO_LONGSearch exceeds the search length limit.
Get transfer
Fetch one transfer with its items.
Returns the transfer, its status history timestamps, and every line item with quantities.
Path parameters
| Name | Type | Description |
|---|---|---|
transferId
required
|
string |
Transfer id (UUID). |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
404TRANSFER_NOT_FOUNDTransfer does not exist in this store.
Create transfer
Create a stock transfer between two locations.
Creates a pending transfer. Items address stock by item type and id; quantities are validated against available stock at the source location. Creating a transfer reserves nothing — stock moves when the transfer completes.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
from_location_id
required
|
string |
Source location (UUID). Must differ from the destination. |
to_location_id
required
|
string |
Destination location (UUID). |
reference_number
|
string |
Your reference, up to the limits endpoint's |
notes
|
string |
Free-form notes, up to |
items
required
|
array |
Up to |
Errors
-
400TRANSFER_SAME_LOCATIONSSource and destination locations are the same.
-
400TRANSFER_ITEMS_REQUIREDThe transfer has no items.
-
400TRANSFER_TOO_MANY_ITEMSThe transfer exceeds max_items_per_transfer.
-
400TRANSFER_INSUFFICIENT_STOCKA line's quantity exceeds available stock at the source location.
-
400TRANSFER_ITEM_TYPE_INVALIDA line's item_type is not simple, variant, or group.
-
404TRANSFER_SOURCE_LOCATION_NOT_FOUNDThe source location does not exist in this store.
-
404TRANSFER_DEST_LOCATION_NOT_FOUNDThe destination location does not exist in this store.
Update transfer status
Advance or cancel a transfer.
Moves the transfer through its lifecycle: pending → in_transit (ship), in_transit → completed (receive) or cancelled. Completing is the stock-mutating step: it decrements the source location and increments the destination atomically, writing transfer_out/transfer_in movement rows and inventory_levels/update webhooks for both locations.
Path parameters
| Name | Type | Description |
|---|---|---|
transferId
required
|
string |
Transfer id (UUID). |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
status
required
|
string |
Target status: |
Errors
-
400TRANSFER_STATUS_TRANSITION_INVALIDThe target status is not reachable from the transfer's current status.
-
404TRANSFER_NOT_FOUNDTransfer does not exist in this store.
Delete transfer
Delete a pending transfer.
Deletes a transfer that has not shipped. Transfers that are in transit, completed, or cancelled are immutable history and cannot be deleted.
Path parameters
| Name | Type | Description |
|---|---|---|
transferId
required
|
string |
Transfer id (UUID). |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400TRANSFER_STATUS_TRANSITION_INVALIDThe target status is not reachable from the transfer's current status.
-
404TRANSFER_NOT_FOUNDTransfer does not exist in this store.
List restock requests
List customer back-in-stock subscriptions.
Returns customer "notify me when available" requests with product, status, and lifecycle timestamps — restock demand data for planning. Contact details (email or phone) are PII: they are returned only when the token also holds read_customers, and arrive redacted otherwise. The response's can_view_contact flag reports which mode you are in.
Query parameters
| Name | Type | Description |
|---|---|---|
status
|
string |
|
contact_type
|
string |
|
product_id
|
integer |
Only requests for this product. |
variant_id
|
integer |
Only requests for this variant. |
search
|
string |
Matches product title. |
page
|
integer |
Page number, starting at 1. |
limit
|
integer |
Rows per page, up to the limits endpoint's |
sort_by
|
string |
One of the limits endpoint's |
sort_direction
|
string |
|
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400INVENTORY_RESTOCK_LIST_LIMIT_RANGELimit is outside 1..list_max_limit.
-
400INVENTORY_RESTOCK_LIST_PAGE_INVALIDPage must be 1 or greater.
-
400INVENTORY_RESTOCK_LIST_STATUS_INVALIDStatus filter is not in the allowed set.
-
400INVENTORY_RESTOCK_LIST_CONTACT_TYPE_INVALIDContact type is not email or phone.
-
400INVENTORY_RESTOCK_LIST_SEARCH_TOO_LONGSearch exceeds the search length limit.
-
400INVENTORY_RESTOCK_LIST_INVALID_SORT_BYSort column is not in sort_columns.
-
400INVENTORY_RESTOCK_LIST_INVALID_SORT_DIRSort direction must be asc or desc.