Inventory Groups

Inventory Groups require inventory scopes. Reads use read_inventory; writes use write_inventory. Creating an inventory group requires name and sku; slug is optional and is generated from the name when omitted. Create the group first, then add its per-location stock rows with the bulk stock endpoint. Group responses include selling policy, aggregate stock, committed demand, and overall low-stock state; use the dedicated quantity and threshold endpoints for location stock changes. Successful stock changes update the movement ledger and fire stock-level webhooks atomically, while a failed write changes nothing.

Endpoints#

Inventory Group limits

GET read_inventory

Fetch inventory group limits and field constraints.

Returns the field lengths, quantity caps, stock thresholds, page-size caps, and sort columns enforced by the inventory service.

Headers

Name Type Description
Authorization required string

Bearer Store API token.

List inventory groups

GET read_inventory

List store inventory groups.

Returns paginated inventory groups with aggregate stock, committed demand, linked product counts, and low-stock state. Query validation is enforced by the inventory service.

Query parameters

Name Type Description
page integer

Page number.

Example: 1
limit integer

Page size.

Example: 50
search string

Search inventory groups by name, slug, or SKU.

Example: BLANK-TEE-POOL
low_stock_only boolean

When true, return only low-stock groups.

Example: false
location_id string

Filter to groups with stock at this location.

Example: loc_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2
sort_by string

Sort field from the Inventory Group list contract.

Allowed values
namequantitycreated_at
Example: name
sort_direction string

Sort direction from the Inventory Group list contract.

Allowed values
ascdesc
Example: asc

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 VALIDATION_LIST_INVALID_PAGE

    Page must be at least 1.

  • 400 VALIDATION_LIST_INVALID_LIMIT

    Limit is outside the inventory group contract.

  • 400 VALIDATION_LIST_INVALID_SORT_BY

    Sort field is not allowed for this endpoint.

  • 400 VALIDATION_LIST_INVALID_SORT_DIRECTION

    Sort direction must be asc or desc.

  • 400 VALIDATION_SEARCH_TOO_LONG

    Search exceeds the inventory group search limit.

  • 404 INVENTORY_GROUP_NOT_FOUND

    Inventory Group does not exist in this store.

Get inventory group

GET read_inventory

Fetch one inventory group by id.

Returns the inventory group, its aggregate stock, linked products and variants count, and per-location stock rows.

Path parameters

Name Type Description
groupId required uuid

Inventory Group id.

Example: ig_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 404 INVENTORY_GROUP_NOT_FOUND

    Inventory Group does not exist in this store.

Create inventory group

POST write_inventory

Create inventory group.

Creates a stock pool. name and sku are required. slug is optional on create and is generated from the name when omitted. SKU uniqueness is checked across products, variants, and inventory groups.

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Body parameters

Name Type Description
name required string

Inventory Group name.

Example: Print Blanks
sku required string

Unique SKU for the stock pool.

Example: BLANK-TEE-POOL
slug string

Optional slug. Omit to generate from name.

Example: print-blanks
description string

Optional internal description.

Example: Shared stock pool for blank T-shirts.
allow_backorder boolean

Whether group-backed items can keep selling below zero available stock.

Example: false
backorder_max_qty integer

Optional maximum backorder quantity. Null means uncapped.

Example: 25
preorder_enabled boolean

Whether group-backed items sell as preorder.

Example: false
preorder_release_at string

RFC3339 release date. Required when preorder is enabled.

Example: 2026-09-01T09:00:00Z
preorder_max_qty integer

Optional maximum preorder quantity. Null means uncapped.

Example: 100
preorder_charge_mode string

One of pay_immediate, pay_on_release, or reserve_only. Required when preorder is enabled.

Example: pay_on_release
overall_low_stock_threshold integer

Optional threshold for total available stock across all locations. Null disables the overall alert.

Example: 40

Errors

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request JSON could not be parsed.

  • 400 INVENTORY_GROUP_NAME_REQUIRED

    Name is empty after normalization.

  • 400 INVENTORY_GROUP_NAME_TOO_LONG

    Name exceeds the Inventory Group contract max length.

  • 400 INVENTORY_GROUP_NAME_INVALID_CHARS

    Name contains invalid characters.

  • 400 INVENTORY_GROUP_SKU_REQUIRED

    SKU is empty after normalization.

  • 400 INVENTORY_GROUP_SKU_TOO_LONG

    SKU exceeds the Inventory Group contract max length.

  • 400 INVENTORY_GROUP_SKU_INVALID_CHARS

    SKU contains invalid characters.

  • 400 INVENTORY_GROUP_SKU_INVALID_FORMAT

    SKU contains characters outside the shared SKU contract.

  • 400 INVENTORY_GROUP_SLUG_REQUIRED

    Slug is empty on update. Blank slug auto-generation is only available on create.

  • 400 INVENTORY_GROUP_SLUG_INVALID_FORMAT

    Slug is not valid for inventory group URLs.

  • 400 INVENTORY_GROUP_SLUG_TOO_LONG

    Slug exceeds the Inventory Group contract max length.

  • 400 INVENTORY_GROUP_SLUG_GENERATION_FAILED

    A slug could not be generated from the name.

  • 409 INVENTORY_GROUP_UNIQUE_SLUG_GENERATION_FAILED

    A unique slug could not be generated for this store.

  • 400 INVENTORY_GROUP_DESCRIPTION_TOO_LONG

    Description exceeds the Inventory Group contract max length.

  • 400 INVENTORY_GROUP_DESCRIPTION_INVALID_CHARS

    Description contains invalid characters.

  • 400 INVENTORY_GROUP_THRESHOLD_NEGATIVE

    Low-stock threshold cannot be negative.

  • 400 INVENTORY_GROUP_THRESHOLD_TOO_LARGE

    Low-stock threshold exceeds the contract maximum.

  • 400 INVENTORY_GROUP_BACKORDER_MAX_QTY_POSITIVE

    Backorder maximum must be positive when set.

  • 400 INVENTORY_GROUP_BACKORDER_MAX_QTY_TOO_LARGE

    Backorder maximum exceeds the contract maximum.

  • 400 INVENTORY_GROUP_PREORDER_BACKORDER_CONFLICT

    Backorder and preorder cannot both be enabled.

  • 400 INVENTORY_GROUP_PREORDER_RELEASE_REQUIRED

    Preorder release date is required when preorder is enabled.

  • 400 INVENTORY_GROUP_PREORDER_RELEASE_PAST

    Preorder release date must be in the future.

  • 400 INVENTORY_GROUP_PREORDER_CHARGE_MODE_REQUIRED

    Preorder charge mode is required when preorder is enabled.

  • 400 INVENTORY_GROUP_PREORDER_CHARGE_MODE_INVALID

    Preorder charge mode is not one of the allowed values.

  • 400 INVENTORY_GROUP_PREORDER_MAX_QTY_POSITIVE

    Preorder maximum must be positive when set.

  • 400 INVENTORY_GROUP_PREORDER_MAX_QTY_TOO_LARGE

    Preorder maximum exceeds the contract maximum.

  • 404 INVENTORY_GROUP_NOT_FOUND

    Inventory Group does not exist in this store.

  • 409 INVENTORY_GROUP_DUPLICATE

    Slug or SKU already exists in this store or SKU is already used by another SKU-backed resource.

  • 409 SKU_IN_USE_BY_PRODUCT

    SKU is already used by a product.

  • 409 SKU_IN_USE_BY_VARIANT

    SKU is already used by a product variant.

  • 409 SKU_IN_USE_BY_GROUP

    SKU is already used by another inventory group.

  • 409 SKU_IN_USE

    SKU is already used by another SKU-backed resource.

  • 409 INVENTORY_GROUP_LIMIT_REACHED

    Store Inventory Group cap has been reached.

Update inventory group

PUT write_inventory

Update inventory group.

Updates provided fields. Omitted fields stay unchanged. Send null to clear nullable limit and threshold fields. Empty strings are normalized according to each text field's shared contract.

Path parameters

Name Type Description
groupId required uuid

Inventory Group id.

Example: ig_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Body parameters

Name Type Description
name string

Inventory Group name.

Example: Print Blanks
sku string

Unique SKU for the stock pool.

Example: BLANK-TEE-POOL
slug string

Optional slug. Omit to generate from name.

Example: print-blanks
description string

Optional internal description.

Example: Shared stock pool for blank T-shirts.
allow_backorder boolean

Whether group-backed items can keep selling below zero available stock.

Example: false
backorder_max_qty integer

Optional maximum backorder quantity. Null means uncapped.

Example: 25
preorder_enabled boolean

Whether group-backed items sell as preorder.

Example: false
preorder_release_at string

RFC3339 release date. Required when preorder is enabled.

Example: 2026-09-01T09:00:00Z
preorder_max_qty integer

Optional maximum preorder quantity. Null means uncapped.

Example: 100
preorder_charge_mode string

One of pay_immediate, pay_on_release, or reserve_only. Required when preorder is enabled.

Example: pay_on_release
overall_low_stock_threshold integer

Optional threshold for total available stock across all locations. Null disables the overall alert.

Example: 40

Errors

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request JSON could not be parsed.

  • 400 INVENTORY_GROUP_NAME_REQUIRED

    Name is empty after normalization.

  • 400 INVENTORY_GROUP_NAME_TOO_LONG

    Name exceeds the Inventory Group contract max length.

  • 400 INVENTORY_GROUP_NAME_INVALID_CHARS

    Name contains invalid characters.

  • 400 INVENTORY_GROUP_SKU_REQUIRED

    SKU is empty after normalization.

  • 400 INVENTORY_GROUP_SKU_TOO_LONG

    SKU exceeds the Inventory Group contract max length.

  • 400 INVENTORY_GROUP_SKU_INVALID_CHARS

    SKU contains invalid characters.

  • 400 INVENTORY_GROUP_SKU_INVALID_FORMAT

    SKU contains characters outside the shared SKU contract.

  • 400 INVENTORY_GROUP_SLUG_REQUIRED

    Slug is empty on update. Blank slug auto-generation is only available on create.

  • 400 INVENTORY_GROUP_SLUG_INVALID_FORMAT

    Slug is not valid for inventory group URLs.

  • 400 INVENTORY_GROUP_SLUG_TOO_LONG

    Slug exceeds the Inventory Group contract max length.

  • 400 INVENTORY_GROUP_SLUG_GENERATION_FAILED

    A slug could not be generated from the name.

  • 409 INVENTORY_GROUP_UNIQUE_SLUG_GENERATION_FAILED

    A unique slug could not be generated for this store.

  • 400 INVENTORY_GROUP_DESCRIPTION_TOO_LONG

    Description exceeds the Inventory Group contract max length.

  • 400 INVENTORY_GROUP_DESCRIPTION_INVALID_CHARS

    Description contains invalid characters.

  • 400 INVENTORY_GROUP_THRESHOLD_NEGATIVE

    Low-stock threshold cannot be negative.

  • 400 INVENTORY_GROUP_THRESHOLD_TOO_LARGE

    Low-stock threshold exceeds the contract maximum.

  • 400 INVENTORY_GROUP_BACKORDER_MAX_QTY_POSITIVE

    Backorder maximum must be positive when set.

  • 400 INVENTORY_GROUP_BACKORDER_MAX_QTY_TOO_LARGE

    Backorder maximum exceeds the contract maximum.

  • 400 INVENTORY_GROUP_PREORDER_BACKORDER_CONFLICT

    Backorder and preorder cannot both be enabled.

  • 400 INVENTORY_GROUP_PREORDER_RELEASE_REQUIRED

    Preorder release date is required when preorder is enabled.

  • 400 INVENTORY_GROUP_PREORDER_RELEASE_PAST

    Preorder release date must be in the future.

  • 400 INVENTORY_GROUP_PREORDER_CHARGE_MODE_REQUIRED

    Preorder charge mode is required when preorder is enabled.

  • 400 INVENTORY_GROUP_PREORDER_CHARGE_MODE_INVALID

    Preorder charge mode is not one of the allowed values.

  • 400 INVENTORY_GROUP_PREORDER_MAX_QTY_POSITIVE

    Preorder maximum must be positive when set.

  • 400 INVENTORY_GROUP_PREORDER_MAX_QTY_TOO_LARGE

    Preorder maximum exceeds the contract maximum.

  • 404 INVENTORY_GROUP_NOT_FOUND

    Inventory Group does not exist in this store.

  • 409 INVENTORY_GROUP_DUPLICATE

    Slug or SKU already exists in this store or SKU is already used by another SKU-backed resource.

  • 409 SKU_IN_USE_BY_PRODUCT

    SKU is already used by a product.

  • 409 SKU_IN_USE_BY_VARIANT

    SKU is already used by a product variant.

  • 409 SKU_IN_USE_BY_GROUP

    SKU is already used by another inventory group.

  • 409 SKU_IN_USE

    SKU is already used by another SKU-backed resource.

  • 409 INVENTORY_GROUP_LIMIT_REACHED

    Store Inventory Group cap has been reached.

Delete inventory group

DELETE write_inventory

Delete inventory group.

Deletes the group only when no products, variants, or active transfers still reference it.

Path parameters

Name Type Description
groupId required uuid

Inventory Group id.

Example: ig_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 404 INVENTORY_GROUP_NOT_FOUND

    Inventory Group does not exist in this store.

  • 409 INVENTORY_GROUP_DELETE_HAS_PRODUCTS

    Inventory Group still has linked products.

  • 409 INVENTORY_GROUP_DELETE_HAS_VARIANTS

    Inventory Group still has linked variants.

  • 409 INVENTORY_GROUP_DELETE_HAS_TRANSFERS

    Inventory Group still has pending or in-transit transfers.

Set inventory group quantity

POST write_inventory

Set absolute stock at one location.

Writes an absolute quantity for one group-location row. App-managed locations are writable only by their owning active installation. The new quantity cannot be below reserved stock. Successful changes update the stock ledger and aggregate stock together and fire inventory_levels/update — a failure leaves nothing partially written.

Path parameters

Name Type Description
groupId required uuid

Inventory Group id.

Example: ig_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Body parameters

Name Type Description
location_id required string

Location id.

Example: loc_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2
quantity required integer

Absolute quantity at the location.

Example: 240
reason required string

Inventory movement reason.

Example: recount
notes string

Optional movement note.

Example: Initial warehouse count

Errors

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request JSON could not be parsed.

  • 400 INVENTORY_GROUP_LOCATION_REQUIRED

    Location is required.

  • 400 INVENTORY_GROUP_LOCATIONS_REQUIRED

    At least one location is required.

  • 400 INVENTORY_GROUP_LOCATIONS_NOT_FOUND

    One or more locations do not exist in this store.

  • 400 INVENTORY_GROUP_LOCATION_DUPLICATE

    The same location appears more than once.

  • 400 INVENTORY_GROUP_QUANTITY_NEGATIVE

    Quantity cannot be negative.

  • 400 INVENTORY_GROUP_QUANTITY_TOO_LARGE

    Quantity exceeds the contract maximum.

  • 400 INVENTORY_GROUP_QUANTITY_BELOW_RESERVED

    Quantity cannot be set below reserved stock.

  • 400 INVENTORY_GROUP_ADJUST_NEGATIVE

    Adjustment would make quantity negative.

  • 400 INVENTORY_GROUP_ADJUST_BELOW_RESERVED

    Adjustment would make quantity lower than reserved stock.

  • 400 INVENTORY_GROUP_ADJUST_TOO_LARGE

    Adjustment would exceed the contract maximum.

  • 400 INVENTORY_GROUP_THRESHOLD_NEGATIVE

    Low-stock threshold cannot be negative.

  • 400 INVENTORY_GROUP_THRESHOLD_TOO_LARGE

    Low-stock threshold exceeds the contract maximum.

  • 400 INVENTORY_GROUP_REASON_REQUIRED

    Movement reason is required.

  • 400 INVENTORY_GROUP_REASON_INVALID

    Movement reason is not allowed.

  • 400 INVENTORY_GROUP_NOTES_TOO_LONG

    Movement notes exceed the contract max length.

  • 400 INVENTORY_GROUP_NOTES_INVALID_CHARS

    Movement notes contain invalid characters.

  • 403 LOCATION_APP_MANAGED_NO_EDIT

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

  • 404 INVENTORY_GROUP_NOT_FOUND

    Inventory Group does not exist in this store.

  • 404 INVENTORY_GROUP_STOCK_NOT_FOUND

    No stock row exists for the requested location.

  • 409 INVENTORY_GROUP_STOCK_EXISTS

    Stock already exists at one of the selected locations.

  • 409 INVENTORY_GROUP_STOCK_MAX_LOCATIONS

    The bulk stock batch exceeds the contract maximum.

Adjust inventory group quantity

POST write_inventory

Add or subtract stock at one location.

Applies a signed adjustment to one group-location row. App-managed locations are writable only by their owning active installation. Adjustments cannot make quantity negative or below reserved stock. Successful changes update the stock ledger and aggregate stock together and fire inventory_levels/update — a failure leaves nothing partially written.

Path parameters

Name Type Description
groupId required uuid

Inventory Group id.

Example: ig_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Body parameters

Name Type Description
location_id required string

Location id.

Example: loc_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2
adjustment required integer

Signed quantity delta.

Example: -5
reason required string

Inventory movement reason.

Example: damaged
notes string

Optional movement note.

Example: Five units damaged during cycle count

Errors

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request JSON could not be parsed.

  • 400 INVENTORY_GROUP_LOCATION_REQUIRED

    Location is required.

  • 400 INVENTORY_GROUP_LOCATIONS_REQUIRED

    At least one location is required.

  • 400 INVENTORY_GROUP_LOCATIONS_NOT_FOUND

    One or more locations do not exist in this store.

  • 400 INVENTORY_GROUP_LOCATION_DUPLICATE

    The same location appears more than once.

  • 400 INVENTORY_GROUP_QUANTITY_NEGATIVE

    Quantity cannot be negative.

  • 400 INVENTORY_GROUP_QUANTITY_TOO_LARGE

    Quantity exceeds the contract maximum.

  • 400 INVENTORY_GROUP_QUANTITY_BELOW_RESERVED

    Quantity cannot be set below reserved stock.

  • 400 INVENTORY_GROUP_ADJUST_NEGATIVE

    Adjustment would make quantity negative.

  • 400 INVENTORY_GROUP_ADJUST_BELOW_RESERVED

    Adjustment would make quantity lower than reserved stock.

  • 400 INVENTORY_GROUP_ADJUST_TOO_LARGE

    Adjustment would exceed the contract maximum.

  • 400 INVENTORY_GROUP_THRESHOLD_NEGATIVE

    Low-stock threshold cannot be negative.

  • 400 INVENTORY_GROUP_THRESHOLD_TOO_LARGE

    Low-stock threshold exceeds the contract maximum.

  • 400 INVENTORY_GROUP_REASON_REQUIRED

    Movement reason is required.

  • 400 INVENTORY_GROUP_REASON_INVALID

    Movement reason is not allowed.

  • 400 INVENTORY_GROUP_NOTES_TOO_LONG

    Movement notes exceed the contract max length.

  • 400 INVENTORY_GROUP_NOTES_INVALID_CHARS

    Movement notes contain invalid characters.

  • 403 LOCATION_APP_MANAGED_NO_EDIT

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

  • 404 INVENTORY_GROUP_NOT_FOUND

    Inventory Group does not exist in this store.

  • 404 INVENTORY_GROUP_STOCK_NOT_FOUND

    No stock row exists for the requested location.

  • 409 INVENTORY_GROUP_STOCK_EXISTS

    Stock already exists at one of the selected locations.

  • 409 INVENTORY_GROUP_STOCK_MAX_LOCATIONS

    The bulk stock batch exceeds the contract maximum.

Set inventory group low-stock threshold

POST write_inventory

Set or clear the per-location low-stock threshold.

Sets a low-stock threshold for one group-location row. App-managed locations are writable only by their owning active installation. Send null to clear it. Threshold changes fire inventory_levels/update and may trigger low-stock notifications and webhooks.

Path parameters

Name Type Description
groupId required uuid

Inventory Group id.

Example: ig_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Body parameters

Name Type Description
location_id required string

Location id.

Example: loc_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2
low_stock_threshold integer

Per-location threshold. Send null to clear it; 0 is valid.

Example: 15

Errors

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request JSON could not be parsed.

  • 400 INVENTORY_GROUP_LOCATION_REQUIRED

    Location is required.

  • 400 INVENTORY_GROUP_LOCATIONS_REQUIRED

    At least one location is required.

  • 400 INVENTORY_GROUP_LOCATIONS_NOT_FOUND

    One or more locations do not exist in this store.

  • 400 INVENTORY_GROUP_LOCATION_DUPLICATE

    The same location appears more than once.

  • 400 INVENTORY_GROUP_QUANTITY_NEGATIVE

    Quantity cannot be negative.

  • 400 INVENTORY_GROUP_QUANTITY_TOO_LARGE

    Quantity exceeds the contract maximum.

  • 400 INVENTORY_GROUP_QUANTITY_BELOW_RESERVED

    Quantity cannot be set below reserved stock.

  • 400 INVENTORY_GROUP_ADJUST_NEGATIVE

    Adjustment would make quantity negative.

  • 400 INVENTORY_GROUP_ADJUST_BELOW_RESERVED

    Adjustment would make quantity lower than reserved stock.

  • 400 INVENTORY_GROUP_ADJUST_TOO_LARGE

    Adjustment would exceed the contract maximum.

  • 400 INVENTORY_GROUP_THRESHOLD_NEGATIVE

    Low-stock threshold cannot be negative.

  • 400 INVENTORY_GROUP_THRESHOLD_TOO_LARGE

    Low-stock threshold exceeds the contract maximum.

  • 400 INVENTORY_GROUP_REASON_REQUIRED

    Movement reason is required.

  • 400 INVENTORY_GROUP_REASON_INVALID

    Movement reason is not allowed.

  • 400 INVENTORY_GROUP_NOTES_TOO_LONG

    Movement notes exceed the contract max length.

  • 400 INVENTORY_GROUP_NOTES_INVALID_CHARS

    Movement notes contain invalid characters.

  • 403 LOCATION_APP_MANAGED_NO_EDIT

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

  • 404 INVENTORY_GROUP_NOT_FOUND

    Inventory Group does not exist in this store.

  • 404 INVENTORY_GROUP_STOCK_NOT_FOUND

    No stock row exists for the requested location.

  • 409 INVENTORY_GROUP_STOCK_EXISTS

    Stock already exists at one of the selected locations.

  • 409 INVENTORY_GROUP_STOCK_MAX_LOCATIONS

    The bulk stock batch exceeds the contract maximum.

List inventory group movements

GET read_inventory

List stock movement history for one inventory group.

Returns the movement ledger used to reconcile inventory_levels/update webhook delivery. Rows are retained for the service retention window returned by the endpoint.

Path parameters

Name Type Description
groupId required uuid

Inventory Group id.

Example: ig_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2

Query parameters

Name Type Description
page integer

Page number.

Example: 1
limit integer

Page size.

Example: 50
search string

Search movement notes or location names.

Example: cycle
location_id string

Filter movements to one location.

Example: loc_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2
reason string

Filter by movement reason.

Example: recount
from_date string

Start date/time filter.

Example: 2026-07-01T00:00:00Z
to_date string

End date/time filter.

Example: 2026-07-31T23:59:59Z
sort_by string

Sort field from the movement contract.

Allowed values
namequantitycreated_at
Example: created_at
sort_direction string

Sort direction.

Allowed values
ascdesc
Example: desc

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 VALIDATION_LIST_INVALID_PAGE

    Page must be at least 1.

  • 400 VALIDATION_LIST_INVALID_LIMIT

    Limit is outside the inventory group contract.

  • 400 VALIDATION_LIST_INVALID_SORT_BY

    Sort field is not allowed for this endpoint.

  • 400 VALIDATION_LIST_INVALID_SORT_DIRECTION

    Sort direction must be asc or desc.

  • 400 VALIDATION_SEARCH_TOO_LONG

    Search exceeds the inventory group search limit.

  • 404 INVENTORY_GROUP_NOT_FOUND

    Inventory Group does not exist in this store.

  • 400 INVENTORY_GROUP_REASON_INVALID

    Movement reason is not allowed.

  • 400 INVENTORY_FROM_DATE_INVALID

    From date must use YYYY-MM-DD.

  • 400 INVENTORY_TO_DATE_INVALID

    To date must use YYYY-MM-DD.

List inventory group stock

GET read_inventory

List per-location stock rows for one inventory group.

Returns quantity, reserved stock, available stock, low-stock threshold, and low-stock state for each location assigned to the group.

Path parameters

Name Type Description
groupId required uuid

Inventory Group id.

Example: ig_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2

Query parameters

Name Type Description
page integer

Page number.

Example: 1
limit integer

Page size.

Example: 50
search string

Search stock rows by location name.

Example: Main Warehouse
sort_by string

Sort field from the stock-row contract.

Allowed values
namequantitycreated_at
Example: location_name
sort_direction string

Sort direction.

Allowed values
ascdesc
Example: asc

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 400 VALIDATION_LIST_INVALID_PAGE

    Page must be at least 1.

  • 400 VALIDATION_LIST_INVALID_LIMIT

    Limit is outside the inventory group contract.

  • 400 VALIDATION_LIST_INVALID_SORT_BY

    Sort field is not allowed for this endpoint.

  • 400 VALIDATION_LIST_INVALID_SORT_DIRECTION

    Sort direction must be asc or desc.

  • 400 VALIDATION_SEARCH_TOO_LONG

    Search exceeds the inventory group search limit.

  • 404 INVENTORY_GROUP_NOT_FOUND

    Inventory Group does not exist in this store.

Bulk add inventory group stock locations

POST write_inventory

Add stock rows at multiple locations.

Adds initial stock rows for locations that do not already have stock for this group. App tokens may target merchant-managed locations and locations owned by their own active installation; they cannot target another app's location. The batch enforces duplicate, location, quantity, threshold, and max-location checks before committing.

Path parameters

Name Type Description
groupId required uuid

Inventory Group id.

Example: ig_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Body parameters

Name Type Description
stock required array<object>

Stock rows to create. Each row needs location_id and quantity; low_stock_threshold is optional.

Example: {"location_id":"loc_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2","quantity":240,"low_stock_threshold":15}

Errors

  • 400 STORE_API_INVALID_REQUEST_BODY

    Request JSON could not be parsed.

  • 400 INVENTORY_GROUP_LOCATION_REQUIRED

    Location is required.

  • 400 INVENTORY_GROUP_LOCATIONS_REQUIRED

    At least one location is required.

  • 400 INVENTORY_GROUP_LOCATIONS_NOT_FOUND

    One or more locations do not exist in this store.

  • 400 INVENTORY_GROUP_LOCATION_DUPLICATE

    The same location appears more than once.

  • 400 INVENTORY_GROUP_QUANTITY_NEGATIVE

    Quantity cannot be negative.

  • 400 INVENTORY_GROUP_QUANTITY_TOO_LARGE

    Quantity exceeds the contract maximum.

  • 400 INVENTORY_GROUP_QUANTITY_BELOW_RESERVED

    Quantity cannot be set below reserved stock.

  • 400 INVENTORY_GROUP_ADJUST_NEGATIVE

    Adjustment would make quantity negative.

  • 400 INVENTORY_GROUP_ADJUST_BELOW_RESERVED

    Adjustment would make quantity lower than reserved stock.

  • 400 INVENTORY_GROUP_ADJUST_TOO_LARGE

    Adjustment would exceed the contract maximum.

  • 400 INVENTORY_GROUP_THRESHOLD_NEGATIVE

    Low-stock threshold cannot be negative.

  • 400 INVENTORY_GROUP_THRESHOLD_TOO_LARGE

    Low-stock threshold exceeds the contract maximum.

  • 400 INVENTORY_GROUP_REASON_REQUIRED

    Movement reason is required.

  • 400 INVENTORY_GROUP_REASON_INVALID

    Movement reason is not allowed.

  • 400 INVENTORY_GROUP_NOTES_TOO_LONG

    Movement notes exceed the contract max length.

  • 400 INVENTORY_GROUP_NOTES_INVALID_CHARS

    Movement notes contain invalid characters.

  • 403 LOCATION_APP_MANAGED_NO_EDIT

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

  • 404 INVENTORY_GROUP_NOT_FOUND

    Inventory Group does not exist in this store.

  • 404 INVENTORY_GROUP_STOCK_NOT_FOUND

    No stock row exists for the requested location.

  • 409 INVENTORY_GROUP_STOCK_EXISTS

    Stock already exists at one of the selected locations.

  • 409 INVENTORY_GROUP_STOCK_MAX_LOCATIONS

    The bulk stock batch exceeds the contract maximum.

Delete inventory group stock location

DELETE write_inventory

Remove one stock location from inventory group.

Removes a group-location row only when quantity and reservations are both zero. App-managed locations are writable only by their owning active installation.

Path parameters

Name Type Description
groupId required uuid

Inventory Group id.

Example: ig_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2
locationId required string

Location id.

Example: loc_01JZ8DFR4S8AVZ7GN9Y4YVJ9Q2

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 403 LOCATION_APP_MANAGED_NO_EDIT

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

  • 404 INVENTORY_GROUP_NOT_FOUND

    Inventory Group does not exist in this store.

  • 404 INVENTORY_GROUP_STOCK_NOT_FOUND

    No stock row exists for the requested location.

  • 409 INVENTORY_GROUP_STOCK_HAS_QUANTITY

    Stock location still has quantity or reservations.

Fields#

Field

Kind

Create

Update

Required

Translatable

name

text

Yes

Yes

create

No

slug

slug

Yes

Yes

No

sku

text

Yes

Yes

create

No

description

textarea

Yes

Yes

No

allow_backorder

boolean

Yes

Yes

No

backorder_max_qty

integer

Yes

Yes

No

preorder_enabled

boolean

Yes

Yes

No

preorder_release_at

datetime

Yes

Yes

No

preorder_max_qty

integer

Yes

Yes

No

preorder_charge_mode

select

Yes

Yes

No

overall_low_stock_threshold

integer

Yes

Yes

No

quantity

integer

No

No

No

reserved

integer

No

No

No

available

integer

No

No

No

backordered_committed

integer

No

No

No

preordered_committed

integer

No

No

No

backordered_allocated

integer

No

No

No

preordered_allocated

integer

No

No

No

backordered_unallocated

integer

No

No

No

preordered_unallocated

integer

No

No

No

is_low_stock

boolean

No

No

No

product_count

integer

No

No

No

variant_count

integer

No

No

No

location_count

integer

No

No

No

created_at

datetime

No

No

No

updated_at

datetime

No

No

No

Webhook events#

Inventory Group webhook events are declared by the Inventory Group resource contract. The event cards below include the topic, subscription scope, store permission, payload schema, and sample payload.

Inventory group created

EVENT inventory_groups/create write_inventory inventory:write

Fired when an inventory group is created.

Payload fields

Field Type Description
resource_type string Can be removed/added via the Payload builder
resource_id string Can be removed/added via the Payload builder
occurred_at string Can be removed/added via the Payload builder
previous.id string Can be removed/added via the Payload builder
previous.name string Can be removed/added via the Payload builder
previous.slug string Can be removed/added via the Payload builder
previous.sku string Can be removed/added via the Payload builder
previous.description string Can be removed/added via the Payload builder
previous.quantity integer Can be removed/added via the Payload builder
previous.reserved integer Can be removed/added via the Payload builder
previous.low_stock_threshold integer Can be removed/added via the Payload builder
previous.overall_low_stock_threshold integer Can be removed/added via the Payload builder
previous.allow_backorder boolean Can be removed/added via the Payload builder
previous.backorder_max_qty integer Can be removed/added via the Payload builder
previous.preorder_enabled boolean Can be removed/added via the Payload builder
previous.preorder_release_at Can be removed/added via the Payload builder
previous.preorder_max_qty integer Can be removed/added via the Payload builder
previous.preorder_charge_mode string Can be removed/added via the Payload builder
current.id string Can be removed/added via the Payload builder
current.name string Can be removed/added via the Payload builder
current.slug string Can be removed/added via the Payload builder
current.sku string Can be removed/added via the Payload builder
current.description string Can be removed/added via the Payload builder
current.quantity integer Can be removed/added via the Payload builder
current.reserved integer Can be removed/added via the Payload builder
current.low_stock_threshold integer Can be removed/added via the Payload builder
current.overall_low_stock_threshold integer Can be removed/added via the Payload builder
current.allow_backorder boolean Can be removed/added via the Payload builder
current.backorder_max_qty integer Can be removed/added via the Payload builder
current.preorder_enabled boolean Can be removed/added via the Payload builder
current.preorder_release_at Can be removed/added via the Payload builder
current.preorder_max_qty integer Can be removed/added via the Payload builder
current.preorder_charge_mode string Can be removed/added via the Payload builder
changed_fields array Can be removed/added via the Payload builder

Inventory group updated

EVENT inventory_groups/update write_inventory inventory:write

Fired when an inventory group's fields change (name, slug, SKU, description, thresholds, backorder, preorder). Quantity changes fire the stock level event instead.

Payload fields

Field Type Description
resource_type string Can be removed/added via the Payload builder
resource_id string Can be removed/added via the Payload builder
occurred_at string Can be removed/added via the Payload builder
previous.id string Can be removed/added via the Payload builder
previous.name string Can be removed/added via the Payload builder
previous.slug string Can be removed/added via the Payload builder
previous.sku string Can be removed/added via the Payload builder
previous.description string Can be removed/added via the Payload builder
previous.quantity integer Can be removed/added via the Payload builder
previous.reserved integer Can be removed/added via the Payload builder
previous.low_stock_threshold integer Can be removed/added via the Payload builder
previous.overall_low_stock_threshold integer Can be removed/added via the Payload builder
previous.allow_backorder boolean Can be removed/added via the Payload builder
previous.backorder_max_qty integer Can be removed/added via the Payload builder
previous.preorder_enabled boolean Can be removed/added via the Payload builder
previous.preorder_release_at Can be removed/added via the Payload builder
previous.preorder_max_qty integer Can be removed/added via the Payload builder
previous.preorder_charge_mode string Can be removed/added via the Payload builder
current.id string Can be removed/added via the Payload builder
current.name string Can be removed/added via the Payload builder
current.slug string Can be removed/added via the Payload builder
current.sku string Can be removed/added via the Payload builder
current.description string Can be removed/added via the Payload builder
current.quantity integer Can be removed/added via the Payload builder
current.reserved integer Can be removed/added via the Payload builder
current.low_stock_threshold integer Can be removed/added via the Payload builder
current.overall_low_stock_threshold integer Can be removed/added via the Payload builder
current.allow_backorder boolean Can be removed/added via the Payload builder
current.backorder_max_qty integer Can be removed/added via the Payload builder
current.preorder_enabled boolean Can be removed/added via the Payload builder
current.preorder_release_at Can be removed/added via the Payload builder
current.preorder_max_qty integer Can be removed/added via the Payload builder
current.preorder_charge_mode string Can be removed/added via the Payload builder
changed_fields array Can be removed/added via the Payload builder

Inventory group deleted

EVENT inventory_groups/delete write_inventory inventory:write

Fired when an inventory group is deleted.

Payload fields

Field Type Description
resource_type string Can be removed/added via the Payload builder
resource_id string Can be removed/added via the Payload builder
occurred_at string Can be removed/added via the Payload builder
previous.id string Can be removed/added via the Payload builder
previous.name string Can be removed/added via the Payload builder
previous.slug string Can be removed/added via the Payload builder
previous.sku string Can be removed/added via the Payload builder
previous.description string Can be removed/added via the Payload builder
previous.quantity integer Can be removed/added via the Payload builder
previous.reserved integer Can be removed/added via the Payload builder
previous.low_stock_threshold integer Can be removed/added via the Payload builder
previous.overall_low_stock_threshold integer Can be removed/added via the Payload builder
previous.allow_backorder boolean Can be removed/added via the Payload builder
previous.backorder_max_qty integer Can be removed/added via the Payload builder
previous.preorder_enabled boolean Can be removed/added via the Payload builder
previous.preorder_release_at Can be removed/added via the Payload builder
previous.preorder_max_qty integer Can be removed/added via the Payload builder
previous.preorder_charge_mode string Can be removed/added via the Payload builder
current.id string Can be removed/added via the Payload builder
current.name string Can be removed/added via the Payload builder
current.slug string Can be removed/added via the Payload builder
current.sku string Can be removed/added via the Payload builder
current.description string Can be removed/added via the Payload builder
current.quantity integer Can be removed/added via the Payload builder
current.reserved integer Can be removed/added via the Payload builder
current.low_stock_threshold integer Can be removed/added via the Payload builder
current.overall_low_stock_threshold integer Can be removed/added via the Payload builder
current.allow_backorder boolean Can be removed/added via the Payload builder
current.backorder_max_qty integer Can be removed/added via the Payload builder
current.preorder_enabled boolean Can be removed/added via the Payload builder
current.preorder_release_at Can be removed/added via the Payload builder
current.preorder_max_qty integer Can be removed/added via the Payload builder
current.preorder_charge_mode string Can be removed/added via the Payload builder
changed_fields array Can be removed/added via the Payload builder