GET /brand-products

Brand Products

List every Mercadona product of one brand for any warehouse or postal code, with price range filters, sorting by popularity or price, and pagination.

Mercadona API

Returns every product of one brand at the warehouse you ask for, with full price and stock data. Filter by category and price range, and sort by popularity or price. The brand value must be the exact name returned by Brands : matching is case-sensitive (Como Tú and Como tú are different brands). To find a keyword inside a brand, use Search with q and brand instead.

HTTP Request

GET /brand-products

Parameters

ParameterTypeRequiredDefaultDescription
brandstringYes-Exact brand name as Mercadona writes it (from /brands ). An unknown brand, or one not stocked in the requested warehouse, returns empty results with resolved_filters.brand.source = "not_found"
warehousestringNovlc1Hub or numeric store code from /warehouses . Ignored when postal_code is given. On store codes, brand, ean, category_path and popularity_score may be null
postal_codestringNo-Spanish 5-digit postal code, resolved to the warehouse that serves it. Takes precedence over warehouse
category_idintegerNo-Only products in this category (any level, see /categories )
min_pricenumberNo-Lowest price_value in euros, inclusive, 0 to 10000 (e.g. 2 or 1.5). total counts only products in the range; products without a price are left out when a bound is set
max_pricenumberNo-Highest price_value in euros, inclusive, 0 to 10000. Must be greater than or equal to min_price
sortenumNopopularitypopularity (most popular first), price_asc or price_desc
pageintegerNo11-indexed page
per_pageintegerNo20Results per page, max 20
freshbooleanNofalseBypass the 15-minute cache. Only affects answers with source: live; catalog_index answers come from the daily catalog snapshot and refresh once a day
languageenumNoeses, en or ca. Translates product and category names. Brand names are never translated

Response

Example for brand=Hacendado&sort=price_asc&max_price=2&per_page=2 (arrays trimmed to 2 items):

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
{
  "status": true,
  "request_id": "279b55b9-1b91-8594-71a9-bd9aaf93",
  "cached_at": null,
  "data": {
    "results": [
      {
        "product_id": "85788",
        "name": "Rosquilla al cacao Hacendado",
        "slug": "rosquillas-cacao-hacendado",
        "url": "https://tienda.mercadona.es/product/85788/rosquillas-cacao-hacendado",
        "thumbnail": "https://prod-mercadona.imgix.net/images/55a1500c334084172f9a51c384f6f4f7.jpg?fit=crop&h=300&w=300",
        "packaging": null,
        "main_feature": null,
        "is_water": false,
        "requires_age_check": false,
        "category": {
          "category_id": 5,
          "name": "Panadería y pastelería"
        },
        "availability": {
          "in_stock": true,
          "status": null,
          "unavailable_from": null,
          "unavailable_weekdays": [],
          "order_limit": 999
        },
        "price": "0.21",
        "price_value": 0.21,
        "previous_price": null,
        "previous_price_value": null,
        "is_price_drop": false,
        "unit_price": "5.750",
        "unit_price_value": 5.75,
        "unit_price_format": "kg",
        "bulk_price_value": 5.75,
        "size_format": "kg",
        "unit_size": 0.037,
        "is_pack": false,
        "pack_size": null,
        "total_units": null,
        "unit_name": null,
        "iva_percent": 10,
        "approx_size": true,
        "drained_weight": null,
        "currency": "EUR",
        "color_variants": null,
        "warehouse": "vlc1",
        "ean": "8480000857880",
        "brand": "Hacendado",
        "category_path": [
          [
            {
              "category_id": 5,
              "name": "Panadería y pastelería",
              "level": 0
            },
            {
              "category_id": 66,
              "name": "Bollería envasada",
              "level": 1
            }
          ]
        ],
        "popularity_score": 5074.0,
        "category_rank": 5
      },
      {
        "product_id": "22139",
        "name": "Rollo con sabor nata Hacendado",
        "slug": "rollo-con-sabor-nata-hacendado",
        "url": "https://tienda.mercadona.es/product/22139/rollo-con-sabor-nata-hacendado",
        "thumbnail": "https://prod-mercadona.imgix.net/images/3e2137b23f63805384c0242a03187644.jpeg?fit=crop&h=300&w=300",
        "packaging": null,
        "main_feature": null,
        "is_water": false,
        "requires_age_check": false,
        "category": {
          "category_id": 5,
          "name": "Panadería y pastelería"
        },
        "availability": {
          "in_stock": true,
          "status": null,
          "unavailable_from": null,
          "unavailable_weekdays": [],
          "order_limit": 999
        },
        "price": "0.24",
        "price_value": 0.24,
        "previous_price": null,
        "previous_price_value": null,
        "is_price_drop": false,
        "unit_price": "5.750",
        "unit_price_value": 5.75,
        "unit_price_format": "kg",
        "bulk_price_value": 5.75,
        "size_format": "kg",
        "unit_size": 0.042,
        "is_pack": false,
        "pack_size": null,
        "total_units": null,
        "unit_name": null,
        "iva_percent": 10,
        "approx_size": true,
        "drained_weight": null,
        "currency": "EUR",
        "color_variants": null,
        "warehouse": "vlc1",
        "ean": "8480000221391",
        "brand": "Hacendado",
        "category_path": [
          [
            {
              "category_id": 5,
              "name": "Panadería y pastelería",
              "level": 0
            },
            {
              "category_id": 66,
              "name": "Bollería envasada",
              "level": 1
            }
          ]
        ],
        "popularity_score": 2024.0,
        "category_rank": 13
      }
    ],
    "total": 1076,
    "page": 1,
    "per_page": 2,
    "total_pages": 538,
    "has_next_page": true,
    "sort": "price_asc",
    "source": "catalog_index",
    "snapshot_date": "2026-10-14",
    "resolved_filters": {
      "warehouse": {
        "input": null,
        "resolved": "vlc1",
        "source": "default"
      },
      "brand": {
        "input": "Hacendado",
        "resolved": "Hacendado",
        "source": "param"
      }
    },
    "language": "es"
  },
  "request_params": {
    "sort": "price_asc",
    "max_price": "2",
    "per_page": "2",
    "brand": "Hacendado"
  }
}

Response Fields

Rows use the shared product fields, including category_path and popularity_score, plus category_rank.

FieldTypeDescription
statusbooleantrue when the request succeeded
request_idstringUnique request identifier
cached_atstring | nullISO timestamp when served from cache, null when fetched for this request
dataobjectResponse payload
data.results[]arrayProduct rows for this page
data.results[].product_idstringMercadona product id. Pass it verbatim: decimal ids like 81241.3 exist
data.results[].namestringProduct name, translated with language
data.results[].slugstringURL slug
data.results[].urlstringProduct URL on tienda.mercadona.es
data.results[].thumbnailstringImage URL (imgix)
data.results[].packagingstring | nullPackaging, e.g. "Garrafa" or "Pack-6"
data.results[].main_featurestring | nullHighlighted feature
data.results[].is_waterbooleanWater product flag
data.results[].requires_age_checkbooleanAlcohol or other age-restricted product
data.results[].categoryobjectLevel-0 category of the product
data.results[].category.category_idintegerLevel-0 category id
data.results[].category.namestringLevel-0 category name
data.results[].availabilityobjectStock and delivery restrictions at the resolved warehouse
data.results[].availability.in_stockbooleanIn stock at the resolved warehouse
data.results[].availability.statusstring | nullRestriction status
data.results[].availability.unavailable_fromstring | nullDate the product stops being available
data.results[].availability.unavailable_weekdaysarrayWeekdays it can’t be delivered
data.results[].availability.order_limitintegerMax units per order (e.g. 999)
data.results[].pricestringDisplay price in EUR, e.g. "3.70"
data.results[].price_valuefloatNumeric price in EUR
data.results[].previous_pricestring | nullPrevious display price, null if the price has not dropped
data.results[].previous_price_valuefloat | nullPrevious numeric price
data.results[].is_price_dropbooleantrue when the current price is below previous_price. Computed from the previous price, not Mercadona’s flag
data.results[].unit_pricestringDisplay unit price, e.g. "3.700"
data.results[].unit_price_valuefloatNumeric unit price
data.results[].unit_price_formatstringUnit of the unit price, e.g. "L" or "kg"
data.results[].bulk_price_valuefloatBulk price
data.results[].size_formatstringSize unit, e.g. "l" or "kg"
data.results[].unit_sizefloatSize in size_format units
data.results[].is_packbooleanPack product
data.results[].pack_sizefloat | nullPack size
data.results[].total_unitsinteger | nullUnits in the pack
data.results[].unit_namestring | nullUnit name, e.g. "briks"
data.results[].iva_percentintegerVAT percentage
data.results[].approx_sizebooleanSize is approximate
data.results[].drained_weightfloat | nullDrained weight
data.results[].currencystringAlways "EUR"
data.results[].color_variantsarray | nullColour variants
data.results[].warehousestringWarehouse that answered
data.results[].eanstringEAN barcode
data.results[].brandstringBrand name as Mercadona writes it
data.results[].category_patharrayCategory paths of the product. Each path is an array from level 0 down
data.results[].category_path[][].category_idintegerCategory id at that level
data.results[].category_path[][].namestringCategory name
data.results[].category_path[][].levelintegerCategory level: 0, 1 or 2
data.results[].popularity_scorefloat | nullMercadona’s internal popularity score. null on numeric store codes
data.results[].category_rankintegerPosition of the product by popularity inside its category
data.totalintegerProducts of the brand (within the price range, if set)
data.pageintegerCurrent page
data.per_pageintegerResults per page
data.total_pagesintegerTotal pages
data.has_next_pagebooleantrue if there is another page
data.sortstringSort applied
data.sourcestringcatalog_index (daily catalog snapshot) or live
data.snapshot_datestringDate of the catalog snapshot used
data.resolved_filters.warehouseobjectWarehouse used for this answer
data.resolved_filters.warehouse.inputstring | nullValue you sent (postal_code or warehouse), null if none
data.resolved_filters.warehouse.resolvedstringWarehouse code that answered
data.resolved_filters.warehouse.sourcestringpostal_code, param or default
data.resolved_filters.brandobjectHow the brand value was matched
data.resolved_filters.brand.inputstringBrand you sent
data.resolved_filters.brand.resolvedstringBrand used for the listing
data.resolved_filters.brand.sourcestringparam when the brand was found, not_found when it is unknown or not stocked in this warehouse
data.languagestringLanguage used for names
request_paramsobjectQuery parameters you sent, echoed back as strings

Error Responses

An unknown brand is not an error. You get HTTP 200 with status: true, an empty data.results[] and data.resolved_filters.brand.source = "not_found". This also happens when the brand exists but the requested warehouse (default vlc1) does not stock it, so check /brands with the same warehouse or postal_code, and check the exact spelling and case.

Invalid input returns HTTP 400, and error is a plain string:

1
2
3
4
5
{
  "status": false,
  "request_id": "...",
  "error": "Invalid parameter 'brand': Field required"
}
Status CodeCauseDescription
200 (empty results)Brand unknown or not stockedresolved_filters.brand.source is not_found. Check the name and warehouse with /brands
400Missing brandbrand is required
400Invalid warehouseMust be a hub code like vlc1 or a 4-digit store code
400Invalid price rangemin_price and max_price must be between 0 and 10000, and max_price must be greater than or equal to min_price

Code Examples

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests

url = "https://mercadona-api.p.rapidapi.com/brand-products"

params = {
    "brand": "Hacendado",
    "sort": "price_asc",
    "max_price": 2
}

headers = {
    "X-RapidAPI-Key": "YOUR_API_KEY",
    "X-RapidAPI-Host": "mercadona-api.p.rapidapi.com"
}

response = requests.get(url, headers=headers, params=params)
data = response.json()["data"]

if data["resolved_filters"]["brand"]["source"] == "not_found":
    print("Brand not found in this warehouse")
else:
    print(f"{data['total']} Hacendado products at 2 EUR or less")
    for product in data["results"]:
        print(f"{product['name']}: {product['price_value']} EUR ({product['unit_price']}/{product['unit_price_format']})")
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
const url = "https://mercadona-api.p.rapidapi.com/brand-products";

const params = new URLSearchParams({
  brand: "Hacendado",
  sort: "price_asc",
  max_price: "2"
});

const response = await fetch(`${url}?${params}`, {
  headers: {
    "X-RapidAPI-Key": "YOUR_API_KEY",
    "X-RapidAPI-Host": "mercadona-api.p.rapidapi.com"
  }
});

const { data } = await response.json();
console.log(`${data.total} products, brand source: ${data.resolved_filters.brand.source}`);
for (const product of data.results) {
  console.log(`${product.name}: ${product.price_value} EUR`);
}
1
2
3
4
5
6
curl -G "https://mercadona-api.p.rapidapi.com/brand-products" \
  --data-urlencode "brand=Hacendado" \
  --data-urlencode "sort=price_asc" \
  --data-urlencode "max_price=2" \
  -H "X-RapidAPI-Key: YOUR_API_KEY" \
  -H "X-RapidAPI-Host: mercadona-api.p.rapidapi.com"
  • Brands : find the exact brand name and check that the warehouse stocks it
  • Product Details : full product sheet with ingredients, allergens and photos for any product_id
  • Product Search : find a keyword inside a brand with q and brand
  • Best Sellers : the same brand ranked by popularity, with a continuous rank
Start building today

Get your API key and make your first request in under a minute.

Get Your API Key on RapidAPI