Skip to content

Products Endpoint

The products endpoints return your finished, store-ready catalog: resolved titles and descriptions, converted prices, computed stock, images, and attributes — everything your storefront needs to publish a product.

All requests require a bearer token. See Authentication.

GET /v1/products

Returns a paginated list of the products in a store’s catalog, ordered by product ID.

Parameter Type Default Description
store string default store Slug of the store to read. Omit to use your default store.
per_page integer 50 Products per page. Clamped to the range 1–200.
page integer 1 Page number to return.
Terminal window
curl "https://api.malovex.com/v1/products?store=eu-store&per_page=50" \
-H "Authorization: Bearer mlx_xxx"
{
"data": [
{
"id": 1,
"sku": "MX-000001",
"ean": "4000000000001",
"title": "Product 1",
"description": "A great product from Supplier 1.",
"manufacturer": "Manufacturer 1",
"images": [
"https://cdn.malovex.com/media/products/1/a1b2c3.jpg"
],
"store": "eu-store",
"excluded": false,
"exclusion_reason": null,
"attributes": [
{ "key": "color", "label": "Color", "value": "Black" },
{ "key": "weight", "label": "Weight (kg)", "value": "1.2" }
],
"prices": [
{
"customer_group_id": 1,
"customer_group": "Retail",
"base_cost": 42.00,
"computed_price": 59.99,
"currency": "EUR",
"applied_rule_id": 7
}
],
"stock": 120
}
],
"store": "eu-store",
"meta": {
"current_page": 1,
"per_page": 50,
"last_page": 4,
"total": 173
}
}

The list is paginated. Read the meta block to page through the full catalog:

Field Description
current_page The page this response represents.
per_page Products per page in this response.
last_page The final page number.
total Total products across all pages.

Request the next page with ?page=2, and so on, until current_page equals last_page.

GET /v1/products/{id}

Returns one product’s full payload — the same object shape as an item in the list.

Terminal window
curl "https://api.malovex.com/v1/products/1?store=eu-store" \
-H "Authorization: Bearer mlx_xxx"
{
"data": {
"id": 1,
"sku": "MX-000001",
"ean": "4000000000001",
"title": "Product 1",
"description": "A great product from Supplier 1.",
"manufacturer": "Manufacturer 1",
"images": ["https://cdn.malovex.com/media/products/1/a1b2c3.jpg"],
"store": "eu-store",
"excluded": false,
"exclusion_reason": null,
"attributes": [
{ "key": "color", "label": "Color", "value": "Black" }
],
"prices": [
{
"customer_group_id": 1,
"customer_group": "Retail",
"base_cost": 42.00,
"computed_price": 59.99,
"currency": "EUR",
"applied_rule_id": 7
}
],
"stock": 120
}
}

A request for a product that isn’t in your catalog returns 404.

Every product payload is resolved for the store you requested — titles and descriptions in the store’s locale, prices in the store’s currency.

Field Type Description
id integer Malovex’s product ID. Stable — use it as your key.
sku string | null The exported SKU, built from your SKU pattern.
ean string | null The product’s primary EAN.
title string | null Title, resolved into the store’s locale.
description string | null Description, resolved into the store’s locale.
manufacturer string | null Manufacturer name, or null if none is set.
images array of strings Ordered list of image URLs (see below).
store string The slug of the store this payload was resolved for.
excluded boolean Whether the product is excluded from this store’s export.
exclusion_reason string | null Why it’s excluded, when excluded is true.
attributes array of objects Resolved attributes (see below).
prices array of objects One entry per customer group (see Prices).
stock integer Sellable quantity for the store (see below).

Image URLs point at Malovex-hosted copies once an image has been mirrored, so your storefront isn’t dependent on the original supplier’s servers. Until an image is mirrored, its original URL is served. Images whose source has gone permanently dead are dropped from the array, so every URL in images is one Malovex expects to be reachable.

Each attribute is an object with three fields:

Field Description
key The attribute’s stable key, e.g. color.
label The display label in the store’s locale, including a unit where one applies, e.g. Weight (kg).
value The resolved value.

Attributes reflect any overrides you’ve made, layered over the values imported from your suppliers.

stock is a single sellable quantity, already accounting for the sell-own-first rule:

  • If you hold your own stock for the product, stock is your own quantity plus the best supplier’s quantity — your stock sells first, and the supplier backfills once yours runs out.
  • If you hold no own stock, stock is simply the best supplier’s quantity.
  • If there are no offers at all, stock is 0.
GET /v1/stores

Returns your active stores so you know which slugs to pass as ?store=. Ordered with the default store first.

Terminal window
curl https://api.malovex.com/v1/stores \
-H "Authorization: Bearer mlx_xxx"
{
"data": [
{
"slug": "eu-store",
"name": "EU Store",
"locale": "en",
"currency": "EUR",
"is_default": true
},
{
"slug": "uk-store",
"name": "UK Store",
"locale": "en",
"currency": "GBP",
"is_default": false
}
]
}
Field Description
slug Pass this as ?store= on the other endpoints.
name The store’s display name.
locale The store’s content language.
currency The currency prices are returned in.
is_default Whether this is your default store.