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
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
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. |
limit
|
integer |
Page size. |
search
|
string |
Search inventory groups by name, slug, or SKU. |
low_stock_only
|
boolean |
When true, return only low-stock groups. |
location_id
|
string |
Filter to groups with stock at this location. |
sort_by
|
string |
Sort field from the Inventory Group list contract.
Allowed values
namequantitycreated_at |
sort_direction
|
string |
Sort direction from the Inventory Group list contract.
Allowed values
ascdesc |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400VALIDATION_LIST_INVALID_PAGEPage must be at least 1.
-
400VALIDATION_LIST_INVALID_LIMITLimit is outside the inventory group contract.
-
400VALIDATION_LIST_INVALID_SORT_BYSort field is not allowed for this endpoint.
-
400VALIDATION_LIST_INVALID_SORT_DIRECTIONSort direction must be asc or desc.
-
400VALIDATION_SEARCH_TOO_LONGSearch exceeds the inventory group search limit.
-
404INVENTORY_GROUP_NOT_FOUNDInventory Group does not exist in this store.
Get inventory group
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. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
404INVENTORY_GROUP_NOT_FOUNDInventory Group does not exist in this store.
Create inventory group
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. |
sku
required
|
string |
Unique SKU for the stock pool. |
slug
|
string |
Optional slug. Omit to generate from name. |
description
|
string |
Optional internal description. |
allow_backorder
|
boolean |
Whether group-backed items can keep selling below zero available stock. |
backorder_max_qty
|
integer |
Optional maximum backorder quantity. Null means uncapped. |
preorder_enabled
|
boolean |
Whether group-backed items sell as preorder. |
preorder_release_at
|
string |
RFC3339 release date. Required when preorder is enabled. |
preorder_max_qty
|
integer |
Optional maximum preorder quantity. Null means uncapped. |
preorder_charge_mode
|
string |
One of pay_immediate, pay_on_release, or reserve_only. Required when preorder is enabled. |
overall_low_stock_threshold
|
integer |
Optional threshold for total available stock across all locations. Null disables the overall alert. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest JSON could not be parsed.
-
400INVENTORY_GROUP_NAME_REQUIREDName is empty after normalization.
-
400INVENTORY_GROUP_NAME_TOO_LONGName exceeds the Inventory Group contract max length.
-
400INVENTORY_GROUP_NAME_INVALID_CHARSName contains invalid characters.
-
400INVENTORY_GROUP_SKU_REQUIREDSKU is empty after normalization.
-
400INVENTORY_GROUP_SKU_TOO_LONGSKU exceeds the Inventory Group contract max length.
-
400INVENTORY_GROUP_SKU_INVALID_CHARSSKU contains invalid characters.
-
400INVENTORY_GROUP_SKU_INVALID_FORMATSKU contains characters outside the shared SKU contract.
-
400INVENTORY_GROUP_SLUG_REQUIREDSlug is empty on update. Blank slug auto-generation is only available on create.
-
400INVENTORY_GROUP_SLUG_INVALID_FORMATSlug is not valid for inventory group URLs.
-
400INVENTORY_GROUP_SLUG_TOO_LONGSlug exceeds the Inventory Group contract max length.
-
400INVENTORY_GROUP_SLUG_GENERATION_FAILEDA slug could not be generated from the name.
-
409INVENTORY_GROUP_UNIQUE_SLUG_GENERATION_FAILEDA unique slug could not be generated for this store.
-
400INVENTORY_GROUP_DESCRIPTION_TOO_LONGDescription exceeds the Inventory Group contract max length.
-
400INVENTORY_GROUP_DESCRIPTION_INVALID_CHARSDescription contains invalid characters.
-
400INVENTORY_GROUP_THRESHOLD_NEGATIVELow-stock threshold cannot be negative.
-
400INVENTORY_GROUP_THRESHOLD_TOO_LARGELow-stock threshold exceeds the contract maximum.
-
400INVENTORY_GROUP_BACKORDER_MAX_QTY_POSITIVEBackorder maximum must be positive when set.
-
400INVENTORY_GROUP_BACKORDER_MAX_QTY_TOO_LARGEBackorder maximum exceeds the contract maximum.
-
400INVENTORY_GROUP_PREORDER_BACKORDER_CONFLICTBackorder and preorder cannot both be enabled.
-
400INVENTORY_GROUP_PREORDER_RELEASE_REQUIREDPreorder release date is required when preorder is enabled.
-
400INVENTORY_GROUP_PREORDER_RELEASE_PASTPreorder release date must be in the future.
-
400INVENTORY_GROUP_PREORDER_CHARGE_MODE_REQUIREDPreorder charge mode is required when preorder is enabled.
-
400INVENTORY_GROUP_PREORDER_CHARGE_MODE_INVALIDPreorder charge mode is not one of the allowed values.
-
400INVENTORY_GROUP_PREORDER_MAX_QTY_POSITIVEPreorder maximum must be positive when set.
-
400INVENTORY_GROUP_PREORDER_MAX_QTY_TOO_LARGEPreorder maximum exceeds the contract maximum.
-
404INVENTORY_GROUP_NOT_FOUNDInventory Group does not exist in this store.
-
409INVENTORY_GROUP_DUPLICATESlug or SKU already exists in this store or SKU is already used by another SKU-backed resource.
-
409SKU_IN_USE_BY_PRODUCTSKU is already used by a product.
-
409SKU_IN_USE_BY_VARIANTSKU is already used by a product variant.
-
409SKU_IN_USE_BY_GROUPSKU is already used by another inventory group.
-
409SKU_IN_USESKU is already used by another SKU-backed resource.
-
409INVENTORY_GROUP_LIMIT_REACHEDStore Inventory Group cap has been reached.
Update inventory group
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. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
name
|
string |
Inventory Group name. |
sku
|
string |
Unique SKU for the stock pool. |
slug
|
string |
Optional slug. Omit to generate from name. |
description
|
string |
Optional internal description. |
allow_backorder
|
boolean |
Whether group-backed items can keep selling below zero available stock. |
backorder_max_qty
|
integer |
Optional maximum backorder quantity. Null means uncapped. |
preorder_enabled
|
boolean |
Whether group-backed items sell as preorder. |
preorder_release_at
|
string |
RFC3339 release date. Required when preorder is enabled. |
preorder_max_qty
|
integer |
Optional maximum preorder quantity. Null means uncapped. |
preorder_charge_mode
|
string |
One of pay_immediate, pay_on_release, or reserve_only. Required when preorder is enabled. |
overall_low_stock_threshold
|
integer |
Optional threshold for total available stock across all locations. Null disables the overall alert. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest JSON could not be parsed.
-
400INVENTORY_GROUP_NAME_REQUIREDName is empty after normalization.
-
400INVENTORY_GROUP_NAME_TOO_LONGName exceeds the Inventory Group contract max length.
-
400INVENTORY_GROUP_NAME_INVALID_CHARSName contains invalid characters.
-
400INVENTORY_GROUP_SKU_REQUIREDSKU is empty after normalization.
-
400INVENTORY_GROUP_SKU_TOO_LONGSKU exceeds the Inventory Group contract max length.
-
400INVENTORY_GROUP_SKU_INVALID_CHARSSKU contains invalid characters.
-
400INVENTORY_GROUP_SKU_INVALID_FORMATSKU contains characters outside the shared SKU contract.
-
400INVENTORY_GROUP_SLUG_REQUIREDSlug is empty on update. Blank slug auto-generation is only available on create.
-
400INVENTORY_GROUP_SLUG_INVALID_FORMATSlug is not valid for inventory group URLs.
-
400INVENTORY_GROUP_SLUG_TOO_LONGSlug exceeds the Inventory Group contract max length.
-
400INVENTORY_GROUP_SLUG_GENERATION_FAILEDA slug could not be generated from the name.
-
409INVENTORY_GROUP_UNIQUE_SLUG_GENERATION_FAILEDA unique slug could not be generated for this store.
-
400INVENTORY_GROUP_DESCRIPTION_TOO_LONGDescription exceeds the Inventory Group contract max length.
-
400INVENTORY_GROUP_DESCRIPTION_INVALID_CHARSDescription contains invalid characters.
-
400INVENTORY_GROUP_THRESHOLD_NEGATIVELow-stock threshold cannot be negative.
-
400INVENTORY_GROUP_THRESHOLD_TOO_LARGELow-stock threshold exceeds the contract maximum.
-
400INVENTORY_GROUP_BACKORDER_MAX_QTY_POSITIVEBackorder maximum must be positive when set.
-
400INVENTORY_GROUP_BACKORDER_MAX_QTY_TOO_LARGEBackorder maximum exceeds the contract maximum.
-
400INVENTORY_GROUP_PREORDER_BACKORDER_CONFLICTBackorder and preorder cannot both be enabled.
-
400INVENTORY_GROUP_PREORDER_RELEASE_REQUIREDPreorder release date is required when preorder is enabled.
-
400INVENTORY_GROUP_PREORDER_RELEASE_PASTPreorder release date must be in the future.
-
400INVENTORY_GROUP_PREORDER_CHARGE_MODE_REQUIREDPreorder charge mode is required when preorder is enabled.
-
400INVENTORY_GROUP_PREORDER_CHARGE_MODE_INVALIDPreorder charge mode is not one of the allowed values.
-
400INVENTORY_GROUP_PREORDER_MAX_QTY_POSITIVEPreorder maximum must be positive when set.
-
400INVENTORY_GROUP_PREORDER_MAX_QTY_TOO_LARGEPreorder maximum exceeds the contract maximum.
-
404INVENTORY_GROUP_NOT_FOUNDInventory Group does not exist in this store.
-
409INVENTORY_GROUP_DUPLICATESlug or SKU already exists in this store or SKU is already used by another SKU-backed resource.
-
409SKU_IN_USE_BY_PRODUCTSKU is already used by a product.
-
409SKU_IN_USE_BY_VARIANTSKU is already used by a product variant.
-
409SKU_IN_USE_BY_GROUPSKU is already used by another inventory group.
-
409SKU_IN_USESKU is already used by another SKU-backed resource.
-
409INVENTORY_GROUP_LIMIT_REACHEDStore Inventory Group cap has been reached.
Delete inventory group
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. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
404INVENTORY_GROUP_NOT_FOUNDInventory Group does not exist in this store.
-
409INVENTORY_GROUP_DELETE_HAS_PRODUCTSInventory Group still has linked products.
-
409INVENTORY_GROUP_DELETE_HAS_VARIANTSInventory Group still has linked variants.
-
409INVENTORY_GROUP_DELETE_HAS_TRANSFERSInventory Group still has pending or in-transit transfers.
Set inventory group quantity
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. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
location_id
required
|
string |
Location id. |
quantity
required
|
integer |
Absolute quantity at the location. |
reason
required
|
string |
Inventory movement reason. |
notes
|
string |
Optional movement note. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest JSON could not be parsed.
-
400INVENTORY_GROUP_LOCATION_REQUIREDLocation is required.
-
400INVENTORY_GROUP_LOCATIONS_REQUIREDAt least one location is required.
-
400INVENTORY_GROUP_LOCATIONS_NOT_FOUNDOne or more locations do not exist in this store.
-
400INVENTORY_GROUP_LOCATION_DUPLICATEThe same location appears more than once.
-
400INVENTORY_GROUP_QUANTITY_NEGATIVEQuantity cannot be negative.
-
400INVENTORY_GROUP_QUANTITY_TOO_LARGEQuantity exceeds the contract maximum.
-
400INVENTORY_GROUP_QUANTITY_BELOW_RESERVEDQuantity cannot be set below reserved stock.
-
400INVENTORY_GROUP_ADJUST_NEGATIVEAdjustment would make quantity negative.
-
400INVENTORY_GROUP_ADJUST_BELOW_RESERVEDAdjustment would make quantity lower than reserved stock.
-
400INVENTORY_GROUP_ADJUST_TOO_LARGEAdjustment would exceed the contract maximum.
-
400INVENTORY_GROUP_THRESHOLD_NEGATIVELow-stock threshold cannot be negative.
-
400INVENTORY_GROUP_THRESHOLD_TOO_LARGELow-stock threshold exceeds the contract maximum.
-
400INVENTORY_GROUP_REASON_REQUIREDMovement reason is required.
-
400INVENTORY_GROUP_REASON_INVALIDMovement reason is not allowed.
-
400INVENTORY_GROUP_NOTES_TOO_LONGMovement notes exceed the contract max length.
-
400INVENTORY_GROUP_NOTES_INVALID_CHARSMovement notes contain invalid characters.
-
403LOCATION_APP_MANAGED_NO_EDITThe location belongs to another app or its owning installation is inactive.
-
404INVENTORY_GROUP_NOT_FOUNDInventory Group does not exist in this store.
-
404INVENTORY_GROUP_STOCK_NOT_FOUNDNo stock row exists for the requested location.
-
409INVENTORY_GROUP_STOCK_EXISTSStock already exists at one of the selected locations.
-
409INVENTORY_GROUP_STOCK_MAX_LOCATIONSThe bulk stock batch exceeds the contract maximum.
Adjust inventory group quantity
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. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
location_id
required
|
string |
Location id. |
adjustment
required
|
integer |
Signed quantity delta. |
reason
required
|
string |
Inventory movement reason. |
notes
|
string |
Optional movement note. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest JSON could not be parsed.
-
400INVENTORY_GROUP_LOCATION_REQUIREDLocation is required.
-
400INVENTORY_GROUP_LOCATIONS_REQUIREDAt least one location is required.
-
400INVENTORY_GROUP_LOCATIONS_NOT_FOUNDOne or more locations do not exist in this store.
-
400INVENTORY_GROUP_LOCATION_DUPLICATEThe same location appears more than once.
-
400INVENTORY_GROUP_QUANTITY_NEGATIVEQuantity cannot be negative.
-
400INVENTORY_GROUP_QUANTITY_TOO_LARGEQuantity exceeds the contract maximum.
-
400INVENTORY_GROUP_QUANTITY_BELOW_RESERVEDQuantity cannot be set below reserved stock.
-
400INVENTORY_GROUP_ADJUST_NEGATIVEAdjustment would make quantity negative.
-
400INVENTORY_GROUP_ADJUST_BELOW_RESERVEDAdjustment would make quantity lower than reserved stock.
-
400INVENTORY_GROUP_ADJUST_TOO_LARGEAdjustment would exceed the contract maximum.
-
400INVENTORY_GROUP_THRESHOLD_NEGATIVELow-stock threshold cannot be negative.
-
400INVENTORY_GROUP_THRESHOLD_TOO_LARGELow-stock threshold exceeds the contract maximum.
-
400INVENTORY_GROUP_REASON_REQUIREDMovement reason is required.
-
400INVENTORY_GROUP_REASON_INVALIDMovement reason is not allowed.
-
400INVENTORY_GROUP_NOTES_TOO_LONGMovement notes exceed the contract max length.
-
400INVENTORY_GROUP_NOTES_INVALID_CHARSMovement notes contain invalid characters.
-
403LOCATION_APP_MANAGED_NO_EDITThe location belongs to another app or its owning installation is inactive.
-
404INVENTORY_GROUP_NOT_FOUNDInventory Group does not exist in this store.
-
404INVENTORY_GROUP_STOCK_NOT_FOUNDNo stock row exists for the requested location.
-
409INVENTORY_GROUP_STOCK_EXISTSStock already exists at one of the selected locations.
-
409INVENTORY_GROUP_STOCK_MAX_LOCATIONSThe bulk stock batch exceeds the contract maximum.
Set inventory group low-stock threshold
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. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
location_id
required
|
string |
Location id. |
low_stock_threshold
|
integer |
Per-location threshold. Send null to clear it; 0 is valid. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest JSON could not be parsed.
-
400INVENTORY_GROUP_LOCATION_REQUIREDLocation is required.
-
400INVENTORY_GROUP_LOCATIONS_REQUIREDAt least one location is required.
-
400INVENTORY_GROUP_LOCATIONS_NOT_FOUNDOne or more locations do not exist in this store.
-
400INVENTORY_GROUP_LOCATION_DUPLICATEThe same location appears more than once.
-
400INVENTORY_GROUP_QUANTITY_NEGATIVEQuantity cannot be negative.
-
400INVENTORY_GROUP_QUANTITY_TOO_LARGEQuantity exceeds the contract maximum.
-
400INVENTORY_GROUP_QUANTITY_BELOW_RESERVEDQuantity cannot be set below reserved stock.
-
400INVENTORY_GROUP_ADJUST_NEGATIVEAdjustment would make quantity negative.
-
400INVENTORY_GROUP_ADJUST_BELOW_RESERVEDAdjustment would make quantity lower than reserved stock.
-
400INVENTORY_GROUP_ADJUST_TOO_LARGEAdjustment would exceed the contract maximum.
-
400INVENTORY_GROUP_THRESHOLD_NEGATIVELow-stock threshold cannot be negative.
-
400INVENTORY_GROUP_THRESHOLD_TOO_LARGELow-stock threshold exceeds the contract maximum.
-
400INVENTORY_GROUP_REASON_REQUIREDMovement reason is required.
-
400INVENTORY_GROUP_REASON_INVALIDMovement reason is not allowed.
-
400INVENTORY_GROUP_NOTES_TOO_LONGMovement notes exceed the contract max length.
-
400INVENTORY_GROUP_NOTES_INVALID_CHARSMovement notes contain invalid characters.
-
403LOCATION_APP_MANAGED_NO_EDITThe location belongs to another app or its owning installation is inactive.
-
404INVENTORY_GROUP_NOT_FOUNDInventory Group does not exist in this store.
-
404INVENTORY_GROUP_STOCK_NOT_FOUNDNo stock row exists for the requested location.
-
409INVENTORY_GROUP_STOCK_EXISTSStock already exists at one of the selected locations.
-
409INVENTORY_GROUP_STOCK_MAX_LOCATIONSThe bulk stock batch exceeds the contract maximum.
List inventory group movements
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. |
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
Page number. |
limit
|
integer |
Page size. |
search
|
string |
Search movement notes or location names. |
location_id
|
string |
Filter movements to one location. |
reason
|
string |
Filter by movement reason. |
from_date
|
string |
Start date/time filter. |
to_date
|
string |
End date/time filter. |
sort_by
|
string |
Sort field from the movement contract.
Allowed values
namequantitycreated_at |
sort_direction
|
string |
Sort direction.
Allowed values
ascdesc |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400VALIDATION_LIST_INVALID_PAGEPage must be at least 1.
-
400VALIDATION_LIST_INVALID_LIMITLimit is outside the inventory group contract.
-
400VALIDATION_LIST_INVALID_SORT_BYSort field is not allowed for this endpoint.
-
400VALIDATION_LIST_INVALID_SORT_DIRECTIONSort direction must be asc or desc.
-
400VALIDATION_SEARCH_TOO_LONGSearch exceeds the inventory group search limit.
-
404INVENTORY_GROUP_NOT_FOUNDInventory Group does not exist in this store.
-
400INVENTORY_GROUP_REASON_INVALIDMovement reason is not allowed.
-
400INVENTORY_FROM_DATE_INVALIDFrom date must use YYYY-MM-DD.
-
400INVENTORY_TO_DATE_INVALIDTo date must use YYYY-MM-DD.
List inventory group stock
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. |
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
Page number. |
limit
|
integer |
Page size. |
search
|
string |
Search stock rows by location name. |
sort_by
|
string |
Sort field from the stock-row contract.
Allowed values
namequantitycreated_at |
sort_direction
|
string |
Sort direction.
Allowed values
ascdesc |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
400VALIDATION_LIST_INVALID_PAGEPage must be at least 1.
-
400VALIDATION_LIST_INVALID_LIMITLimit is outside the inventory group contract.
-
400VALIDATION_LIST_INVALID_SORT_BYSort field is not allowed for this endpoint.
-
400VALIDATION_LIST_INVALID_SORT_DIRECTIONSort direction must be asc or desc.
-
400VALIDATION_SEARCH_TOO_LONGSearch exceeds the inventory group search limit.
-
404INVENTORY_GROUP_NOT_FOUNDInventory Group does not exist in this store.
Bulk add inventory group stock locations
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. |
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. |
Errors
-
400STORE_API_INVALID_REQUEST_BODYRequest JSON could not be parsed.
-
400INVENTORY_GROUP_LOCATION_REQUIREDLocation is required.
-
400INVENTORY_GROUP_LOCATIONS_REQUIREDAt least one location is required.
-
400INVENTORY_GROUP_LOCATIONS_NOT_FOUNDOne or more locations do not exist in this store.
-
400INVENTORY_GROUP_LOCATION_DUPLICATEThe same location appears more than once.
-
400INVENTORY_GROUP_QUANTITY_NEGATIVEQuantity cannot be negative.
-
400INVENTORY_GROUP_QUANTITY_TOO_LARGEQuantity exceeds the contract maximum.
-
400INVENTORY_GROUP_QUANTITY_BELOW_RESERVEDQuantity cannot be set below reserved stock.
-
400INVENTORY_GROUP_ADJUST_NEGATIVEAdjustment would make quantity negative.
-
400INVENTORY_GROUP_ADJUST_BELOW_RESERVEDAdjustment would make quantity lower than reserved stock.
-
400INVENTORY_GROUP_ADJUST_TOO_LARGEAdjustment would exceed the contract maximum.
-
400INVENTORY_GROUP_THRESHOLD_NEGATIVELow-stock threshold cannot be negative.
-
400INVENTORY_GROUP_THRESHOLD_TOO_LARGELow-stock threshold exceeds the contract maximum.
-
400INVENTORY_GROUP_REASON_REQUIREDMovement reason is required.
-
400INVENTORY_GROUP_REASON_INVALIDMovement reason is not allowed.
-
400INVENTORY_GROUP_NOTES_TOO_LONGMovement notes exceed the contract max length.
-
400INVENTORY_GROUP_NOTES_INVALID_CHARSMovement notes contain invalid characters.
-
403LOCATION_APP_MANAGED_NO_EDITThe location belongs to another app or its owning installation is inactive.
-
404INVENTORY_GROUP_NOT_FOUNDInventory Group does not exist in this store.
-
404INVENTORY_GROUP_STOCK_NOT_FOUNDNo stock row exists for the requested location.
-
409INVENTORY_GROUP_STOCK_EXISTSStock already exists at one of the selected locations.
-
409INVENTORY_GROUP_STOCK_MAX_LOCATIONSThe bulk stock batch exceeds the contract maximum.
Delete inventory group stock location
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. |
locationId
required
|
string |
Location id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
403LOCATION_APP_MANAGED_NO_EDITThe location belongs to another app or its owning installation is inactive.
-
404INVENTORY_GROUP_NOT_FOUNDInventory Group does not exist in this store.
-
404INVENTORY_GROUP_STOCK_NOT_FOUNDNo stock row exists for the requested location.
-
409INVENTORY_GROUP_STOCK_HAS_QUANTITYStock location still has quantity or reservations.
Fields#
Field |
Kind |
Create |
Update |
Required |
Translatable |
|---|---|---|---|---|---|
|
text |
Yes |
Yes |
create |
No |
|
slug |
Yes |
Yes |
No |
|
|
text |
Yes |
Yes |
create |
No |
|
textarea |
Yes |
Yes |
No |
|
|
boolean |
Yes |
Yes |
No |
|
|
integer |
Yes |
Yes |
No |
|
|
boolean |
Yes |
Yes |
No |
|
|
datetime |
Yes |
Yes |
No |
|
|
integer |
Yes |
Yes |
No |
|
|
select |
Yes |
Yes |
No |
|
|
integer |
Yes |
Yes |
No |
|
|
integer |
No |
No |
No |
|
|
integer |
No |
No |
No |
|
|
integer |
No |
No |
No |
|
|
integer |
No |
No |
No |
|
|
integer |
No |
No |
No |
|
|
integer |
No |
No |
No |
|
|
integer |
No |
No |
No |
|
|
integer |
No |
No |
No |
|
|
integer |
No |
No |
No |
|
|
boolean |
No |
No |
No |
|
|
integer |
No |
No |
No |
|
|
integer |
No |
No |
No |
|
|
integer |
No |
No |
No |
|
|
datetime |
No |
No |
No |
|
|
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
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
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
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 |