Catalog / Retail, marketplaces & classifieds
RETAIL, MARKETPLACES & CLASSIFIEDS · PERU
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.
About this data
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.
From the actor’s Apify Store listing. The per-call endpoint may return a bounded subset; its own description is below.
Buy per call over x402
One endpoint at api.ssh.autos. Each call is one JSON POST, paid in USDC with no account or API key, and answered in the same HTTP response.
POST /v1/pe/grocery/compare
One grocery item priced across Peru's Metro, Wong, PlazaVea and Vivanda, with the cheapest chain. Prices in PEN.
Input
Send a JSON body to POST https://api.ssh.autos/v1/pe/grocery/compare.
| Field | Type | Required | Notes |
|---|---|---|---|
basket | array of strings | required | exactly 1 item |
Returned fields
The answer is JSON: records, a list, and summary, the run status and counts. Each record has these 32 fields; a field the source does not publish comes back null.
32 fields per record
| Field | Type | Notes |
|---|---|---|
recordType | string | offer = a priced candidate found at a chain; unmatched = nothing plausible at any chain (marker record with null offer fields). one of offer, unmatched |
item | string | Basket item text exactly as given in the input. |
itemIndex | integer | Zero-based position of the item in the basket. |
store | string | Chain slug (metro, wong, plazavea, vivanda); null on unmatched records. |
productId | string | Storefront product id. The Cencosud chains (metro/wong/vivanda) share one id space; PlazaVea has its own. |
productKey | string | Composite unique key: source:id (e.g. metro.pe:34266); join on this rather than the bare productId (PlazaVea occupies a separate id space). |
name | string | Product name as shown by the chain. |
brand | string | Brand name when the chain declares one. |
category | string | Deepest category path segment as shown by the chain (Spanish). |
price | number | Current selling price in PEN (S/). |
listPrice | number | Reference (pre-discount) price in PEN when the chain reports one. |
currency | string | ISO currency of every record — always PEN for the four Peru grocery chains. |
unitMultiplier | number | Chain's unit multiplier for the SKU (1 for single units; e.g. 0.4 for a pack priced per 0.4 kg). |
availableQuantity | number | Store's reported available quantity for the default seller. NOTE: 99999 is the VTEX platform default that masquerades as stock — treat it as 'effectively unlimited', not real inventory. Real counts o… |
measurementUnit | string | Chain's measurement unit abbreviation (e.g. 'un', 'kg'). |
grams | number | Net mass in grams: explicit pack label first, else kg multiplier × 1000. Null when unknown. |
pieceCount | number | Pieces per pack parsed from the name (e.g. '30un', 'x4'); null when not stated. |
pricePerKg | number | Normalized PEN per kilogram. Explicit pack weight takes precedence over kg ordering increment; otherwise kg multiplier. Null when unknown. |
pricePerL | number | PEN per litre for a confidently matched liquid in basket mode. |
matchConfidence | number | Basket-mode evidence score: 1 for requested size, 0.9 for size-normalized food; null in legacy mode. Not a calibrated probability. |
basketPrice | number | Estimated PEN cost for requested canonical quantity, not checkout pack price. Used in basket-mode totals. |
pricePerPiece | number | price / pieceCount when the pack count is known and > 1; null otherwise. |
inStock | boolean | Chain's availability flag for the default seller. |
url | string | Public product page URL. |
imageUrl | string | Primary product image URL when present. |
searchQuery | string | The basket item text this offer was found with. |
categoryResolved | boolean | True when this chain's search was scoped to a category (the explicit categoryHint when given, else the item text itself resolved against the chain's own tree); false when scoping was attempted but no… |
matched | boolean | True when this offer was linked to the same basket item at another chain (shared productId within Cencosud, or normalized name+unit match against PlazaVea). |
matchBasis | string | How this offer was linked: productId (shared Cencosud id), name-unit (PlazaVea normalized name+mass/count vs a Cencosud reference), alone (best effort, no cross-chain link). one of productId, name-unit, alone, canonical-category-unit |
isCheapest | boolean | True for the cheapest offer of this item across chains, compared on the item's compareBasis. |
compareBasis | string | What the cheapest comparison used for this item: perKg when every offer has a normalized per-kg price; perUnit when every offer has a piece count; nominal otherwise. one of perKg, perUnit, nominal, basket |
collectedAt | string | UTC ISO-8601 collection timestamp. |
Example call
npx agentcash@latest fetch https://api.ssh.autos/v1/pe/grocery/compare -m POST -b '{"basket": ["arroz extra 5kg"]}'
The example values come from the API spec or the actor’s own sample input. Running it is a paid call.
What is and isn’t charged
You pay the call price for
- An answer, including a definitive “not found” or an empty result.
- Confirmed no matches returns records: [] (charged: it is an answer).
Free
- Invalid input (422), busy (503), source failure (502), timeout (504) and calls whose client hung up are never charged.
- Invalid input and source failures are not charged.
Prefer a subscription? Run it on Apify
This data source is a public actor on the Apify Store: Peru Grocery Basket Aggregator (Metro, Wong, PlazaVea, Vivanda). Run it with your Apify account and plan for larger, scheduled or exported runs; it may offer more input options than the per-call endpoint.
How x402 payment works
- Your client sends the request. The API answers
402 Payment Requiredwith the price and where to pay. - The client pays from its own wallet: USDC on Base or Solana over x402, or over MPP on Tempo. No account, sign-up or API key.
- The client retries with the payment attached and gets the JSON answer in the same call. You are only charged for answers.
The AgentCash CLI in the example does all three steps for you and pays from your AgentCash wallet. Any x402 or MPP client works the same way.
Machine-readable: openapi.json · llms.txt