Stock & transfers

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

GET read_inventory

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

GET read_inventory

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

simple, variant, or group.

Example: variant
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.

Example: true
page integer

Page number, starting at 1.

Example: 1
limit integer

Rows per page, up to the limits endpoint's list_max_limit.

Example: 50
sort_by string

One of the limits endpoint's sort_columns. Invalid values return a coded 400.

Example: created_at
sort_direction string

asc or desc.

Example: desc

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 STOCK_LEVEL_PER_PAGE_RANGE

    Limit is outside 1..list_max_limit.

  • 400 STOCK_LEVEL_INVALID_SORT_BY

    Sort column is not in sort_columns.

  • 400 STOCK_LEVEL_INVALID_SORT_DIR

    Sort direction must be asc or desc.

  • 400 STOCK_LEVEL_SEARCH_TOO_LONG

    Search exceeds the search length limit.

  • 400 STOCK_LEVEL_ITEM_TYPE_FILTER_INVALID

    item_type is not simple, variant, or group.

List movements

GET read_inventory

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

simple, variant, or group.

reason string

One movement reason (see the limits endpoint's all_reasons).

Example: received
search string

Matches SKU or item title.

from_date string

Inclusive start date, YYYY-MM-DD in the store timezone.

to_date string

Inclusive end date, YYYY-MM-DD in the store timezone.

page integer

Page number, starting at 1.

Example: 1
limit integer

Rows per page, up to the limits endpoint's list_max_limit.

Example: 50
sort_by string

One of the limits endpoint's sort_columns. Invalid values return a coded 400.

Example: created_at
sort_direction string

asc or desc.

Example: desc

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 INVENTORY_MOVEMENT_LIST_INVALID_SORT_BY

    Sort column is not in sort_columns.

  • 400 INVENTORY_MOVEMENT_LIST_INVALID_SORT_DIRECTION

    Sort direction must be asc or desc.

  • 400 INVENTORY_MOVEMENT_LIST_INVALID_TYPE

    item_type is not simple, variant, or group.

  • 400 INVENTORY_MOVEMENT_SEARCH_TOO_LONG

    Search exceeds the search length limit.

List low-stock items

GET read_inventory

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 scope=overall.

type string

simple, variant, or group.

scope string

per_location or overall (inventory-group aggregate thresholds).

search string

Matches SKU or item title.

page integer

Page number, starting at 1.

Example: 1
limit integer

Rows per page, up to the limits endpoint's list_max_limit.

Example: 50
sort_by string

One of the limits endpoint's sort_columns. Invalid values return a coded 400.

Example: created_at
sort_direction string

asc or desc.

Example: desc

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 LOW_STOCK_LIST_INVALID_SORT_BY

    Sort column is not in sort_columns.

  • 400 LOW_STOCK_LIST_INVALID_SORT_DIRECTION

    Sort direction must be asc or desc.

  • 400 LOW_STOCK_LIST_INVALID_TYPE

    type is not simple, variant, or group.

  • 400 LOW_STOCK_LIST_INVALID_SCOPE

    scope is not per_location or overall.

  • 400 LOW_STOCK_SEARCH_TOO_LONG

    Search exceeds the search length limit.

Apply adjustments

POST write_inventory

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 max_batch_size rows. Each row: sku (string, required — resolves to a simple product, variant, or inventory group), exactly one of adjust (integer, signed delta) or set (integer ≥ 0, absolute), and reason (string, required — one of the limits endpoint's user_reasons).

Errors

  • 400 STOCK_LEVEL_BATCH_ITEMS_REQUIRED

    The batch has no rows.

  • 400 STOCK_LEVEL_BATCH_TOO_LARGE

    The batch exceeds the adjustment batch cap.

  • 400 STOCK_LEVEL_REASON_INVALID

    A row's reason is not one of the user reasons.

  • 400 LOCATION_NOT_FOUND

    The location does not exist in this store.

  • 403 LOCATION_APP_MANAGED_NO_EDIT

    The location belongs to another app or its owning installation is inactive.

List transfers

GET read_inventory

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

pending, in_transit, completed, or cancelled.

search string

Matches the reference number.

from_date string

Inclusive start date, YYYY-MM-DD in the store timezone.

to_date string

Inclusive end date, YYYY-MM-DD in the store timezone.

page integer

Page number, starting at 1.

Example: 1
limit integer

Rows per page, up to the limits endpoint's list_max_limit.

Example: 50
sort_by string

One of the limits endpoint's sort_columns. Invalid values return a coded 400.

Example: created_at
sort_direction string

asc or desc.

Example: desc

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 TRANSFER_LIST_INVALID_SORT_BY

    Sort column is not in sort_columns.

  • 400 TRANSFER_LIST_INVALID_SORT_DIRECTION

    Sort direction must be asc or desc.

  • 400 TRANSFER_STATUS_FILTER_INVALID

    Status filter is not a transfer status.

  • 400 TRANSFER_SEARCH_TOO_LONG

    Search exceeds the search length limit.

Get transfer

GET read_inventory

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).

Example: d3b7c2a4-91e5-4f0a-b6c8-2f4e5a6b7c8d

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 404 TRANSFER_NOT_FOUND

    Transfer does not exist in this store.

Create transfer

POST write_inventory

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 reference_number_max_length.

notes string

Free-form notes, up to notes_max_length.

items required array

Up to max_items_per_transfer rows. Each row: item_type (simple, variant, or group), the matching id field (product_id, variant_id, or group_id), and quantity (integer ≥ 1, validated against available stock at the source).

Errors

  • 400 TRANSFER_SAME_LOCATIONS

    Source and destination locations are the same.

  • 400 TRANSFER_ITEMS_REQUIRED

    The transfer has no items.

  • 400 TRANSFER_TOO_MANY_ITEMS

    The transfer exceeds max_items_per_transfer.

  • 400 TRANSFER_INSUFFICIENT_STOCK

    A line's quantity exceeds available stock at the source location.

  • 400 TRANSFER_ITEM_TYPE_INVALID

    A line's item_type is not simple, variant, or group.

  • 404 TRANSFER_SOURCE_LOCATION_NOT_FOUND

    The source location does not exist in this store.

  • 404 TRANSFER_DEST_LOCATION_NOT_FOUND

    The destination location does not exist in this store.

Update transfer status

POST write_inventory

Advance or cancel a transfer.

Moves the transfer through its lifecycle: pendingin_transit (ship), in_transitcompleted (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).

Example: d3b7c2a4-91e5-4f0a-b6c8-2f4e5a6b7c8d

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Body parameters

Name Type Description
status required string

Target status: in_transit (from pending), completed or cancelled (from in_transit).

Errors

  • 400 TRANSFER_STATUS_TRANSITION_INVALID

    The target status is not reachable from the transfer's current status.

  • 404 TRANSFER_NOT_FOUND

    Transfer does not exist in this store.

Delete transfer

DELETE write_inventory

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).

Example: d3b7c2a4-91e5-4f0a-b6c8-2f4e5a6b7c8d

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 TRANSFER_STATUS_TRANSITION_INVALID

    The target status is not reachable from the transfer's current status.

  • 404 TRANSFER_NOT_FOUND

    Transfer does not exist in this store.

List restock requests

GET read_inventory

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

pending, notified, converted, cancelled, or expired.

contact_type string

email or phone.

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.

Example: 1
limit integer

Rows per page, up to the limits endpoint's list_max_limit.

Example: 50
sort_by string

One of the limits endpoint's sort_columns. Invalid values return a coded 400.

Example: created_at
sort_direction string

asc or desc.

Example: desc

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 INVENTORY_RESTOCK_LIST_LIMIT_RANGE

    Limit is outside 1..list_max_limit.

  • 400 INVENTORY_RESTOCK_LIST_PAGE_INVALID

    Page must be 1 or greater.

  • 400 INVENTORY_RESTOCK_LIST_STATUS_INVALID

    Status filter is not in the allowed set.

  • 400 INVENTORY_RESTOCK_LIST_CONTACT_TYPE_INVALID

    Contact type is not email or phone.

  • 400 INVENTORY_RESTOCK_LIST_SEARCH_TOO_LONG

    Search exceeds the search length limit.

  • 400 INVENTORY_RESTOCK_LIST_INVALID_SORT_BY

    Sort column is not in sort_columns.

  • 400 INVENTORY_RESTOCK_LIST_INVALID_SORT_DIR

    Sort direction must be asc or desc.