Pingo Doce API & Scraper
Pingo Doce is one of Portugal's largest supermarket chains and pingodoce.pt its online shop.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
`search` returns the products for a search term with the price anyone pays (per pack, or per kg for fruit, meat and fish sold by weight), the struck-through price of a running promotion, the manufacturer's recommended price (PVPR) when the shop prints one, the promotion badge such as "Poupe 30%" or "Poupe Metade" and its end date, pack size, the price per kg, litre, dose or unit, brand and category. Filters are category, brand, one food choice (organic, vegan, gluten free, lactose free and eight more) and a price range, with sorting by price or name and up to 100 products per page. `category` walks a category of the shop, `promotions` lists everything on promotion and `categories` returns the shop's 492 categories. `product` returns one product with availability, order limits and the label: regulated name, ingredients, allergens, nutrition table, vitamins and minerals, origin, storage, preparation and producer. Pass a Portuguese post code to see the range of that home-delivery area.
What a Pingo Doce field actually contains
Fields that read differently from how they look. Every row was measured against live pingodoce.pt responses on 2026-11-03.
| Field | What it holds |
|---|---|
| price, price_unit | The price anyone pays now, in euros, per price_unit. Goods sold by weight are priced per kg (Cenoura 0.89 per kg, pack about 0.18 kg); packs per unit (un). |
| regular_price | The struck-through price of a running promotion (Leite UHT Meio Gordo Mimosa: 0.90 now, 1.00 before). Empty when nothing is struck through. |
| recommended_retail_price | The manufacturer's recommended price (PVPR) printed next to some products. It is not a former Pingo Doce price: Iogurte Líquido Proteína Manga showed 1.99 with PVPR 2.69 and no struck-through price. |
| promotion_label, promotion_end | The shop's promotion badge ("Poupe 10%", "Poupe Metade", "Apenas") and its end date as printed, "Promoção até 09/11". The shop prints no year, so the API returns day and month only. |
| unit_price, unit_price_unit | The second price the shop prints: per litre, kg, dose or unit (1 L milk: 0.90 per l; 76 doses of detergent: 0.17 per dose). Empty for goods already priced per kg. |
| store | Which home-delivery area the rows are for. The range changes with the post code ('leite': 255 products with no area, 155 for Lisboa 1000-001, 200 for Porto 4000-322, 257 for Braga 4700-001); prices on the same product were equal in every area compared. |
Pingo Doce does not publish EAN barcodes on its public shop, so the API returns none. Loyalty-card discounts are not shown on public listings; price is what any shopper pays.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/pingodoce/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "leite"
}
}{
"ok": true,
"meta": {
"api": "pingodoce",
"endpoint": "search",
"mode": "live",
"latency_ms": 2276.4,
"record_count": 48,
"bytes": 671676,
"cache_hit": false,
"upstream_requests": 1,
"total": 255,
"charged_credits": 3,
"version": "0.1.0",
"request_id": "73dbbf9334f143c5",
"queue_ms": 1.4,
"fetched_at": "2026-11-03T13:40:20.147Z"
},
"data": {
"store": {
"postal_code": null,
"delivery_type": null,
"store_name": null,
"store_defaulted": true,
"resolved_from": "site default for an anonymous visitor (no delivery area chosen; its range is wider than any single area we set: leite 255 rows vs 155 Lisboa, 200 Porto)"
},
"query": "leite",
"category": null,
"filters": {},
"sort": "relevance",
"total": 255,
"total_is_exact": true,
"total_note": null,
"page": 1,
"per_page": 48,
"has_more": true,
"returned": 48,
"results": [
{
"rank": 1,
"product_id": "554813",
"name": "Leite de Magnésia Phillips Laxante Antiácido",
"brand": "Leite Phillips",
"price": 14.19,
"price_unit": "un",
"price_text": "14,19 €",
"regular_price": null,
"recommended_retail_price": null,
"currency": "EUR",
"on_offer": false,
"promotion_label": null,
"promotion_code": null,
"promotion_end": null,
"pack_size": "0.2 L",
"unit_price": 70.95,
"unit_price_unit": "l",
"unit_info_text": "0.2 L | 70,95 €/L",
"category": "Aparelho Digestivo",
"category_path": "Parafarmácia > Aparelho Digestivo",
"analytics_price": 14.19,
"image": "https://static.pingodoce.pt/dw/image/v2/BLJJ_PRD/on/demandware.static/-/Sites-pingo-doce-master/default/dw8cff88d2/images/medium/554813_03326766d5865b745592b9e0671c73fe.png",
"url": "https://www.pingodoce.pt/home/produtos/parafarmacia/medicamentos-nao-sujeitos-a-receita-medica/aparelho-digestivo/leite-de-magnesia-phillips-laxante-antiacido-leite-phillips-554813.html"
},
{
"rank": 2,
"product_id": "42132",
"name": "Leite Creme",
"brand": "Royal",
"price": 1.49,
"price_unit": "un",
"price_text": "1,49 €",
"regular_price": null,
"recommended_retail_price": null,
"currency": "EUR",
"on_offer": false,
"promotion_label": null,
"promotion_code": null,
"promotion_end": null,
"pack_size": "0.092 Kg",
"unit_price": 16.2,
"unit_price_unit": "kg",
"unit_info_text": "0.092 Kg | 16,2 €/Kg",
"category": "Preparados para Bolos e Sobremesas",
"category_path": "Mercearia > Preparados para Bolos e Sobremesas",
"analytics_price": 1.49,
"image": "https://static.pingodoce.pt/dw/image/v2/BLJJ_PRD/on/demandware.static/-/Sites-pingo-doce-master/default/dw8cff88d2/images/medium/42132_1d80961525d5f07addf04c701b15a043.png",
"url": "https://www.pingodoce.pt/home/produtos/mercearia/sobremesas/preparados-para-bolos-e-sobremesas/leite-creme-royal-42132.html"
},
{
"rank": 3,
"product_id": "836925",
"name": "Leite Achocolatado",
"brand": "Ucal",
"price": 3.23,
"price_unit": "un",
"price_text": "3,23 €",
"regular_price": null,
"recommended_retail_price": null,
"currency": "EUR",
"on_offer": false,
"promotion_label": null,
"promotion_code": null,
"promotion_end": null,
"pack_size": "1 L",
"unit_price": 3.23,
"unit_price_unit": "l",
"unit_info_text": "1 L | 3,23 €/L",
"category": "Leite Achocolatado e Aromatizado",
"category_path": "Leite e Bebidas Vegetais > Leite Achocolatado e Aromatizado",
"analytics_price": 3.23,
"image": "https://static.pingodoce.pt/dw/image/v2/BLJJ_PRD/on/demandware.static/-/Sites-pingo-doce-master/default/dw8cff88d2/images/medium/836925_9a537d001be4de0f4c62a9b678155791.jpg",
"url": "https://www.pingodoce.pt/home/produtos/leite-e-bebidas-vegetais/leite/leite-achocolatado-e-aromatizado%E2%80%8B/leite-achocolatado-ucal-836925.html"
}
]
}
}What the Pingo Doce API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search Pingo Doce's online shop: shelf price, was price of a promotion, recommended retail price (PVPR), promotion badge and end date, price per kg/l, pack size, brand, category. `query` required; filters: category, brand, diet, min_price, max_price; sort; paging up to 100 per page; optional post code for that delivery area's range. | Pricing teams call search to search Pingo Doce's online shop. | query, category, brand, diet, min_price, ... |
| category | List one Pingo Doce category (id from `categories`) with the same row fields, filters and paging as `search` — the way to walk the whole catalogue. | Marketplace operators call category to list one Pingo Doce category (id from `categories`) with the same row fields, filters and pag…. | category, brand, diet, min_price, max_price, ... |
| promotions | Pingo Doce products on promotion right now (the shop's Promoções section): offer price, was price or PVPR, badge, end date. Narrow with `query`, `brand`, `diet`, price range. | Catalog enrichment teams call promotions to get pingo Doce products on promotion right now (the shop's Promoções section). | query, brand, diet, min_price, max_price, ... |
| product | One Pingo Doce product by the `product_id` a search row returns: price, was price or PVPR, promotion badge and end date, price per kg/l, availability and order limits, category, images, and the label: regulated name, ingredients, allergens, nutrition table, vitamins and minerals, origin, storage, preparation, producer. | Retail analysts call product to get one Pingo Doce product by the `product_id` a search row returns. | product_id |
| categories | Pingo Doce's category tree from the shop menu: id, name, URL, children. Ids feed `category` and the `category` filter. | Pricing teams call categories to get pingo Doce's category tree from the shop menu. | category |
| store | Whether Pingo Doce delivers to a Portuguese post code (home delivery) or only offers store pickup there — the area `postal_code` selects in the listing actions. | Marketplace operators call store to get whether Pingo Doce delivers to a Portuguese post code (home delivery) or only offers store pi…. | postal_code |
Call search from your stack
curl -X POST https://api.reefapi.com/pingodoce/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"leite"}'import requests
r = requests.post(
"https://api.reefapi.com/pingodoce/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "leite"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/pingodoce/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "leite"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.pingodoce.search with {"query":"leite"}.Who uses this API and why
- Track Pingo Doce shelf prices and weekly promotions with their end dates.
- Compare Portuguese grocery prices per kg or litre across brands and Pingo Doce's own labels.
- Refresh a full Pingo Doce catalogue daily by walking its categories.
- Build a product database with ingredients, allergens and nutrition tables.
- See which products a home-delivery area in Portugal can order.
Questions developers ask before integrating
Do I need a Pingo Doce account?
No. Everything is read logged out: the prices, promotions and product labels any visitor sees.
Can I download the whole catalogue?
Yes. `categories` returns every category id; `category` lists one with up to 100 products per page and the shop's own total on page 1. On 2026-11-03 the 25 department categories held 11,808 products, about 131 calls at 100 per page.
What is the difference between regular_price and recommended_retail_price?
regular_price is what Pingo Doce charged before a running promotion. recommended_retail_price is the manufacturer's recommended price (PVPR), printed for comparison; the product was not necessarily ever sold at it.
Do prices depend on the post code?
The range does: each home-delivery area has its own selection, so pass postal_code to see it. On the products we compared across Lisboa, Porto and Braga the price was the same. Post codes the shop serves by store pickup only (for example Funchal) are answered as not found.
Which filters work?
category, brand, one food choice and min_price / max_price, plus sorting by price or name. Each was checked against the unfiltered count in the same minute: 'leite' went from 255 products to 27 Mimosa, 33 lactose free, 2 organic and 94 between 1 and 2 euros.
Are EAN barcodes included?
No. Pingo Doce does not publish them on its public shop. Each product has the shop's own numeric product_id, which is stable and works in the product call.
Does the product call include nutrition and ingredients?
Yes, when Pingo Doce publishes them: regulated name, ingredients, allergens, the nutrition table per 100 g or ml, vitamins and minerals, origin, storage and the producer. Some labels are incomplete at the source and are returned as they are.
How fresh is the data?
Every call reads pingodoce.pt live; nothing is cached. Promotions run in weekly windows and each row carries its printed end date.
What is the Pingo Doce API?
Pingo Doce API is a ReefAPI endpoint group for portuguese supermarket prices from pingodoce.pt: shelf price, promotions with end date, was price, pvpr, price per kg or litre, ingredients and nutrition. It returns live JSON through POST requests under /pingodoce/v1.
Is the Pingo Doce API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Pingo Doce calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Pingo Doce login or account?
No login to Pingo Doce is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Pingo Doce data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Pingo Doce API use?
Pingo Doce actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Pingo Doce from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call pingodoce actions with the same key, credit pool and JSON envelope used by normal REST requests.