Peru Grocery Basket Aggregator (Metro, Wong, PlazaVea, Vivanda) avatar

Peru Grocery Basket Aggregator (Metro, Wong, PlazaVea, Vivanda)

Pricing

from $0.80 / 1,000 results

Go to Apify Store
Peru Grocery Basket Aggregator (Metro, Wong, PlazaVea, Vivanda)

Peru Grocery Basket Aggregator (Metro, Wong, PlazaVea, Vivanda)

Compare a grocery basket across Peru's four largest chains (Metro, Wong, PlazaVea, Vivanda): cheapest chain per item, basket totals per chain, and where switching stores saves money. Prices in PEN. Use specific item names with size hints (e.g. 'aceite vegetal 1L') for best results.

Pricing

from $0.80 / 1,000 results

Rating

0.0

(0)

Developer

Philip Kirkbride

Philip Kirkbride

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Peru Grocery Basket Aggregator (Metro · Wong · PlazaVea · Vivanda)

Price a whole grocery basket across Peru's four largest chains in a single run and get the cheapest chain per item, the basket total at each chain, and where switching stores saves money. All prices in PEN (S/). Every item is searched live on all four chains, matched to the same product where possible, and returned as normalized records plus a basket summary.

Quick Start

  • Send a list of grocery items (up to 50); each one is priced at Metro, Wong, PlazaVea and Vivanda, matched across chains, and the cheapest chain per item is flagged.
  • For shoppers and deal hunters comparing chains, and for price-research or personal-finance apps that need basket totals per chain.
  • Run with this minimal input:
{"basket": ["arroz extra 5kg", "leche evaporada chica"]}

Conservative basket mode

Set "matchingMode": "basket" to reject full-text lookalikes. The default remains legacy: existing free-text inputs (notably leche evaporada chica) are broader than the canonical families supported here, so changing the default would silently remove coverage.

{"matchingMode":"basket","basket":["huevos 12-15 unidades","pechuga de pollo 1kg","agua mineral 1L"]}

Supported canonical identities: leche entera, huevos (12 or 15 pack, requested quantity 12), arroz, pan molde, pechuga de pollo, manzanas, fresh tomate, aceite vegetal, cafe molido and agua mineral. Include a target mass or volume (e.g. 500g, 1kg, 250g, 1L). Unknown identities, missing categories, unknown sizes, bundles, non-food categories, canned fish and wrong chicken cuts are rejected, not guessed. Each returned product is checked against the requested food family, its chain category and its normalized size before it is accepted. Only accepted in-stock offers enter the dataset and totals.

Basket-mode matched means canonical match (not cross-chain SKU identity), matchBasis is canonical-category-unit, and matchConfidence is a rule-based evidence score: 1 for exact size, 0.9 for a different known size. This is not a calibrated probability. pricePerKg or pricePerL gives a normalized rate. price remains the checkout pack price; basketPrice is the proportional cost for the requested quantity and is used for totals/cheapest comparisons (compareBasis: basket). It is an estimate, not a promise of fractional-pack checkout. Partial chain baskets are not like-for-like whole baskets; compare coverage and shared items before interpreting a cheaper total as savings.

Coverage varies by chain and by day: an item with no confident match at a chain is left out of that chain's total rather than replaced with a lookalike, and no non-food offer is ever counted.

Input

NameTypeDefaultWhat it does
basketarray of strings["arroz extra 5kg", "leche evaporada chica"]1–50 free-text grocery items to price, e.g. pollo entero, aceite vegetal 1L. Adding a size/format hint (5kg, 1L, 30un) materially improves cross-chain matching.
matchingModestringlegacybasket enables conservative canonical food/category/size matching.
categoryHintstring—Optional category applied to every item's search (e.g. abarrotes), resolved against each chain's own category list; chains where it doesn't resolve fall back to plain search.
requestDelaySecsnumber1.0Pause between basket items, from 0.5 to 10 seconds.

Output

Dataset — one record per (item × chain) offer, plus an unmatched marker record when no chain has a plausible offer. Fields: item, itemIndex, store, productId/productKey, name, brand, category, price, listPrice, currency (always PEN), unitMultiplier, measurementUnit, availableQuantity (99999 means the chain reports stock as effectively unlimited, not a real count), grams, pieceCount, pricePerKg, pricePerL, pricePerPiece, basketPrice/matchConfidence (basket mode), inStock, url, imageUrl, searchQuery, categoryResolved, matched/matchBasis (cross-chain linkage), isCheapest/compareBasis (the cheapest decision), collectedAt.

Key-value store OUTPUT — the basket summary: items (cheapest chain per item with name/price/url), totalsByChain (total, item count and coverage per chain), wholeBasket (cheapest vs priciest chain and the savings on shared items), mixAndMatch (cheapest-per-item total), summaryLine (one human-readable verdict), and warnings (any chain that failed for an item — one flaky chain never kills a run).

Example record:

{
"recordType": "offer",
"item": "arroz extra 5kg",
"itemIndex": 0,
"store": "metro",
"productId": "34266",
"productKey": "metro.pe:34266",
"name": "Arroz Extra Metro 5kg",
"brand": "Metro",
"price": 17.4,
"listPrice": null,
"currency": "PEN",
"unitMultiplier": 5,
"measurementUnit": "kg",
"grams": 5000,
"pricePerKg": 3.48,
"inStock": true,
"url": "https://www.metro.pe/arroz-extra-metro-5kg-391214/p",
"searchQuery": "arroz extra 5kg",
"categoryResolved": true,
"matched": true,
"matchBasis": "name-unit",
"isCheapest": true,
"compareBasis": "perKg",
"collectedAt": "2026-10-20T15:04:05Z"
}

Getting accurate matches

Chain search is full-text, so a generic aceite can surface tuna-in-oil and huevos can surface quail eggs as cheaper lookalikes. Use specific item names with size hints — aceite vegetal 1L, huevos de gallina, arroz extra 5kg — or set categoryHint. Items that name a category in a chain's own list (huevos, pollo entero) are scoped to it automatically; lookalikes that still slip through are flagged matched: false, so you can tell a real low price from a substitution.

FAQ

How fresh are the prices? Every item is searched live during the run; each record carries its UTC collection timestamp in collectedAt.

How many items can I price? 1–50 per run. Each item is searched on all four chains; a 10-item basket completes in roughly 15–20 seconds.

How is "cheapest" decided? Uniformly per item: per-kilogram when every offer has a per-kg price, per-piece when every offer has a pack count, otherwise the nominal price. Flagged lookalike offers still compete — the flags tell you when the winner is a substitution.

What happens if one chain fails for an item? The other chains still price it, the item appears in the run summary's warnings, and the run completes — one unavailable chain never fails the basket.

Which currency are the prices in? Always PEN (S/); every chain reports the same currency, so totals are directly comparable.

Price

See the Actor's Pricing tab on Apify for current rates.

What this Actor is not

A comparison tool, not a crawler: each item uses the chain's top first-page search results (top-sale ordering). No detail-page scraping, no other stores.

For help, contact Apify support and include the Actor run ID.