Xpand Autonomous Store Management API (1.0)

Overview

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:

  • Product catalog
  • Systems, grouped into Sites
  • Stock
  • Orders
  • Webhooks
  • Media

Diagram1

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.

Diagram2

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 Authentication

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

API Standards

A few principles are maintained across the API:

GET search endpoints

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
}

Partial PUTs

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

Sub-endpoints

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}

External ID Support

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:

  • Must be unique across all products if provided
  • Is stored as an arbitrary string by the Xpand API
  • Can be used in place of the Xpand internal product ID in API endpoints

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

Metadata

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
}

Products

Product portfolio management

List products

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.

Product Bundles

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.

query Parameters
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 <type>:<value> (SKU:123456789)

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

Request Body schema: application/json
optional

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 <type>:<value> (SKU:123456789)

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

Responses

Request samples

Content type
application/json
{
  • "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"
    }
}

Response samples

Content type
application/json
{
  • "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"
      }
    ]
}

Create product | Bulk import

This endpoint has two forms depending on the content type:

Body Operation
JSON Create single product
CSV Bulk upsert products

Create single product (JSON body)

Create a new product in pending status.

Note that if using externalIds, products can also be inserted using the PUT endpoint.

Bulk upsert multiple products (CSV body)

The columns of the CSV file should follow a simple convention based on the JSON fields:

  • Simple scalar fields appear normally in the CSV file with a column header matching the JSON property name.
  • Lists of scalar values should be appear in the CSV as comma separated values.
  • Complex objects such as internationalized fields or metadata should appear in columns with headers separated by dot, e.g. name.en_US,name.de_DE.
  • Lists of simple objects with only two properties such as identifiers should follow a comma and colon separated convention: SKU:01234567,EAN:01234567
  • More complex object properties such as price 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
Request Body schema:
required
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:

  • regular: Standard product with physical properties and picking requirements
  • bundle: Product bundle containing multiple other products
status
string (ProductStatus)
Enum: "pending" "active" "disabled" "inactive"

Product lifecycle status:

  • pending: Product is not in use yet, some data is still missing (dimensions, image, AI training, etc)
  • active: Product is in use and fully operational
  • disabled: Product is in use but temporarily disabled, still appears in UI but grayed out
  • inactive: Product is discontinued, do not show in UI. Fulfill in existing orders but do not accept in new orders. Remove from replenishment recommendations
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:

  • automated: Stored inside the machine and picked automatically by the Xpand Autonomous Store automated picking system
  • manual: Stored inside the machine and picked manually by human picker using the Xpand SKM UI
  • external: Stored outside the machine and picked manually by human picker using the Xpand SKM UI
  • integrated: Product fulfillment is fully managed by the customer/integrator

Responses

Request samples

Content type
Example
{
  • "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"
}

Response samples

Content type
application/json
Example
{
  • "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"
}

Get product

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

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

Responses

Response samples

Content type
application/json
Example
{
  • "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 product

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

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

Request Body schema: application/json
required
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:

  • pending: Product is not in use yet, some data is still missing (dimensions, image, AI training, etc)
  • active: Product is in use and fully operational
  • disabled: Product is in use but temporarily disabled, still appears in UI but grayed out
  • inactive: Product is discontinued, do not show in UI. Fulfill in existing orders but do not accept in new orders. Remove from replenishment recommendations
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:

  • automated: Stored inside the machine and picked automatically by the Xpand Autonomous Store automated picking system
  • manual: Stored inside the machine and picked manually by human picker using the Xpand SKM UI
  • external: Stored outside the machine and picked manually by human picker using the Xpand SKM UI
  • integrated: Product fulfillment is fully managed by the customer/integrator

Responses

Request samples

Content type
application/json
Example
{
  • "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"
}

Response samples

Content type
application/json
Example
{
  • "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 product

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

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

Responses

Product Identifiers

Product identifier management

List product identifiers

Retrieve all identifiers associated with a product

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

Responses

Response samples

Content type
application/json
[
  • {
    • "type": "SKU",
    • "value": "NV-CRUNCHY-6PK"
    }
]

Set product identifiers

Set the identifiers of a product (replace existing list of identifiers)

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

Request Body schema: application/json
required
Array
type
required
string
Enum: "SKU" "EAN" "UPC"

Type of product identifier

value
required
string

Identifier value

Responses

Request samples

Content type
application/json
[
  • {
    • "type": "SKU",
    • "value": "NV-CRUNCHY-6PK"
    }
]

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Add product identifier

Add an identifier to a product

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

Request Body schema: application/json
required
type
required
string
Enum: "SKU" "EAN" "UPC"

Type of product identifier

value
required
string

Identifier value

Responses

Request samples

Content type
application/json
{
  • "type": "SKU",
  • "value": "NV-CRUNCHY-6PK"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Delete product identifier

Remove an identifier from a product

path Parameters
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

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Product Modifiers

Product modifier management

List product modifiers

Retrieve all modifiers associated with a product

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

Responses

Response samples

Content type
application/json
[
  • {
    • "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 product modifiers

Set the modifiers of a product (replace existing list of modifiers)

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

Request Body schema: application/json
required
Array
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

Responses

Request samples

Content type
application/json
[
  • {
    • "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"
          }
        }
      ]
    }
]

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Add product modifier

Add a modifier to a product

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "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ß"
        }
      }
    ]
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Update product modifier

Update a specific modifier for a product

path Parameters
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

Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "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"
        }
      }
    ]
}

Response samples

Content type
application/json
{
  • "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"
        }
      }
    ]
}

Delete product modifier

Remove a modifier from a product

path Parameters
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

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Product Images

Product image management

List product images

Retrieve all images associated with a product

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

Responses

Response samples

Content type
application/json
{
  • "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"
      }
    ]
}

Add product image

Upload and associate an image with a product

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

Request Body schema:
required
image
required
string <binary>
description
string
primary
boolean
Default: false
object or null

Arbitrary key-value pairs for customer/integrator use

Responses

Request samples

Content type
No sample

Response samples

Content type
application/json
{
  • "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"
}

Get product image

Retrieve details of a specific image for a product

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

imageId
required
string

Responses

Response samples

Content type
application/json
{
  • "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 product image

Update an existing product image (metadata only or replace entire image)

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

imageId
required
string
Request Body schema:
required
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

Responses

Request samples

Content type
{
  • "image": "string",
  • "description": "string",
  • "primary": true,
  • "metadata": {
    • "customField1": "Custom Value",
    • "nutritionScore": "A",
    • "allergens": "Contains nuts"
    }
}

Response samples

Content type
application/json
{
  • "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"
}

Delete product image

Remove an image from a product

path Parameters
id
required
string
Example: 123

Product ID (integer) or external ID prefixed with "ext:" (e.g., "ext:J57S")

imageId
required
string

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Categories

Hierarchical product categorization

List categories

Retrieve hierarchical category structure

query Parameters
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)

Request Body schema: application/json
optional

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

Responses

Request samples

Content type
application/json
{
  • "name": "Drink",
  • "parentId": 42,
  • "metadata": {
    • "type": "primary",
    • "region": "north"
    }
}

Response samples

Content type
application/json
[
  • {
    • "id": 3,
    • "name": {
      • "en_US": "Drinks",
      • "de_DE": "Getränke"
      },
    • "parentId": null,
    • "imageUrl": "http://example.com",
    • "metadata": {
      • "customField1": "Custom Value",
      • "nutritionScore": "A",
      • "allergens": "Contains nuts"
      },
    • "createdAt": "2019-08-24T14:15:22Z",
    • "updatedAt": "2019-08-24T14:15:22Z"
    }
]

Create category

Create a new product category with optional image

Request Body schema:
required
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

Responses

Request samples

Content type
{
  • "name": {
    • "en_US": "Drinks",
    • "de_DE": "Getränke"
    },
  • "parentId": null,
  • "image": "string",
  • "metadata": {
    • "customField1": "Custom Value",
    • "nutritionScore": "A",
    • "allergens": "Contains nuts"
    }
}

Response samples

Content type
application/json
{
  • "id": 3,
  • "name": {
    • "en_US": "Drinks",
    • "de_DE": "Getränke"
    },
  • "parentId": null,
  • "imageUrl": "http://example.com",
  • "metadata": {
    • "customField1": "Custom Value",
    • "nutritionScore": "A",
    • "allergens": "Contains nuts"
    },
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Get category

Retrieve a specific category by ID

path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "id": 3,
  • "name": {
    • "en_US": "Drinks",
    • "de_DE": "Getränke"
    },
  • "parentId": null,
  • "imageUrl": "http://example.com",
  • "metadata": {
    • "customField1": "Custom Value",
    • "nutritionScore": "A",
    • "allergens": "Contains nuts"
    },
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Update category

Update an existing product category with optional image

path Parameters
id
required
integer
Request Body schema:
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

Responses

Request samples

Content type
{
  • "name": {
    • "en_US": "Drinks",
    • "de_DE": "Getränke"
    },
  • "parentId": null,
  • "image": "string",
  • "metadata": {
    • "customField1": "Custom Value",
    • "nutritionScore": "A",
    • "allergens": "Contains nuts"
    }
}

Response samples

Content type
application/json
{
  • "id": 3,
  • "name": {
    • "en_US": "Drinks",
    • "de_DE": "Getränke"
    },
  • "parentId": null,
  • "imageUrl": "http://example.com",
  • "metadata": {
    • "customField1": "Custom Value",
    • "nutritionScore": "A",
    • "allergens": "Contains nuts"
    },
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Delete category

Remove a product category

path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Labels

Flat product labeling

List labels

Retrieve all available product labels

query Parameters
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)

Request Body schema: application/json
optional

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

Responses

Request samples

Content type
application/json
{
  • "name": "Organic",
  • "metadata": {
    • "type": "organic",
    • "certification": "fair-trade"
    }
}

Response samples

Content type
application/json
[
  • {
    • "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 label

Create a new product label with optional image

Request Body schema:
required
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

Responses

Request samples

Content type
{
  • "name": {
    • "en_US": "Organic",
    • "de_DE": "Bio"
    },
  • "image": "string",
  • "metadata": {
    • "customField1": "Custom Value",
    • "nutritionScore": "A",
    • "allergens": "Contains nuts"
    }
}

Response samples

Content type
application/json
{
  • "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"
}

Get label

Retrieve a specific label by ID

path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "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 label

Update an existing product label with optional image

path Parameters
id
required
integer
Request Body schema:
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

Responses

Request samples

Content type
{
  • "name": {
    • "en_US": "Organic",
    • "de_DE": "Bio"
    },
  • "image": "string",
  • "metadata": {
    • "customField1": "Custom Value",
    • "nutritionScore": "A",
    • "allergens": "Contains nuts"
    }
}

Response samples

Content type
application/json
{
  • "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"
}

Delete label

Remove a product label

path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Sites

Site management and configuration

List sites

Retrieve all sites or search by criteria

query Parameters
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)

Request Body schema: application/json
optional

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

Responses

Request samples

Content type
application/json
{
  • "q": "Downto",
  • "metadata": {
    • "region": "north",
    • "type": "flagship"
    }
}

Response samples

Content type
application/json
[
  • {
    • "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"
    }
]

Get site

Retrieve details of a specific site

path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "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"
}

Systems

Autonomous robotic system management

List systems

Retrieve all systems or search by criteria

query Parameters
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

Request Body schema: application/json
optional

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

Responses

Request samples

Content type
application/json
{
  • "q": "Main",
  • "serialNumber": "SYS-001",
  • "siteId": 1,
  • "metadata": {
    • "location": "Building A",
    • "floor": "2"
    }
}

Response samples

Content type
application/json
[
  • {
    • "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"
    }
]

Get system

Retrieve details of a specific robotic system

path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "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"
}

Stock

Stock level management

Get stock level

Retrieve stock levels grouped by product ID

query Parameters
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)

Request Body schema: application/json
optional

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)

Responses

Request samples

Content type
application/json
{
  • "siteId": 1,
  • "systemId": 42,
  • "productIds": [
    • 1234,
    • 5678,
    • 9012
    ],
  • "format": "csv"
}

Response samples

Content type
[
  • {
    • "productId": 1234,
    • "quantity": 25
    },
  • {
    • "productId": 5678,
    • "quantity": 12
    },
  • {
    • "productId": 9012,
    • "quantity": 1
    }
]

Orders

Order lifecycle and fulfillment

List orders

Retrieve orders with filtering and pagination

query Parameters
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 deliveryDate

If no date filter is given, the default is today's date (using system configured timezone, or site timezone if siteId is given)

fromDate
string <date>
Example: fromDate=2024-01-01

Filter orders with deliveryDate on or later than given date

toDate
string <date>
Example: toDate=2024-01-01

Filter orders with deliveryDate on or earlier than given date

page
integer >= 0
Default: 0

Page number (0-based)

pageSize
integer [ 1 .. 100 ]
Default: 100

Number of items per page

Request Body schema: application/json
optional

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

Responses

Request samples

Content type
application/json
{
  • "siteId": 1,
  • "systemId": 42,
  • "status": [
    • "pending",
    • "queued"
    ],
  • "date": "2024-01-01",
  • "fromDate": "2024-01-01",
  • "toDate": "2024-01-31",
  • "productIds": [
    • 1234,
    • 5678
    ],
  • "priority": 1
}

Response samples

Content type
application/json
{
  • "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"
      }
    ]
}

Get order

Retrieve details of a specific order

path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "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"
}

Get order events

Retrieve the complete event history for a specific order

path Parameters
id
required
string

Responses

Response samples

Content type
application/json
[
  • {
    • "id": 53283,
    • "eventType": "Created",
    • "eventData": {
      • "source": "shelf",
      • "digitalShelfId": 1,
      • "deliveryDate": "2024-03-03",
      • "deliveryTime": "14:15"
      },
    • "isError": false,
    • "eventTime": "2024-03-03T14:15:22Z"
    }
]

Add order event

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.

path Parameters
id
required
string
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "eventType": "Created",
  • "eventData": {
    • "source": "shelf",
    • "digitalShelfId": 1,
    • "deliveryDate": "2024-03-03",
    • "deliveryTime": "14:15"
    },
  • "isError": false,
  • "eventTime": "2024-03-03T14:15:22Z"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Update order product status

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.

path Parameters
id
required
string
productId
required
integer

ID of the product to update

Request Body schema: application/json
required
integratedProductStatus
string (IntegratedProductStatus)
Enum: "pending" "done" "cancelled"

Status of integrated products:

  • pending: Integrated product fulfillment is pending
  • done: Integrated product has been successfully fulfilled
  • cancelled: Integrated product fulfillment was cancelled

This property will only appear if the product pickingType is "integrated"

fulfilledQuantity
integer >= 0

Updated fulfilled quantity

refundQuantity
integer >= 0

Updated refunded quantity

Responses

Request samples

Content type
application/json
{
  • "integratedProductStatus": "pending",
  • "fulfilledQuantity": 0,
  • "refundQuantity": 0
}

Response samples

Content type
application/json
{
  • "productId": 0,
  • "productExternalId": "J57S",
  • "quantity": 1,
  • "fulfilledQuantity": 0,
  • "returnedQuantity": 0,
  • "refundQuantity": 0,
  • "integratedProductStatus": "pending",
  • "modifiers": {
    • "strength": "strong",
    • "milk": "with milk"
    }
}

Integration

Integration endpoints

Age Verification

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

Request Body schema: application/json
required
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).

Responses

Request samples

Content type
application/json
{
  • "ageVerificationId": 10476,
  • "success": true,
  • "message": {
    • "en_US": "Failed to read ID card",
    • "de_DE": "Ausweis konnte nicht gelesen werden"
    }
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Scan Promo Code

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

Request Body schema: application/json
required
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.

Responses

Request samples

Content type
application/json
{
  • "promoCodeScanId": 10476,
  • "valid": true,
  • "message": {
    • "en_US": "Failed to read QR code",
    • "de_DE": "QR-Code konnte nicht gelesen werden"
    },
  • "promoCode": "string"
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Pre-authorize Payment

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.

Request Body schema: application/json
required
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).

Responses

Request samples

Content type
application/json
{
  • "paymentId": 11938,
  • "transactionId": "txn_preauth_456789",
  • "success": true,
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    }
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Finalize Payment

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

Request Body schema: application/json
required
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).

Responses

Request samples

Content type
application/json
{
  • "paymentId": 11938,
  • "success": true,
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    }
}

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Print Invoice

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.

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}

Media

Media management for display in the store

List media

Retrieve all media

query Parameters
metadata
string
Example: metadata=campaign:summer,format:banner

Filter by metadata key-value pairs (format: key1:value1,key2:value2)

Responses

Response samples

Content type
application/json
[
  • {
    • "id": 0,
    • "name": "string",
    • "videoUrl": "http://example.com",
    • "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 media

Create a new media

Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "videoUrl": "http://example.com",
  • "enabled": true,
  • "weight": 0,
  • "siteIds": [
    • 0
    ],
  • "categoryId": 0,
  • "startTime": "string",
  • "endTime": "string",
  • "metadata": {
    • "customField1": "Custom Value",
    • "nutritionScore": "A",
    • "allergens": "Contains nuts"
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "videoUrl": "http://example.com",
  • "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"
}

Get media

Retrieve details of a specific media

path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "videoUrl": "http://example.com",
  • "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 media

Update an existing media

path Parameters
id
required
integer
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "videoUrl": "http://example.com",
  • "enabled": true,
  • "weight": 0,
  • "siteIds": [
    • 0
    ],
  • "categoryId": 0,
  • "startTime": "string",
  • "endTime": "string",
  • "metadata": {
    • "customField1": "Custom Value",
    • "nutritionScore": "A",
    • "allergens": "Contains nuts"
    }
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "videoUrl": "http://example.com",
  • "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"
}

Webhooks

Event notification webhooks

List webhooks

Retrieve all registered webhooks.

Webhooks Overview

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.

Event Types

Currently, the following event types are supported:

  • systems: Triggered when a system's state changes
  • orders: Triggered when an order is created, updated, or its status changes

Webhook Payload

The 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"
}

Handling Webhook Requests

The receiving webhook endpoint should:

  1. Respond with a 2xx status code (preferably 200 OK) to acknowledge receipt
  2. Process the webhook asynchronously if the processing might take time
  3. Be idempotent, as the same webhook might be delivered multiple times

Retry Behavior

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.

Responses

Response samples

Content type
application/json
[
  • {
    • "id": 17,
    • "description": "Orders Webhook",
    • "callbackUrl": "https://example.com/orders",
    • "eventTypes": [
      • "orders"
      ],
    • "active": true,
    • "createdAt": "2019-08-24T14:15:22Z",
    • "updatedAt": "2019-08-24T14:15:22Z"
    }
]

Create webhook

Register a new webhook for event notifications

Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "id": 17,
  • "description": "Orders Webhook",
  • "callbackUrl": "https://example.com/orders",
  • "eventTypes": [
    • "orders"
    ],
  • "active": true,
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Get webhook

Retrieve details of a specific webhook

path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "id": 17,
  • "description": "Orders Webhook",
  • "callbackUrl": "https://example.com/orders",
  • "eventTypes": [
    • "orders"
    ],
  • "active": true,
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Update webhook

Update an existing webhook

path Parameters
id
required
string
Request Body schema: application/json
required
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

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{
  • "id": 17,
  • "description": "Orders Webhook",
  • "callbackUrl": "https://example.com/orders",
  • "eventTypes": [
    • "orders"
    ],
  • "active": true,
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Delete webhook

Delete a webhook

path Parameters
id
required
string

Responses

Response samples

Content type
application/json
{
  • "error": "string",
  • "message": {
    • "en_US": "Payment failed",
    • "de_DE": "Zahlung fehlgeschlagen"
    },
  • "details": { }
}