Returns the products Mercadona suggests alongside a given product, up to 10, in Mercadona’s own order. These are cross-sell suggestions (for example olive oils shown next to a salt), not variants of the same product. Each item is a product row with price, unit price and availability for the resolved warehouse. To get more than 10, pass the ids you have already seen in exclude and the list is filled back up with the next suggestions.
HTTP Request
GET /product-related-products
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
product_id | string | Yes | - | Mercadona product id, passed verbatim. Unknown ids return an empty list |
exclude | string | No | - | Comma-separated product ids to leave out. The list is filled back up to 10 with the next suggestions. To page, pass every product_id received so far and repeat until fewer than 10 come back |
postal_code | string | No | - | Spanish 5-digit postal code. Resolved to the warehouse that serves that address and takes precedence over warehouse |
warehouse | string | No | vlc1 | Hub or 4-digit store code from /warehouses
. Ignored when postal_code is given |
language | string | No | es | es, en or ca. Translates product names and category names |
fresh | boolean | No | false | Bypass the 10-minute cache and fetch live data |
Response
Request: GET /product-related-products?product_id=10381. The items array is trimmed to 2 of 10.
| |
Response Fields
| Field | Type | Description |
|---|---|---|
status | boolean | true when the request succeeded |
request_id | string | Unique request identifier |
cached_at | string | null | ISO timestamp when the answer came from cache, null when fetched for this request |
data | object | Response payload |
data.items[] | array | Up to 10 suggested products, in Mercadona’s order |
data.items[].product_id | string | Mercadona product id. Pass it verbatim: decimal ids like 81241.3 exist |
data.items[].name | string | Product name, translated with language |
data.items[].slug | string | URL slug of the product page |
data.items[].url | string | Product URL on tienda.mercadona.es |
data.items[].thumbnail | string | Product image URL (300x300) |
data.items[].packaging | string | null | Packaging label, e.g. "Pack-6" or "Brik" |
data.items[].main_feature | string | null | Highlighted feature, when Mercadona sets one |
data.items[].is_water | boolean | Water product flag |
data.items[].requires_age_check | boolean | Alcohol or other age-restricted product |
data.items[].category | object | Level-0 category of the product |
data.items[].category.category_id | integer | Level-0 category id |
data.items[].category.name | string | Level-0 category name, translated with language |
data.items[].availability | object | Availability at the resolved warehouse |
data.items[].availability.in_stock | boolean | In stock at the resolved warehouse |
data.items[].availability.status | string | null | Restriction status, null when unrestricted |
data.items[].availability.unavailable_from | string | null | Date the product stops being available |
data.items[].availability.unavailable_weekdays | array | Weekdays the product can’t be delivered |
data.items[].availability.order_limit | integer | Maximum units per order, e.g. 999 |
data.items[].price | string | Display price in euros, e.g. "4.98" |
data.items[].price_value | float | Numeric price in euros |
data.items[].previous_price | string | null | Previous display price, null when there is none |
data.items[].previous_price_value | float | null | Previous numeric price |
data.items[].is_price_drop | boolean | true when the current price is below the previous price (computed by the API, not a Mercadona flag) |
data.items[].unit_price | string | Display unit price, e.g. "0.830" |
data.items[].unit_price_value | float | Numeric unit price |
data.items[].unit_price_format | string | Unit the unit price refers to, e.g. "L" or "kg" |
data.items[].bulk_price_value | float | Bulk price |
data.items[].size_format | string | Size unit, e.g. "l" |
data.items[].unit_size | float | Size expressed in size_format units |
data.items[].is_pack | boolean | Product is sold as a pack |
data.items[].pack_size | float | null | Size of each unit in the pack |
data.items[].total_units | integer | null | Number of units in the pack |
data.items[].unit_name | string | null | Name of each unit, e.g. "briks" |
data.items[].iva_percent | integer | VAT percentage |
data.items[].approx_size | boolean | Size is approximate |
data.items[].drained_weight | float | null | Drained weight, for canned or preserved products |
data.items[].currency | string | Always "EUR" |
data.items[].color_variants | array | null | Colour variants, null when the product has none |
data.items[].warehouse | string | Warehouse that answered for this row |
data.total | integer | Number of items returned |
data.resolved_filters | object | What your filters resolved to |
data.resolved_filters.warehouse | object | Warehouse resolution |
data.resolved_filters.warehouse.input | string | null | The postal_code or warehouse you sent, null when neither was sent |
data.resolved_filters.warehouse.resolved | string | Warehouse that answered, e.g. vlc1 |
data.resolved_filters.warehouse.source | string | postal_code, param or default |
data.language | string | Language used |
request_params | object | Query parameters you sent, echoed back as strings |
Fields not included. Related product rows have no ean, brand, category_path or popularity_score. Call /product-details
with the product_id when you need them.
Error Responses
An unknown product_id is not an error: you get status: true with an empty data.items list, not a not-found envelope.
Invalid input returns HTTP 400 with error as a plain string, not an object, naming the parameter that failed validation.
| Status Code | Cause | Description |
|---|---|---|
| 400 | Missing product_id | product_id is required |
| 400 | Invalid warehouse | Must be a hub code (3 letters + 1 digit) or a 4-digit store code |
| 200 with 0 items | Unknown product_id | Check the id. Decimal ids like 81241.3 must be passed verbatim |
Code Examples
| |
| |
| |
Related Endpoints
- Product Details : EAN, brand, ingredients and allergens for any suggested product
- Product Search
: find the
product_idto start from - Brand Products : every product of one brand