The Xpand Autonomous Store Management API provides all the necessary functionality for operating and integrating with the Xpand Autonomous Store.
The Xpand API can be seen as broadly covering the following topics:

An Xpand Autonomous Store deployment is composed of one or more sites, with each
site containing one or more Xpand Autonomous Warehouse systems. Sites are identified
by a unique siteId, while systems are identified by a unique systemId.

The Xpand Cloud API provides endpoints for managing or synchronizing the product catalog, as well as viewing and managing systems, inventory & orders. Webhooks can also be used to receive real-time events such as new orders or system state changes.
API calls to the Xpand Autonomous Store Management API are authenticated using an
API Key provided by Xpand. The API key should be present in the Authorization
header on all API calls.
GET /products
Authorization: Bearer xxxxxxxxxxxxxxxxxxxxx
GET endpoints that return a list of objects support a simple format for filtering
their results, using either the query string or the request body:
GET /products?categoryId=7
GET /products
{
"categoryId": 7
}
ALL PUT endpoints across the API accept partial JSON structures.
For example an endpoint like this:
GET /products/{id}
{
"id": <string>,
"name": <string>,
"description": <string>,
...
}
That has a corresponding PUT endpoint for updating the product details, would allow
updating only some of even just one of the fields:
# Update the product name only
PUT /products/{id}
{
"name": <string>
}
# Update the product description only
PUT /products/{id}
{
"description": <string>
}
Traditionally such update endpoints that accept a partial payload are often denoted
using the HTTP PATCH method. However for simplicity's sake, the Xpand API simply
accepts partial payloads under the PUT method.
Note that this partiality only applies to top-level properties. Object properties, if present, would be taken to mean a complete update of the whole sub-object. However in most such cases sub-endpoints would be provided for more granular updates (see below).
Some endpoints support sub-endpoints, for example:
GET /products/{id}
{
# Product details
...
"identifiers": [
# Product identifiers
...
],
...
}
GET /products/{id}/identifiers
{
# Product identifiers
...
}
When this happens, the request and response payloads of the sub-endpoints would
match exactly the schema of the corresponding property of the parent resource.
So in the above example the JSON structure of the response of the
GET /products/{id}/identifiers endpoint is the same as the value of the identifiers
property in the JSON response of the parent GET /products/{id} endpoint.
The behaviour for PUT and POST endpoints therefore follows a similar logic:
# Set the product identifiers
PUT /products/{id}
{
"identifiers": [...]
}
# Set the product identifiers
PUT /products/{id}/identifiers
[
{
"type": "...",
"value": "..."
},
...
]
# Add a product identifier
POST /products/{id}/identifiers
{
"type": "...",
"value": "..."
}
# Update a single product identifier
# (this endpoints doesn't exist in practice for product identifiers
# as it doesn't make sense. It is only present here for illustration
# purposes).
PUT /products/{id}/identifiers/{identifier}
{
"type": "...",
"value": "..."
}
# Remove a single product identifier.
DELETE /products/{id}/identifiers/{identifier}
Products support an optional externalId field that allows clients/integrators to
provide their own unique identifier (e.g., their database row ID). This external ID:
To use an external ID in API endpoints, prefix it with ext: in the path parameter:
# Using internal product ID
GET /products/123
PUT /products/123
# Using external ID (if product was created with externalId "J57S")
GET /products/ext:J57S
PUT /products/ext:J57S
This applies to all product endpoints including sub-resources like images, identifiers, and modifiers.
Note that the Xpand internal product id is still generated and present regardless of
externalId.
Also note that if using product external IDs the product PUT endpoints becomes
an UPSERT (create or update). e.g:
# Using internal product ID
POST /products <--- Create product
PUT /products/123 <--- Update product
# Using external ID
PUT /products/ext:J57S <--- Create or update product
Most key endpoints in the Xpand API support arbitrary key/value pairs that can
be attached to any resource under the metadata property:
PUT /products/{id}
{
"metadata": {
"foo": "bar"
}
}
In such cases corresponding GET endpoints can use these metadata keys to
filter results using a metadata.<key> notation, or as keys of the metadata
object property if using the GET body object method for querying:
GET /products?metadata.foo=bar
GET /products
{
"metadata": {
"foo": "bar"
}
}
The metadata is meant for the sole use of customer or 3rd party integrations, and not used internally by the Xpand API in any logic flows.
The values for metadata are limited to simple scalar values (string, bool, number) and arrays of strings or numbers.
Note that on update operations, the metadata object is also taken as a partial update.
This means that an explicit null value is required in order to delete a key. In other
words, this JSON example is interpreted to mean set key foo to value "bar":
"metadata": {
"foo": "bar"
}
While this JSON snippet appearing in a PUT request would mean set key foo to value
"bar" and delete the value of key baz:
"metadata": {
"foo": "bar",
"baz": null
}
Retrieve a paginated list of products with optional filtering.
This endpoint supports the standard GET search patterns with query parameters or request body. See the GET search endpoints section in API Standards for more details.
Includes support for filtering by product attributes, external product IDs, range operators for numeric fields, and metadata filtering.
Products have a type property that can be either regular for normal products, or "bundle".
Products of type "bundle" represent product bundles and have a somewhat different set of
properties. Product type cannot be changed after creation.
Product bundles refer to the products included in the bundle using the bundleProductIds property.
Product bundles cannot refer to other product bundles.
| q | string Example: q=Natur Free-form search across all product text fields and identifiers. Minimum of 2 chars. |
| ids | string Example: ids=1,5,83 Filter by product IDs |
| externalIds | string Example: externalIds=EXT-001,EXT-002,J57S Filter by product External IDs |
| types | string Example: types=regular,bundle Filter by product types (comma-separated) |
| statuses | string Example: statuses=active Filter by product statuses (comma-separated) |
| categoryIds | string Example: categoryIds=37,58 Filter by category IDs (comma-separated) |
| labelIds | string Example: labelIds=42,57 Filter by label IDs (comma-separated) |
| identifiers | string Example: identifiers=SKU:123456789 Filter by identifier values (comma-separated) Identifiers can have the form Otherwise all identifier types will be searched |
| barcodes | string Example: barcodes=123456789 Filter by barcode values (comma-separated) |
| price | string Example: price=>10.5 Filter by price (supports >value, <value, or exact value) |
| weightKg | string Example: weightKg=<2.0 Filter by weight in kg (supports >value, <value, or exact value) |
| volumeL | string Example: volumeL=>0.5 Filter by volume in liters (supports >value, <value, or exact value) |
| lengthMm | string Example: lengthMm=<500 Filter by length in mm (supports >value, <value, or exact value) |
| widthMm | string Example: widthMm=>100 Filter by width in mm (supports >value, <value, or exact value) |
| heightMm | string Example: heightMm=<200 Filter by height in mm (supports >value, <value, or exact value) |
| dimensionMm | string Example: dimensionMm=<200 Filter by any object dimension (length, width or height) in mm (supports >value, <value, or exact value) |
| metadata | string Example: metadata=foo:bar,baz:1 Filter by metadata key-value pairs (format: key1:value1,key2:value2) |
| page | integer >= 0 Default: 0 Page number (0-based) |
| pageSize | integer [ 1 .. 100 ] Default: 100 Number of items per page |
Alternative to query parameters - provide search criteria as JSON with arrays and range operators
| q | string Free-form search across all product text fields and identifiers. Minimum of 2 chars |
| ids | Array of integers Filter by product IDs |
| externalIds | Array of strings Filter by external product IDs |
| types | Array of strings (ProductType) Items Enum: "regular" "bundle" Filter by product types (regular or bundle) |
| statuses | Array of strings (ProductStatus) Items Enum: "pending" "active" "disabled" "inactive" Filter by product statuses |
| categoryIds | Array of integers Filter by category IDs |
| labelIds | Array of integers Filter by label IDs |
| identifiers | Array of strings Filter by identifier values Identifiers can have the form Otherwise all identifier types will be searched |
| barcodes | Array of strings Filter by barcode values |
number or object or object or object or object or object (FloatFlexibleSearchParam) | |
number or object or object or object or object or object (FloatFlexibleSearchParam) | |
number or object or object or object or object or object (FloatFlexibleSearchParam) | |
number or object or object or object or object or object (IntegerFlexibleSearchParam) | |
number or object or object or object or object or object (IntegerFlexibleSearchParam) | |
number or object or object or object or object or object (IntegerFlexibleSearchParam) | |
number or object or object or object or object or object (IntegerFlexibleSearchParam) | |
object Search by arbitrary metadata key-value pairs |
{- "q": "Natur",
- "ids": [
- 1,
- 5,
- 83
], - "externalIds": [
- "EXT-001",
- "EXT-002",
- "J57S"
], - "types": [
- "regular"
], - "statuses": [
- "active"
], - "categoryIds": [
- 37,
- 58
], - "labelIds": [
- 42,
- 57
], - "identifiers": [
- "SKU:123456789"
], - "barcodes": [
- "123456789"
], - "price": 0.1,
- "weightKg": 0.1,
- "volumeL": 0.1,
- "lengthMm": 0,
- "widthMm": 0,
- "heightMm": 0,
- "dimensionMm": 0,
- "metadata": {
- "foo": "bar",
- "baz": "1"
}
}{- "page": 0,
- "pageSize": 100,
- "totalItems": 1387,
- "totalPages": 14,
- "hasNext": true,
- "hasPrevious": false,
- "data": [
- {
- "id": 361,
- "externalId": "J57S",
- "name": {
- "en_US": "Nature Valley Crunchy",
- "de_DE": "Nature Valley Knusprig"
}, - "description": {
- "en_US": "Crunchy granola bars made with whole grain oats, peanuts, and honey",
- "de_DE": "Knusprige Müsliriegel aus Vollkornhafer, Erdnüssen und Honig"
}, - "brand": {
- "en_US": "Nature Valley",
- "de_DE": "Nature Valley"
}, - "type": "regular",
- "status": "pending",
- "categoryId": 37,
- "labelIds": [
- 45,
- 58
], - "images": [
- {
- "id": "string",
- "description": "string",
- "primary": true,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
], - "identifiers": [
- {
- "type": "SKU",
- "value": "NV-CRUNCHY-6PK"
}, - {
- "type": "EAN",
- "value": "016000275775"
}
], - "barcodes": [
- "016000275775",
- "16000275775"
], - "price": {
- "default": {
- "price": 4.99,
- "sublines": [
- {
- "description": "Tax",
- "amount": 0.17
}, - {
- "description": "Deposit",
- "amount": 0.3
}
]
}, - "sites": [
- {
- "siteIds": [
- 1,
- 2
], - "price": 5.49,
- "sublines": [
- {
- "description": "Tax",
- "amount": 0.21
}, - {
- "description": "Deposit",
- "amount": 0.3
}
]
}, - {
- "siteIds": [
- 3,
- 4
], - "price": 4.29
}
]
}, - "metadata": {
- "foo": "bar",
- "baz": "1"
}, - "modifiers": [
- {
- "key": "strength",
- "name": {
- "en_US": "Coffee Strength",
- "de_DE": "Kaffee Stärke"
}, - "values": [
- {
- "value": "regular",
- "name": {
- "en_US": "Regular",
- "de_DE": "Normal"
}
}, - {
- "value": "strong",
- "name": {
- "en_US": "Strong",
- "de_DE": "Stark"
}
}
]
}, - {
- "key": "milk",
- "name": {
- "en_US": "Milk Option",
- "de_DE": "Milch Option"
}, - "values": [
- {
- "value": "with_milk",
- "name": {
- "en_US": "With milk",
- "de_DE": "Mit Milch"
}
}, - {
- "value": "no_milk",
- "name": {
- "en_US": "No milk",
- "de_DE": "Ohne Milch"
}
}
]
}
], - "recommendedProductIds": [
- 123,
- 456,
- 789
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "ageLimit": {
- "default": 21,
- "sites": [
- {
- "siteIds": [
- 1,
- 2
], - "ageLimit": 18
}, - {
- "siteIds": [
- 3,
- 4
], - "ageLimit": 21
}
]
}, - "weightKg": 0.1,
- "volumeL": 0.1,
- "lengthMm": 0,
- "widthMm": 0,
- "heightMm": 0,
- "temperature": "ambient",
- "pickingType": "automated"
}
]
}This endpoint has two forms depending on the content type:
| Body | Operation |
|---|---|
| JSON | Create single product |
| CSV | Bulk upsert products |
Create a new product in pending status.
Note that if using externalIds, products can also be inserted using the PUT endpoint.
The columns of the CSV file should follow a simple convention based on the JSON fields:
name.en_US,name.de_DE.SKU:01234567,EAN:01234567price and ageLimit are not supported (but specifically
for those two fields a simple scalar form is supported for setting the default value)So a complete example of a CSV body might look like:
externalId,name.en_US,name.de_DE,description.en_US,brand,status,temperature,categoryId,labelIds,price,metadata.foo,identifiers,barcodes
J57S,"Nature Valley Crunchy","Nature Valley Knusprig","Crunchy granola bars","Nature Valley","active","ambient",42,"15,27",4.99,bar,"SKU:16000423534,EAN:016000423534",16000423534
K48G,"Organic Oats","Bio Haferflocken","Premium organic oats","Nature's Best","active","ambient",43,"15,38",3.49,baz,"SKU:039978019523,EAN:0039978019523",039978019523
| externalId | string or null Optional product external ID (integrator unique ID). Note that if using product external ID, a product can be created with a PUT operation as well. |
required | object Product name (Internationalized) |
required | object Product description (Internationalized) |
required | object Product brand (Internationalized) |
| type required | string Type of product:
|
| status | string (ProductStatus) Enum: "pending" "active" "disabled" "inactive" Product lifecycle status:
|
| categoryId | integer or null Category ID this product belongs to |
| labelIds | Array of integers Array of label IDs associated with this product |
Array of objects (ProductIdentifier) Array of product identifiers (SKU, EAN, UPC) | |
| barcodes | Array of strings Array of product barcodes |
object (ProductPrice) Product price details structure with sublines and site level override. | |
object or null Arbitrary key-value pairs for customer/integrator use | |
Array of objects (ProductModifier) Available modifiers for this product when selected by users | |
| recommendedProductIds | Array of integers Array of product IDs recommended to be shown alongside this product (e.g., "Related Products" or "See Also" section) |
object (ProductAgeLimit) | |
| weightKg | number or null <float> Product weight in kilograms |
| volumeL | number or null <float> Product volume in liters |
| lengthMm | number or null <integer> Product length in millimeters |
| widthMm | number or null <integer> Product width in millimeters |
| heightMm | number or null <integer> Product height in millimeters |
| temperature required | string (Temperature) Enum: "ambient" "chilled" "frozen" Temprature hat a product should be stored in |
| pickingType required | string (PickingType) Enum: "automated" "manual" "external" "integrated" Defines how this product is picked:
|
{- "externalId": "J57S",
- "name": {
- "en_US": "Nature Valley Crunchy",
- "de_DE": "Nature Valley Knusprig"
}, - "description": {
- "en_US": "Crunchy granola bars made with whole grain oats, peanuts, and honey",
- "de_DE": "Knusprige Müsliriegel aus Vollkornhafer, Erdnüssen und Honig"
}, - "brand": {
- "en_US": "Nature Valley",
- "de_DE": "Nature Valley"
}, - "type": "regular",
- "status": "pending",
- "categoryId": 42,
- "labelIds": [
- 27,
- 32,
- 45
], - "identifiers": [
- {
- "type": "SKU",
- "value": "NV-CRUNCHY-6PK"
}, - {
- "type": "EAN",
- "value": "016000275775"
}
], - "barcodes": [
- "016000275775",
- "16000275775"
], - "price": {
- "default": {
- "price": 4.99,
- "sublines": [
- {
- "description": "Tax",
- "amount": 0.17
}, - {
- "description": "Deposit",
- "amount": 0.3
}
]
}, - "sites": [
- {
- "siteIds": [
- 1,
- 2
], - "price": 5.49,
- "sublines": [
- {
- "description": "Tax",
- "amount": 0.21
}, - {
- "description": "Deposit",
- "amount": 0.3
}
]
}, - {
- "siteIds": [
- 3,
- 4
], - "price": 4.29
}
]
}, - "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "modifiers": [
- {
- "key": "strength",
- "name": {
- "en_US": "Coffee Strength",
- "de_DE": "Kaffee Stärke"
}, - "values": [
- {
- "value": "regular",
- "name": {
- "en_US": "Regular",
- "de_DE": "Normal"
}
}, - {
- "value": "strong",
- "name": {
- "en_US": "Strong",
- "de_DE": "Stark"
}
}
]
}
], - "recommendedProductIds": [
- 123,
- 456,
- 789
], - "ageLimit": {
- "default": 21,
- "sites": [
- {
- "siteIds": [
- 1,
- 2
], - "ageLimit": 18
}, - {
- "siteIds": [
- 3,
- 4
], - "ageLimit": 21
}
]
}, - "weightKg": 0.1,
- "volumeL": 0.1,
- "lengthMm": 0,
- "widthMm": 0,
- "heightMm": 0,
- "temperature": "ambient",
- "pickingType": "automated"
}{- "id": 361,
- "externalId": "J57S",
- "name": {
- "en_US": "Nature Valley Crunchy",
- "de_DE": "Nature Valley Knusprig"
}, - "description": {
- "en_US": "Crunchy granola bars made with whole grain oats, peanuts, and honey",
- "de_DE": "Knusprige Müsliriegel aus Vollkornhafer, Erdnüssen und Honig"
}, - "brand": {
- "en_US": "Nature Valley",
- "de_DE": "Nature Valley"
}, - "type": "regular",
- "status": "pending",
- "categoryId": 37,
- "labelIds": [
- 45,
- 58
], - "images": [
- {
- "id": "string",
- "description": "string",
- "primary": true,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
], - "identifiers": [
- {
- "type": "SKU",
- "value": "NV-CRUNCHY-6PK"
}, - {
- "type": "EAN",
- "value": "016000275775"
}
], - "barcodes": [
- "016000275775",
- "16000275775"
], - "price": {
- "default": {
- "price": 4.99,
- "sublines": [
- {
- "description": "Tax",
- "amount": 0.17
}, - {
- "description": "Deposit",
- "amount": 0.3
}
]
}, - "sites": [
- {
- "siteIds": [
- 1,
- 2
], - "price": 5.49,
- "sublines": [
- {
- "description": "Tax",
- "amount": 0.21
}, - {
- "description": "Deposit",
- "amount": 0.3
}
]
}, - {
- "siteIds": [
- 3,
- 4
], - "price": 4.29
}
]
}, - "metadata": {
- "foo": "bar",
- "baz": "1"
}, - "modifiers": [
- {
- "key": "strength",
- "name": {
- "en_US": "Coffee Strength",
- "de_DE": "Kaffee Stärke"
}, - "values": [
- {
- "value": "regular",
- "name": {
- "en_US": "Regular",
- "de_DE": "Normal"
}
}, - {
- "value": "strong",
- "name": {
- "en_US": "Strong",
- "de_DE": "Stark"
}
}
]
}, - {
- "key": "milk",
- "name": {
- "en_US": "Milk Option",
- "de_DE": "Milch Option"
}, - "values": [
- {
- "value": "with_milk",
- "name": {
- "en_US": "With milk",
- "de_DE": "Mit Milch"
}
}, - {
- "value": "no_milk",
- "name": {
- "en_US": "No milk",
- "de_DE": "Ohne Milch"
}
}
]
}
], - "recommendedProductIds": [
- 123,
- 456,
- 789
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "ageLimit": {
- "default": 21,
- "sites": [
- {
- "siteIds": [
- 1,
- 2
], - "ageLimit": 18
}, - {
- "siteIds": [
- 3,
- 4
], - "ageLimit": 21
}
]
}, - "weightKg": 0.1,
- "volumeL": 0.1,
- "lengthMm": 0,
- "widthMm": 0,
- "heightMm": 0,
- "temperature": "ambient",
- "pickingType": "automated"
}Retrieve a specific product by ID or external ID.
Use the product's internal ID directly, or prefix with "ext:" to use the external ID
(e.g., /products/123 or /products/ext:J57S).
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
{- "id": 361,
- "externalId": "J57S",
- "name": {
- "en_US": "Nature Valley Crunchy",
- "de_DE": "Nature Valley Knusprig"
}, - "description": {
- "en_US": "Crunchy granola bars made with whole grain oats, peanuts, and honey",
- "de_DE": "Knusprige Müsliriegel aus Vollkornhafer, Erdnüssen und Honig"
}, - "brand": {
- "en_US": "Nature Valley",
- "de_DE": "Nature Valley"
}, - "type": "regular",
- "status": "pending",
- "categoryId": 37,
- "labelIds": [
- 45,
- 58
], - "images": [
- {
- "id": "string",
- "description": "string",
- "primary": true,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
], - "identifiers": [
- {
- "type": "SKU",
- "value": "NV-CRUNCHY-6PK"
}, - {
- "type": "EAN",
- "value": "016000275775"
}
], - "barcodes": [
- "016000275775",
- "16000275775"
], - "price": {
- "default": {
- "price": 4.99,
- "sublines": [
- {
- "description": "Tax",
- "amount": 0.17
}, - {
- "description": "Deposit",
- "amount": 0.3
}
]
}, - "sites": [
- {
- "siteIds": [
- 1,
- 2
], - "price": 5.49,
- "sublines": [
- {
- "description": "Tax",
- "amount": 0.21
}, - {
- "description": "Deposit",
- "amount": 0.3
}
]
}, - {
- "siteIds": [
- 3,
- 4
], - "price": 4.29
}
]
}, - "metadata": {
- "foo": "bar",
- "baz": "1"
}, - "modifiers": [
- {
- "key": "strength",
- "name": {
- "en_US": "Coffee Strength",
- "de_DE": "Kaffee Stärke"
}, - "values": [
- {
- "value": "regular",
- "name": {
- "en_US": "Regular",
- "de_DE": "Normal"
}
}, - {
- "value": "strong",
- "name": {
- "en_US": "Strong",
- "de_DE": "Stark"
}
}
]
}, - {
- "key": "milk",
- "name": {
- "en_US": "Milk Option",
- "de_DE": "Milch Option"
}, - "values": [
- {
- "value": "with_milk",
- "name": {
- "en_US": "With milk",
- "de_DE": "Mit Milch"
}
}, - {
- "value": "no_milk",
- "name": {
- "en_US": "No milk",
- "de_DE": "Ohne Milch"
}
}
]
}
], - "recommendedProductIds": [
- 123,
- 456,
- 789
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "ageLimit": {
- "default": 21,
- "sites": [
- {
- "siteIds": [
- 1,
- 2
], - "ageLimit": 18
}, - {
- "siteIds": [
- 3,
- 4
], - "ageLimit": 21
}
]
}, - "weightKg": 0.1,
- "volumeL": 0.1,
- "lengthMm": 0,
- "widthMm": 0,
- "heightMm": 0,
- "temperature": "ambient",
- "pickingType": "automated"
}Update an existing product by ID or external ID.
Use the product's internal ID directly, or prefix with "ext:" to use the external ID
(e.g., /products/123 or /products/ext:J57S). Note that if using product external ID in
this way, the PUT endpoint becomes an UPSERT operation (create or update).
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
| externalId | string or null Optional product external ID (integrator unique ID). Note that if using product external ID, the PUT operation becomes an UPSERT (create or update). |
object Product name (Internationalized) | |
object Product description (Internationalized) | |
object Product brand (Internationalized) | |
| status | string (ProductStatus) Enum: "pending" "active" "disabled" "inactive" Product lifecycle status:
|
| categoryId | integer or null Category ID this product belongs to |
| labelIds | Array of integers Array of label IDs associated with this product |
Array of objects (ProductIdentifier) Array of product identifiers (SKU, EAN, UPC) | |
| barcodes | Array of strings Array of product barcodes |
object (ProductPrice) Product price details structure with sublines and site level override. | |
object or null Arbitrary key-value pairs for customer/integrator use | |
Array of objects (ProductModifier) Available modifiers for this product when selected by users | |
| recommendedProductIds | Array of integers Array of product IDs recommended to be shown alongside this product (e.g., "Related Products" or "See Also" section) |
object (ProductAgeLimit) | |
| weightKg | number or null <float> Product weight in kilograms |
| volumeL | number or null <float> Product volume in liters |
| lengthMm | number or null <integer> Product length in millimeters |
| widthMm | number or null <integer> Product width in millimeters |
| heightMm | number or null <integer> Product height in millimeters |
| temperature | string (Temperature) Enum: "ambient" "chilled" "frozen" Temprature hat a product should be stored in |
| pickingType | string (PickingType) Enum: "automated" "manual" "external" "integrated" Defines how this product is picked:
|
{- "externalId": "J57S",
- "name": {
- "en_US": "Nature Valley Crunchy",
- "de_DE": "Nature Valley Knusprig"
}, - "description": {
- "en_US": "Crunchy granola bars made with whole grain oats, peanuts, and honey",
- "de_DE": "Knusprige Müsliriegel aus Vollkornhafer, Erdnüssen und Honig"
}, - "brand": {
- "en_US": "Nature Valley",
- "de_DE": "Nature Valley"
}, - "status": "pending",
- "categoryId": 42,
- "labelIds": [
- 27,
- 32,
- 45
], - "identifiers": [
- {
- "type": "SKU",
- "value": "NV-CRUNCHY-6PK"
}, - {
- "type": "EAN",
- "value": "016000275775"
}
], - "barcodes": [
- "016000275775",
- "16000275775"
], - "price": {
- "default": {
- "price": 4.99,
- "sublines": [
- {
- "description": "Tax",
- "amount": 0.17
}, - {
- "description": "Deposit",
- "amount": 0.3
}
]
}, - "sites": [
- {
- "siteIds": [
- 1,
- 2
], - "price": 5.49,
- "sublines": [
- {
- "description": "Tax",
- "amount": 0.21
}, - {
- "description": "Deposit",
- "amount": 0.3
}
]
}, - {
- "siteIds": [
- 3,
- 4
], - "price": 4.29
}
]
}, - "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "modifiers": [
- {
- "key": "strength",
- "name": {
- "en_US": "Coffee Strength",
- "de_DE": "Kaffee Stärke"
}, - "values": [
- {
- "value": "regular",
- "name": {
- "en_US": "Regular",
- "de_DE": "Normal"
}
}, - {
- "value": "strong",
- "name": {
- "en_US": "Strong",
- "de_DE": "Stark"
}
}
]
}
], - "recommendedProductIds": [
- 123,
- 456,
- 789
], - "ageLimit": {
- "default": 21,
- "sites": [
- {
- "siteIds": [
- 1,
- 2
], - "ageLimit": 18
}, - {
- "siteIds": [
- 3,
- 4
], - "ageLimit": 21
}
]
}, - "weightKg": 0.1,
- "volumeL": 0.1,
- "lengthMm": 0,
- "widthMm": 0,
- "heightMm": 0,
- "temperature": "ambient",
- "pickingType": "automated",
- "type": "regular"
}{- "id": 361,
- "externalId": "J57S",
- "name": {
- "en_US": "Nature Valley Crunchy",
- "de_DE": "Nature Valley Knusprig"
}, - "description": {
- "en_US": "Crunchy granola bars made with whole grain oats, peanuts, and honey",
- "de_DE": "Knusprige Müsliriegel aus Vollkornhafer, Erdnüssen und Honig"
}, - "brand": {
- "en_US": "Nature Valley",
- "de_DE": "Nature Valley"
}, - "type": "regular",
- "status": "pending",
- "categoryId": 37,
- "labelIds": [
- 45,
- 58
], - "images": [
- {
- "id": "string",
- "description": "string",
- "primary": true,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
], - "identifiers": [
- {
- "type": "SKU",
- "value": "NV-CRUNCHY-6PK"
}, - {
- "type": "EAN",
- "value": "016000275775"
}
], - "barcodes": [
- "016000275775",
- "16000275775"
], - "price": {
- "default": {
- "price": 4.99,
- "sublines": [
- {
- "description": "Tax",
- "amount": 0.17
}, - {
- "description": "Deposit",
- "amount": 0.3
}
]
}, - "sites": [
- {
- "siteIds": [
- 1,
- 2
], - "price": 5.49,
- "sublines": [
- {
- "description": "Tax",
- "amount": 0.21
}, - {
- "description": "Deposit",
- "amount": 0.3
}
]
}, - {
- "siteIds": [
- 3,
- 4
], - "price": 4.29
}
]
}, - "metadata": {
- "foo": "bar",
- "baz": "1"
}, - "modifiers": [
- {
- "key": "strength",
- "name": {
- "en_US": "Coffee Strength",
- "de_DE": "Kaffee Stärke"
}, - "values": [
- {
- "value": "regular",
- "name": {
- "en_US": "Regular",
- "de_DE": "Normal"
}
}, - {
- "value": "strong",
- "name": {
- "en_US": "Strong",
- "de_DE": "Stark"
}
}
]
}, - {
- "key": "milk",
- "name": {
- "en_US": "Milk Option",
- "de_DE": "Milch Option"
}, - "values": [
- {
- "value": "with_milk",
- "name": {
- "en_US": "With milk",
- "de_DE": "Mit Milch"
}
}, - {
- "value": "no_milk",
- "name": {
- "en_US": "No milk",
- "de_DE": "Ohne Milch"
}
}
]
}
], - "recommendedProductIds": [
- 123,
- 456,
- 789
], - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "ageLimit": {
- "default": 21,
- "sites": [
- {
- "siteIds": [
- 1,
- 2
], - "ageLimit": 18
}, - {
- "siteIds": [
- 3,
- 4
], - "ageLimit": 21
}
]
}, - "weightKg": 0.1,
- "volumeL": 0.1,
- "lengthMm": 0,
- "widthMm": 0,
- "heightMm": 0,
- "temperature": "ambient",
- "pickingType": "automated"
}Delete a product by ID or external ID (only if not referenced in orders).
Use the product's internal ID directly, or prefix with "ext:" to use the external ID
(e.g., /products/123 or /products/ext:J57S).
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
Retrieve all identifiers associated with a product
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
[- {
- "type": "SKU",
- "value": "NV-CRUNCHY-6PK"
}
]Set the identifiers of a product (replace existing list of identifiers)
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
| type required | string Enum: "SKU" "EAN" "UPC" Type of product identifier |
| value required | string Identifier value |
[- {
- "type": "SKU",
- "value": "NV-CRUNCHY-6PK"
}
]{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Add an identifier to a product
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
| type required | string Enum: "SKU" "EAN" "UPC" Type of product identifier |
| value required | string Identifier value |
{- "type": "SKU",
- "value": "NV-CRUNCHY-6PK"
}{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Remove an identifier from a product
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
| identifier required | string Example: EAN:123456789 Identifier value |
{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Retrieve all modifiers associated with a product
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
[- {
- "key": "strength",
- "name": {
- "en_US": "Coffee Strength",
- "de_DE": "Kaffee Stärke"
}, - "values": [
- {
- "value": "regular",
- "name": {
- "en_US": "Regular",
- "de_DE": "Normal"
}
}, - {
- "value": "strong",
- "name": {
- "en_US": "Strong",
- "de_DE": "Stark"
}
}
]
}, - {
- "key": "milk",
- "name": {
- "en_US": "Milk Option",
- "de_DE": "Milch Option"
}, - "values": [
- {
- "value": "with_milk",
- "name": {
- "en_US": "With milk",
- "de_DE": "Mit Milch"
}
}, - {
- "value": "no_milk",
- "name": {
- "en_US": "No milk",
- "de_DE": "Ohne Milch"
}
}
]
}
]Set the modifiers of a product (replace existing list of modifiers)
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
| key required | string Unique identifier for the modifier type |
required | object Human-readable name for the modifier (internationalized) |
required | Array of objects Available values for this modifier |
[- {
- "key": "strength",
- "name": {
- "en_US": "Coffee Strength",
- "de_DE": "Kaffee Stärke"
}, - "values": [
- {
- "value": "regular",
- "name": {
- "en_US": "Regular",
- "de_DE": "Normal"
}
}, - {
- "value": "strong",
- "name": {
- "en_US": "Strong",
- "de_DE": "Stark"
}
}
]
}, - {
- "key": "milk",
- "name": {
- "en_US": "Milk Option",
- "de_DE": "Milch Option"
}, - "values": [
- {
- "value": "with_milk",
- "name": {
- "en_US": "With milk",
- "de_DE": "Mit Milch"
}
}, - {
- "value": "no_milk",
- "name": {
- "en_US": "No milk",
- "de_DE": "Ohne Milch"
}
}
]
}
]{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Add a modifier to a product
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
| key required | string Unique identifier for the modifier type |
required | object Human-readable name for the modifier (internationalized) |
required | Array of objects Available values for this modifier |
{- "key": "size",
- "name": {
- "en_US": "Size Option",
- "de_DE": "Größenoption"
}, - "values": [
- {
- "value": "small",
- "name": {
- "en_US": "Small",
- "de_DE": "Klein"
}
}, - {
- "value": "medium",
- "name": {
- "en_US": "Medium",
- "de_DE": "Mittel"
}
}, - {
- "value": "large",
- "name": {
- "en_US": "Large",
- "de_DE": "Groß"
}
}
]
}{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Update a specific modifier for a product
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
| key required | string Example: strength Modifier key |
| key required | string Unique identifier for the modifier type |
required | object Human-readable name for the modifier (internationalized) |
required | Array of objects Available values for this modifier |
{- "key": "strength",
- "name": {
- "en_US": "Coffee Strength Level",
- "de_DE": "Kaffee Stärke Stufe"
}, - "values": [
- {
- "value": "mild",
- "name": {
- "en_US": "Mild",
- "de_DE": "Mild"
}
}, - {
- "value": "regular",
- "name": {
- "en_US": "Regular",
- "de_DE": "Normal"
}
}, - {
- "value": "strong",
- "name": {
- "en_US": "Strong",
- "de_DE": "Stark"
}
}, - {
- "value": "extra_strong",
- "name": {
- "en_US": "Extra Strong",
- "de_DE": "Extra Stark"
}
}
]
}{- "key": "strength",
- "name": {
- "en_US": "Coffee Strength",
- "de_DE": "Kaffee Stärke"
}, - "values": [
- {
- "value": "regular",
- "name": {
- "en_US": "Regular",
- "de_DE": "Normal"
}
}, - {
- "value": "strong",
- "name": {
- "en_US": "Strong",
- "de_DE": "Stark"
}
}
]
}Remove a modifier from a product
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
| key required | string Example: strength Modifier key |
{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Retrieve all images associated with a product
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
{- "images": [
- {
- "id": "string",
- "description": "string",
- "primary": true,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
]
}Upload and associate an image with a product
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
| image required | string <binary> |
| description | string |
| primary | boolean Default: false |
object or null Arbitrary key-value pairs for customer/integrator use |
{- "id": "string",
- "description": "string",
- "primary": true,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Retrieve details of a specific image for a product
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
| imageId required | string |
{- "id": "string",
- "description": "string",
- "primary": true,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Update an existing product image (metadata only or replace entire image)
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
| imageId required | string |
| image | string or null <byte> Base64 encoded image data to replace existing image |
| description | string or null |
| primary | boolean or null |
object or null Arbitrary key-value pairs for customer/integrator use |
{- "image": "string",
- "description": "string",
- "primary": true,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}
}{- "id": "string",
- "description": "string",
- "primary": true,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Remove an image from a product
| id required | string Example: 123 Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S") |
| imageId required | string |
{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Retrieve hierarchical category structure
| name | string Filter by partial name (across all translations), minimum 2 chars |
| parentId | integer Filter by parent category |
| metadata | string Example: metadata=type:primary,region:north Filter by metadata key-value pairs (format: key1:value1,key2:value2) |
Alternative to query parameters - provide search criteria as JSON with arrays and range operators
| name | string Filter by partial name (across all translations), minimum 2 chars |
| parentId | integer Filter by parent category ID |
object Search by arbitrary metadata key-value pairs |
{- "name": "Drink",
- "parentId": 42,
- "metadata": {
- "type": "primary",
- "region": "north"
}
}[- {
- "id": 3,
- "name": {
- "en_US": "Drinks",
- "de_DE": "Getränke"
}, - "parentId": null,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
]Create a new product category with optional image
required | object Category name (Internationalized) |
| parentId | integer or null Category ID of the parent category |
| image | string or null <byte> Base64 encoded image data (optional) |
object or null Arbitrary key-value pairs for customer/integrator use |
{- "name": {
- "en_US": "Drinks",
- "de_DE": "Getränke"
}, - "parentId": null,
- "image": "string",
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}
}{- "id": 3,
- "name": {
- "en_US": "Drinks",
- "de_DE": "Getränke"
}, - "parentId": null,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}{- "id": 3,
- "name": {
- "en_US": "Drinks",
- "de_DE": "Getränke"
}, - "parentId": null,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Update an existing product category with optional image
| id required | integer |
object Category name (Internationalized) | |
| parentId | integer or null Category ID of the parent category |
| image | string or null <byte> Base64 encoded image data (optional) |
object or null Arbitrary key-value pairs for customer/integrator use |
{- "name": {
- "en_US": "Drinks",
- "de_DE": "Getränke"
}, - "parentId": null,
- "image": "string",
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}
}{- "id": 3,
- "name": {
- "en_US": "Drinks",
- "de_DE": "Getränke"
}, - "parentId": null,
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Retrieve all available product labels
| name | string Filter by partial name (across all translations), minimum 2 chars |
| metadata | string Example: metadata=type:organic,certification:fair-trade Filter by metadata key-value pairs (format: key1:value1,key2:value2) |
Alternative to query parameters - provide search criteria as JSON with arrays and range operators
| name | string Filter by partial name (across all translations), minimum 2 chars |
object Search by arbitrary metadata key-value pairs |
{- "name": "Organic",
- "metadata": {
- "type": "organic",
- "certification": "fair-trade"
}
}[- {
- "id": 27,
- "name": {
- "en_US": "Organic",
- "de_DE": "Bio"
}, - "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
]Create a new product label with optional image
required | object Label name (Internationalized) |
| image | string or null <byte> Base64 encoded image data (optional) |
object or null Arbitrary key-value pairs for customer/integrator use |
{- "name": {
- "en_US": "Organic",
- "de_DE": "Bio"
}, - "image": "string",
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}
}{- "id": 27,
- "name": {
- "en_US": "Organic",
- "de_DE": "Bio"
}, - "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}{- "id": 27,
- "name": {
- "en_US": "Organic",
- "de_DE": "Bio"
}, - "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Update an existing product label with optional image
| id required | integer |
object Label name (Internationalized) | |
| image | string or null <byte> Base64 encoded image data (optional) |
object or null Arbitrary key-value pairs for customer/integrator use |
{- "name": {
- "en_US": "Organic",
- "de_DE": "Bio"
}, - "image": "string",
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}
}{- "id": 27,
- "name": {
- "en_US": "Organic",
- "de_DE": "Bio"
}, - "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Retrieve all sites or search by criteria
| q | string Example: q=Downto Free-form search across site name and location fields. Minimum of 2 chars. |
| metadata | string Example: metadata=region:north,type:flagship Filter by metadata key-value pairs (format: key1:value1,key2:value2) |
Alternative to query parameters - provide search criteria as JSON body
| q | string Free-form search across site name and location fields, minimum 2 chars |
object Search by arbitrary metadata key-value pairs |
{- "q": "Downto",
- "metadata": {
- "region": "north",
- "type": "flagship"
}
}[- {
- "id": 1,
- "name": "Downtown Store",
- "location": {
- "address": "123 Main Street",
- "city": "New York",
- "country": "USA"
}, - "metadata": {
- "timezone": "America/New_York",
- "manager": "John Smith",
- "phone": "+1-555-0123"
}, - "createdAt": "2023-01-15T10:30:00Z",
- "updatedAt": "2023-11-22T14:45:00Z"
}
]{- "id": 1,
- "name": "Downtown Store",
- "location": {
- "address": "123 Main Street",
- "city": "New York",
- "country": "USA"
}, - "metadata": {
- "timezone": "America/New_York",
- "manager": "John Smith",
- "phone": "+1-555-0123"
}, - "createdAt": "2023-01-15T10:30:00Z",
- "updatedAt": "2023-11-22T14:45:00Z"
}Retrieve all systems or search by criteria
| q | string Example: q=Main Free-form search across system name and serial number fields. Minimum of 2 chars. |
| serialNumber | string Filter by system serial number |
| siteId | integer Example: siteId=1 Filter by site ID |
Alternative to query parameters - provide search criteria as JSON body
| q | string Free-form search across system name and serial number fields, minimum 2 chars |
| serialNumber | string Filter by system serial number |
| siteId | integer Filter by site ID |
object Search by arbitrary metadata key-value pairs |
{- "q": "Main",
- "serialNumber": "SYS-001",
- "siteId": 1,
- "metadata": {
- "location": "Building A",
- "floor": "2"
}
}[- {
- "id": 42,
- "serialNumber": "SYS-001-ABC",
- "name": "Main Store System",
- "siteId": 1,
- "healthy": true,
- "paused": false,
- "enabledTasks": {
- "fulfillment": true,
- "consolidation": false
}, - "online": true,
- "metadata": {
- "location": "Building A",
- "floor": "2",
- "zone": "North"
}, - "createdAt": "2023-01-15T10:30:00Z",
- "updatedAt": "2023-11-22T14:45:00Z"
}
]{- "id": 42,
- "serialNumber": "SYS-001-ABC",
- "name": "Main Store System",
- "siteId": 1,
- "healthy": true,
- "paused": false,
- "enabledTasks": {
- "fulfillment": true,
- "consolidation": false
}, - "online": true,
- "metadata": {
- "location": "Building A",
- "floor": "2",
- "zone": "North"
}, - "createdAt": "2023-01-15T10:30:00Z",
- "updatedAt": "2023-11-22T14:45:00Z"
}Retrieve stock levels grouped by product ID
| siteId | integer Example: siteId=1 Filter by site ID |
| systemId | integer Example: systemId=42 Filter by system ID |
| productIds | string Example: productIds=1234,5678,9012 Filter by specific product IDs |
| format | string Default: "json" Enum: "json" "csv" Example: format=csv Response format (default is JSON) |
Alternative to query parameters - provide search criteria as JSON body
| siteId | integer Filter by site ID |
| systemId | integer Filter by system ID |
| productIds | Array of integers Filter by specific product IDs |
| format | string Default: "json" Enum: "json" "csv" Response format (default is JSON) |
{- "siteId": 1,
- "systemId": 42,
- "productIds": [
- 1234,
- 5678,
- 9012
], - "format": "csv"
}[- {
- "productId": 1234,
- "quantity": 25
}, - {
- "productId": 5678,
- "quantity": 12
}, - {
- "productId": 9012,
- "quantity": 1
}
]Retrieve orders with filtering and pagination
| siteId | integer Example: siteId=1 Filter by site ID |
| systemId | integer Example: systemId=42 Filter by system ID |
| status | string Example: status=pending,queued Filter by one or more order statuses (comma separated) |
| date | string <date> Example: date=2024-01-01 Filter orders with exact If no date filter is given, the default is today's date (using system configured timezone, or
site timezone if |
| fromDate | string <date> Example: fromDate=2024-01-01 Filter orders with |
| toDate | string <date> Example: toDate=2024-01-01 Filter orders with |
| page | integer >= 0 Default: 0 Page number (0-based) |
| pageSize | integer [ 1 .. 100 ] Default: 100 Number of items per page |
Alternative to query parameters - provide search criteria as JSON with arrays and range operators
| siteId | integer Filter by site ID |
| systemId | integer Filter by system ID |
| status | Array of strings (OrderStatus) Items Enum: "payment" "pending" "queued" "fetched" "collecting" "collected" "ready" "delivering" "delivered" "error" "cancelled" Filter by order statuses |
| date | string <date> Filter orders with exact deliveryDate |
| fromDate | string <date> Filter orders with deliveryDate on or later than given date |
| toDate | string <date> Filter orders with deliveryDate on or earlier than given date |
| productIds | Array of integers Filter orders containing specific product IDs |
| priority | integer [ 1 .. 5 ] Filter by order priority |
{- "siteId": 1,
- "systemId": 42,
- "status": [
- "pending",
- "queued"
], - "date": "2024-01-01",
- "fromDate": "2024-01-01",
- "toDate": "2024-01-31",
- "productIds": [
- 1234,
- 5678
], - "priority": 1
}{- "page": 0,
- "pageSize": 100,
- "totalItems": 1387,
- "totalPages": 14,
- "hasNext": true,
- "hasPrevious": false,
- "data": [
- {
- "id": 18734,
- "status": "payment",
- "siteId": 1,
- "systemId": 1,
- "products": [
- {
- "productId": 349,
- "quantity": 3,
- "fulfilledQuantity": 0
}, - {
- "productId": 1017,
- "quantity": 1,
- "fulfilledQuantity": 0,
- "integratedProductStatus": "pending",
- "modifiers": {
- "strength": "strong",
- "milk": "with milk"
}
}
], - "deliveryDate": "2024-03-03",
- "deliveryTime": "14:15",
- "priority": 1,
- "displayCode": 7465,
- "pinCode": 5364,
- "user": {
- "locale": "en_US",
- "phoneNumber": "+11111111"
}, - "events": [
- {
- "id": 53283,
- "eventType": "Created",
- "eventData": {
- "source": "shelf",
- "digitalShelfId": 1,
- "deliveryDate": "2024-03-03",
- "deliveryTime": "14:15"
}, - "isError": false,
- "eventTime": "2024-03-03T14:15:22Z"
}
], - "createdAt": "2024-03-03T14:15:22Z",
- "updatedAt": "2024-03-04T12:12:53Z"
}
]
}{- "id": 18734,
- "status": "payment",
- "siteId": 1,
- "systemId": 1,
- "products": [
- {
- "productId": 349,
- "quantity": 3,
- "fulfilledQuantity": 0
}, - {
- "productId": 1017,
- "quantity": 1,
- "fulfilledQuantity": 0,
- "integratedProductStatus": "pending",
- "modifiers": {
- "strength": "strong",
- "milk": "with milk"
}
}
], - "deliveryDate": "2024-03-03",
- "deliveryTime": "14:15",
- "priority": 1,
- "displayCode": 7465,
- "pinCode": 5364,
- "user": {
- "locale": "en_US",
- "phoneNumber": "+11111111"
}, - "events": [
- {
- "id": 53283,
- "eventType": "Created",
- "eventData": {
- "source": "shelf",
- "digitalShelfId": 1,
- "deliveryDate": "2024-03-03",
- "deliveryTime": "14:15"
}, - "isError": false,
- "eventTime": "2024-03-03T14:15:22Z"
}
], - "createdAt": "2024-03-03T14:15:22Z",
- "updatedAt": "2024-03-04T12:12:53Z"
}Retrieve the complete event history for a specific order
| id required | string |
[- {
- "id": 53283,
- "eventType": "Created",
- "eventData": {
- "source": "shelf",
- "digitalShelfId": 1,
- "deliveryDate": "2024-03-03",
- "deliveryTime": "14:15"
}, - "isError": false,
- "eventTime": "2024-03-03T14:15:22Z"
}
]Adds an event to the event history of the order.
This endpoint can be used by the integrator to add events to the order timeline that do not originate from the Xpand system. For example after processing refunds or for integrated products.
| id required | string |
| eventType required | string Type of event (e.g., status_changed, payment_received, item_picked) |
object Additional data associated with the event. The structure and content varies based on the event type | |
| isError | boolean Whether this event is considered an error |
| eventTime required | string <date-time> Timestamp when the event occurred |
{- "eventType": "Created",
- "eventData": {
- "source": "shelf",
- "digitalShelfId": 1,
- "deliveryDate": "2024-03-03",
- "deliveryTime": "14:15"
}, - "isError": false,
- "eventTime": "2024-03-03T14:15:22Z"
}{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Update the status of an individual product in the order.
If the product is an integrated product (pickingType is "integrated"), the endpoint can be used by
the integrator to report the fulfillment progress and status of the product represented by its
integratedProductStatus and fulfilledQuantity properties.
For all products (integrated or otherwise) the refundQuantity can be set following refunds.
| id required | string |
| productId required | integer ID of the product to update |
| integratedProductStatus | string (IntegratedProductStatus) Enum: "pending" "done" "cancelled" Status of integrated products:
This property will only appear if the product |
| fulfilledQuantity | integer >= 0 Updated fulfilled quantity |
| refundQuantity | integer >= 0 Updated refunded quantity |
{- "integratedProductStatus": "pending",
- "fulfilledQuantity": 0,
- "refundQuantity": 0
}{- "productId": 0,
- "productExternalId": "J57S",
- "quantity": 1,
- "fulfilledQuantity": 0,
- "returnedQuantity": 0,
- "refundQuantity": 0,
- "integratedProductStatus": "pending",
- "modifiers": {
- "strength": "strong",
- "milk": "with milk"
}
}Submit the result of an age verification flow started previously using the POST /age-verification
integrator callback API endpoint (see the Integrator Callback APIs spec for more details).
| ageVerificationId required | integer Unique ID for this age verification flow as provided in the initial integrator callback API call. |
| success required | boolean Whether the age verification flow was successful or not |
object Text message that can be presented to the user explaining the reason for the failure of the flow, in case of failure (Internationalized). |
{- "ageVerificationId": 10476,
- "success": true,
- "message": {
- "en_US": "Failed to read ID card",
- "de_DE": "Ausweis konnte nicht gelesen werden"
}
}{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Submit the result of a scan promo code flow started previously using the POST /promo-code/scan
integrator callback API endpoint (see the Integrator Callback APIs spec for more details).
| promoCodeScanId required | integer Unique ID for scan promo code flow as provided in the initial integrator callback API call. |
| valid required | boolean Whether the scan promo code flow yielded a valid promo code or not |
object Text message that can be presented to the user explaining the reason for the rejection of the scanned promo code or the failure of the scan attempt, in case of failure (Internationalized). | |
| promoCode | string Actual string to use in subsequent Review Shopping Cart API calls. May or may not be identical to the original promo code read by the scan. |
{- "promoCodeScanId": 10476,
- "valid": true,
- "message": {
- "en_US": "Failed to read QR code",
- "de_DE": "QR-Code konnte nicht gelesen werden"
}, - "promoCode": "string"
}{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Submit the result of a payment pre-auth flow started previously using the POST /payments/preauth
integrator callback API endpoint (see the Integrator Callback APIs spec for more details).
This API call can include an optional transactionId generated on the integrator side (either by
the integrator or the payment provider) that uniquely identifies this payment transaction. If this
transactionId is included in the request, it will be sent back in the follow up
POST /payments/finalize integrator callback API call.
| paymentId required | integer Unique ID for this payment pre-auth flow as provided in the initial integrator callback API call. |
| transactionId | string or null Optional integrator transaction ID |
| success required | boolean Whether the payment pre-auth flow was successful or not |
object Text message that can be presented to the user explaining the reason for the failure of the flow, in case of failure (Internationalized). |
{- "paymentId": 11938,
- "transactionId": "txn_preauth_456789",
- "success": true,
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}
}{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Submit the result of a payment finalization flow started previously using the POST /payments/finalize
integrator callback API endpoint (see the Integrator Callback APIs spec for more details).
| paymentId required | integer Unique ID for this payment finalization flow as provided in the initial integrator callback API call. |
| success required | boolean Whether the payment finalization flow was successful or not |
object Text message that can be presented to the user explaining the reason for the failure of the flow, in case of failure (Internationalized). |
{- "paymentId": 11938,
- "success": true,
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}
}{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Signal the end a print invoice flow started previously using the POST /print-invoice
integrator callback API endpoint (see the Integrator Callback APIs spec for more details).
Since the Print Invoice flow carries no data required by the Xpand side the request is an empty body POST and the response is an empty 200.
{- "error": "string",
- "message": {
- "en_US": "Payment failed",
- "de_DE": "Zahlung fehlgeschlagen"
}, - "details": { }
}Retrieve all media
| metadata | string Example: metadata=campaign:summer,format:banner Filter by metadata key-value pairs (format: key1:value1,key2:value2) |
[- {
- "id": 0,
- "name": "string",
- "enabled": true,
- "weight": 0,
- "siteIds": [
- 0
], - "categoryId": 0,
- "startTime": "string",
- "endTime": "string",
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
]Create a new media
| name required | string |
| videoUrl required | string <uri> |
| enabled | boolean Default: true |
| weight | integer Default: 0 How much to display this media vs. others (higher values have higher priority) |
| siteIds | Array of integers or null Limit to these siteIds, null means show on all sites |
| categoryId | integer or null Display next to this category, null means not associated with any category |
| startTime | string or null^([01]?[0-9]|2[0-3]):[0-5][0-9]$ Local time, HH:mm only. If specified, endTime must also be present. Limit this media to this time range. |
| endTime | string or null^([01]?[0-9]|2[0-3]):[0-5][0-9]$ Local time, HH:mm only. If specified, startTime must also be present. Limit this media to this time range. |
object or null Arbitrary key-value pairs for customer/integrator use |
{- "name": "string",
- "enabled": true,
- "weight": 0,
- "siteIds": [
- 0
], - "categoryId": 0,
- "startTime": "string",
- "endTime": "string",
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}
}{- "id": 0,
- "name": "string",
- "enabled": true,
- "weight": 0,
- "siteIds": [
- 0
], - "categoryId": 0,
- "startTime": "string",
- "endTime": "string",
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}{- "id": 0,
- "name": "string",
- "enabled": true,
- "weight": 0,
- "siteIds": [
- 0
], - "categoryId": 0,
- "startTime": "string",
- "endTime": "string",
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Update an existing media
| id required | integer |
| name | string |
| videoUrl | string <uri> |
| enabled | boolean |
| weight | integer How much to display this media vs. others (higher values have higher priority) |
| siteIds | Array of integers or null Limit to these siteIds, null means show on all sites |
| categoryId | integer or null Display next to this category, null means not associated with any category |
| startTime | string or null^([01]?[0-9]|2[0-3]):[0-5][0-9]$ Local time, HH:mm only. If specified, endTime must also be present. Limit this media to this time range. |
| endTime | string or null^([01]?[0-9]|2[0-3]):[0-5][0-9]$ Local time, HH:mm only. If specified, startTime must also be present. Limit this media to this time range. |
object or null Arbitrary key-value pairs for customer/integrator use |
{- "name": "string",
- "enabled": true,
- "weight": 0,
- "siteIds": [
- 0
], - "categoryId": 0,
- "startTime": "string",
- "endTime": "string",
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}
}{- "id": 0,
- "name": "string",
- "enabled": true,
- "weight": 0,
- "siteIds": [
- 0
], - "categoryId": 0,
- "startTime": "string",
- "endTime": "string",
- "metadata": {
- "customField1": "Custom Value",
- "nutritionScore": "A",
- "allergens": "Contains nuts"
}, - "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Retrieve all registered webhooks.
Webhooks allow external systems to receive real-time notifications about events in the Xpand system. When an event occurs (such as an order status change), the system will make an HTTP POST request to the registered callback URL with a JSON payload containing the updated resource data.
Currently, the following event types are supported:
systems: Triggered when a system's state changesorders: Triggered when an order is created, updated, or its status changesThe webhook payload is a JSON object that matches the response from the corresponding GET endpoint
for the resource that changed. For example, an order webhook payload will match the response from
GET /orders/{id}.
The type of the webhook event will appear in an X-Xpand-Event header.
X-Xpand-Event: orders
{
"id": 18734,
"status": "payment",
"siteId": 1,
"systemId": 1,
"products": [
{
"productId": 349,
"quantity": 3,
"fulfilledQuantity": 0
},
{
"productId": 1017,
"quantity": 1,
"fulfilledQuantity": 0,
"integratedProductStatus": "pending",
"modifiers": {
"strength": "strong",
"milk": "with milk"
}
}
],
"deliveryDate": "2024-03-03",
"deliveryTime": "14:15",
"priority": 1,
"displayCode": 7465,
"pinCode": 5364,
"user": {
"locale": "en_US",
"phoneNumber": "+11111111"
},
"createdAt": "2024-03-03T14:15:22Z",
"updatedAt": "2024-03-04T12:12:53Z"
}
The receiving webhook endpoint should:
If the webhook endpoint returns a non-2xx response or times out, the Xpand Autonomous Store backend will retry the webhook with an exponential backoff strategy until finally giving up.
[- {
- "id": 17,
- "description": "Orders Webhook",
- "eventTypes": [
- "orders"
], - "active": true,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}
]Register a new webhook for event notifications
| description | string Human-readable description of the webhook |
| callbackUrl required | string <uri> URL that will be called when events occur |
| eventTypes required | Array of strings Items Value: "orders" Types of events to subscribe to (currently only 'orders' is supported) |
| active | boolean Default: true Whether the webhook should be active upon creation |
{- "description": "Orders Webhook",
- "eventTypes": [
- "orders"
], - "active": true
}{- "id": 17,
- "description": "Orders Webhook",
- "eventTypes": [
- "orders"
], - "active": true,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}{- "id": 17,
- "description": "Orders Webhook",
- "eventTypes": [
- "orders"
], - "active": true,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}Update an existing webhook
| id required | string |
| description | string Human-readable description of the webhook |
| callbackUrl required | string <uri> URL that will be called when events occur |
| eventTypes required | Array of strings Items Value: "orders" Types of events to subscribe to (currently only 'orders' is supported) |
| active | boolean Default: true Whether the webhook should be active upon creation |
{- "description": "Orders Webhook",
- "eventTypes": [
- "orders"
], - "active": true
}{- "id": 17,
- "description": "Orders Webhook",
- "eventTypes": [
- "orders"
], - "active": true,
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z"
}