GET /new-products

New Products

Get new arrivals at Mercadona for any Spanish postal code, from the Novedades grid or every 'Nuevo en' home section.

Mercadona API

Returns the products Mercadona currently presents as new at the warehouse that serves a postal code. By default it reads the general Novedades grid. With feed=all it also includes every home-page section titled “Nuevo en …” (for example “Nuevo en Perfumería”). Rows are standard product rows, so you can filter by category, brand and price like the other discovery endpoints.

HTTP Request

GET /new-products

Parameters

ParameterTypeRequiredDefaultDescription
warehousestringNovlc1Hub or 4-digit store code (see Warehouses ). Ignored when postal_code is given. Numeric store codes are served live: brand, ean, category_path and popularity_score may be null on their rows, and a brand or level-1/2 category_id filter returns 400 for them
postal_codestringNo-Spanish 5-digit postal code, resolved to the warehouse that serves it. Takes precedence over warehouse
pageintegerNo11-indexed page (local pagination over the feed)
per_pageintegerNo20Items per page, max 20
feedstringNonovedadesnovedades: the general Novedades grid. all: also every home section titled “Nuevo en …”
category_idintegerNo-Category id at any level (see Category Tree )
brandstringNo-Exact brand name as Mercadona writes it (see Brands ). Several brands comma-separated are OR-ed (Danone,Puleva)
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
freshbooleanNofalseBypass the 10-minute cache of the new-products feed. brand, ean, category_path and popularity_score come from the daily catalog snapshot (snapshot_date) and refresh once a day
languagestringNoesLanguage for product and category names: es, en or ca

Response

  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
{
  "status": true,
  "request_id": "50a4b90a-e8f2-3e01-0126-65219ab8",
  "cached_at": null,
  "data": {
    "items": [
      {
        "product_id": "18382",
        "name": "Postre Caramel Cake Hacendado con queso y caramelo salado",
        "slug": "postre-caramel-cake-hacendado-con-queso-caramelo-salado",
        "url": "https://tienda.mercadona.es/product/18382/postre-caramel-cake-hacendado-con-queso-caramelo-salado",
        "thumbnail": "https://prod-mercadona.imgix.net/images/94c4895dc2f1f577cb249a116890a103.jpg?fit=crop&h=300&w=300",
        "packaging": null,
        "main_feature": "con queso y caramelo salado",
        "is_water": false,
        "requires_age_check": false,
        "category": {
          "category_id": 11,
          "name": "Postres y yogures"
        },
        "availability": {
          "in_stock": true,
          "status": null,
          "unavailable_from": null,
          "unavailable_weekdays": [],
          "order_limit": 999
        },
        "price": "1.70",
        "price_value": 1.7,
        "previous_price": null,
        "previous_price_value": null,
        "is_price_drop": false,
        "unit_price": "10.625",
        "unit_price_value": 10.62,
        "unit_price_format": "kg",
        "bulk_price_value": 10.63,
        "size_format": "kg",
        "unit_size": 1.6,
        "is_pack": true,
        "pack_size": 0.08,
        "total_units": 2,
        "unit_name": "ud.",
        "iva_percent": 10,
        "approx_size": false,
        "drained_weight": null,
        "currency": "EUR",
        "color_variants": null,
        "warehouse": "vlc1",
        "ean": "8402001056383",
        "brand": "Hacendado",
        "category_path": [
          [
            {
              "category_id": 11,
              "name": "Postres y yogures",
              "level": 0
            },
            {
              "category_id": 111,
              "name": "Gelatina y otros postres",
              "level": 1
            }
          ]
        ],
        "popularity_score": 0.0
      },
      {
        "product_id": "20734",
        "name": "Queso viejo intenso mezcla Hacendado",
        "slug": "queso-viejo-intenso-mezcla-hacendado-pieza",
        "url": "https://tienda.mercadona.es/product/20734/queso-viejo-intenso-mezcla-hacendado-pieza",
        "thumbnail": "https://prod-mercadona.imgix.net/images/854c4084e7290ddf20553356a6401739.jpg?fit=crop&h=300&w=300",
        "packaging": "Pieza",
        "main_feature": null,
        "is_water": false,
        "requires_age_check": false,
        "category": {
          "category_id": 4,
          "name": "Charcutería y quesos"
        },
        "availability": {
          "in_stock": true,
          "status": null,
          "unavailable_from": null,
          "unavailable_weekdays": [],
          "order_limit": 999
        },
        "price": "20.00",
        "price_value": 20.0,
        "previous_price": null,
        "previous_price_value": null,
        "is_price_drop": false,
        "unit_price": "10.000",
        "unit_price_value": 10.0,
        "unit_price_format": "kg",
        "bulk_price_value": 10.0,
        "size_format": "kg",
        "unit_size": 2.0,
        "is_pack": false,
        "pack_size": null,
        "total_units": null,
        "unit_name": null,
        "iva_percent": 4,
        "approx_size": false,
        "drained_weight": null,
        "currency": "EUR",
        "color_variants": null,
        "warehouse": "vlc1",
        "ean": null,
        "brand": null,
        "category_path": [],
        "popularity_score": null
      }
    ],
    "total": 50,
    "page": 1,
    "per_page": 2,
    "total_pages": 25,
    "has_next_page": true,
    "feed": "novedades",
    "source": "catalog_index",
    "snapshot_date": "2026-10-14",
    "resolved_filters": {
      "warehouse": {
        "input": null,
        "resolved": "vlc1",
        "source": "default"
      }
    },
    "language": "es"
  },
  "request_params": {
    "per_page": "2"
  }
}

Response Fields

FieldTypeDescription
statusbooleantrue on success
request_idstringUnique request identifier
cached_atstring | nullISO timestamp when the answer came from cache, null when fetched for this request
dataobjectResponse payload
data.items[]array of objectsNew products
data.items[].product_idstringMercadona product id. Pass it verbatim: decimal ids like 81241.3 exist
data.items[].namestringProduct name, translated with language
data.items[].slugstringURL slug of the product
data.items[].urlstringProduct URL on tienda.mercadona.es
data.items[].thumbnailstringProduct image URL (imgix)
data.items[].packagingstring | nullPackaging, e.g. "Tableta", "Botella", "Pieza"
data.items[].main_featurestring | nullHighlighted feature shown under the name
data.items[].is_waterbooleanWater product flag
data.items[].requires_age_checkbooleanAlcohol or other age-restricted product
data.items[].categoryobjectLevel-0 category of the product
data.items[].category.category_idintegerLevel-0 category id
data.items[].category.namestringLevel-0 category name, translated with language
data.items[].availabilityobjectAvailability at the resolved warehouse
data.items[].availability.in_stockbooleanIn stock at the resolved warehouse
data.items[].availability.statusstring | nullRestriction status, null when there is none
data.items[].availability.unavailable_fromstring | nullDate the product stops being available
data.items[].availability.unavailable_weekdaysarrayWeekdays the product can’t be delivered
data.items[].availability.order_limitintegerMaximum units per order (e.g. 999)
data.items[].pricestringDisplay price in EUR, e.g. "1.25"
data.items[].price_valuefloatNumeric price in EUR
data.items[].previous_pricestring | nullPrevious display price, null when there is none
data.items[].previous_price_valuefloat | nullPrevious numeric price in EUR
data.items[].is_price_dropbooleantrue when the current price is below previous_price. Computed from the previous price, not Mercadona’s own flag
data.items[].unit_pricestringDisplay unit price, e.g. "0.800"
data.items[].unit_price_valuefloatNumeric unit price
data.items[].unit_price_formatstringUnit the unit price refers to, e.g. "L", "kg", "ud"
data.items[].bulk_price_valuefloatBulk price
data.items[].size_formatstringSize unit, e.g. "l", "kg"
data.items[].unit_sizefloatSize in size_format units
data.items[].is_packbooleanWhether the product is a pack
data.items[].pack_sizefloat | nullSize of each unit in the pack
data.items[].total_unitsinteger | nullUnits in the pack
data.items[].unit_namestring | nullUnit name, e.g. "ud.", "briks"
data.items[].iva_percentintegerVAT percentage
data.items[].approx_sizebooleanSize is approximate (e.g. fruit sold by the piece)
data.items[].drained_weightfloat | nullDrained weight
data.items[].currencystringAlways "EUR"
data.items[].color_variantsarray | nullColour variants
data.items[].warehousestringWarehouse that answered
data.items[].eanstring | nullEAN barcode. Can be null (always possible on numeric store codes)
data.items[].brandstring | nullBrand name as Mercadona writes it. Can be null, e.g. for unbranded fresh produce
data.items[].category_patharray of arraysCategory paths. Each path is a list of {category_id, name, level} objects from level 0 down. Can be empty
data.items[].category_path[][].category_idintegerCategory id
data.items[].category_path[][].namestringCategory name, translated with language
data.items[].category_path[][].levelintegerCategory level: 0, 1 or 2
data.items[].popularity_scorefloat | nullMercadona’s internal popularity score. null on numeric store codes
data.totalintegerNew products in the feed (within the price range, if set)
data.pageintegerCurrent page (1-indexed)
data.per_pageintegerItems per page
data.total_pagesintegerTotal number of pages
data.has_next_pagebooleanWhether another page follows
data.feedstringFeed used: novedades or all
data.sourcestringData origin: catalog_index (daily catalog snapshot) or live
data.snapshot_datestringDate of the catalog snapshot used
data.resolved_filters.warehouseobjectThe warehouse that answered
data.resolved_filters.warehouse.inputstring | nullThe postal_code or warehouse you sent, null if none
data.resolved_filters.warehouse.resolvedstringWarehouse code used, e.g. mad3
data.resolved_filters.warehouse.sourcestringHow it was chosen: postal_code, param or default
data.languagestringLanguage used for names: es, en or ca
request_paramsobjectThe query parameters you sent, echoed back as strings

Error Responses

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

1
2
3
4
5
6
7
8
{
  "status": false,
  "request_id": "b757e855-4127-3b96-509a-8b573904",
  "error": "Invalid parameter 'warehouse': String should match pattern '^(?:[a-z]{3}[0-9]|[0-9]{4})$'",
  "request_params": {
    "warehouse": "xyz"
  }
}
Status CodeCauseDescription
400Invalid parameterMalformed warehouse, unknown feed value, per_page above 20, or an invalid price range
400Filter on a store codePer the RapidAPI docs, a brand or level-1/2 category_id filter returns 400 when the warehouse is a numeric store code

Very recent products may not be in the daily catalog snapshot yet, so their ean, brand and popularity_score can be null and category_path empty (see the second item above).

Code Examples

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

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

params = {
    "feed": "all",
    "warehouse": "bcn1"
}

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"]

print(f"{data['total']} new products in {data['resolved_filters']['warehouse']['resolved']}")
for item in data["items"]:
    print(f"{item['name']} ({item['brand']}): {item['price_value']} EUR")
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
const url = "https://mercadona-api.p.rapidapi.com/new-products";

const params = new URLSearchParams({
  feed: "all",
  warehouse: "bcn1"
});

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} new products`);
data.items.forEach(item => {
  console.log(`${item.name} (${item.brand}): ${item.price_value} EUR`);
});
1
2
3
4
5
curl -G "https://mercadona-api.p.rapidapi.com/new-products" \
  --data-urlencode "feed=all" \
  --data-urlencode "warehouse=bcn1" \
  -H "X-RapidAPI-Key: YOUR_API_KEY" \
  -H "X-RapidAPI-Host: mercadona-api.p.rapidapi.com"
  • Product Details : ingredients, allergens and photos for a new product
  • Home Campaigns : list the “Nuevo en …” sections that feed=all merges
  • Campaign Products : products of a single “Nuevo en …” section
  • Brands : exact brand names to use in the brand filter
Start building today

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

Get Your API Key on RapidAPI