Metro & Super C API
The Metro & Super C API returns grocery prices from metro.ca and superc.ca as clean JSON, per store.
🤖 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.
Set banner to metro or superc and store_id to a store: search finds products by words, a brand or a code, category lists an aisle, product returns one item with its description and sale end date, and stores finds store numbers by postal code, city or coordinates. Every price is what that store's page prints: the price now, regular_price, sale_price, per-kg and per-unit prices, and a price_basis saying whether the item is sold each, by the kilo or as an estimated weighed item. store_confirmed says the response comes from the store you asked for.
The same 2 L of milk at three stores
Québon 2% milk, product code 055872025019, read through product on 2026-11-08 at two Metro stores and a Super C. The prices are what each store's page printed.
| Store | Banner | price (CAD) | per 100 ml |
|---|---|---|---|
| Metro store 82, Lévis | metro | 4.60 | 0.23 |
| Metro store 6, Sainte-Anne-des-Monts | metro | 4.72 | 0.24 |
| Super C store 6131, St-Romuald | superc | 4.60 | 0.23 |
Prices are per store and can differ within a banner. For weighed items the same call returns per-kg and per-lb prices: red seedless grapes at Super C 6131 read 8.80 per kg and 3.99 per lb that day, with price_basis per_kg. An item the page prints as an average piece has its estimate in estimated_item_price.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/metro-ca/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "milk",
"banner": "metro",
"store_id": "82"
}
}{
"ok": true,
"meta": {
"api": "metro-ca",
"endpoint": "search",
"mode": "live",
"latency_ms": 3857,
"record_count": 50,
"bytes": 795960,
"cache_hit": false,
"total": 701,
"store_id": "82",
"upstream_requests": 2,
"session_new": "[redacted-secret]",
"stores_cached": true,
"charged_credits": 3,
"version": "0.1.0",
"request_id": "da9451d2c2cb4fae",
"queue_ms": 1.1,
"fetched_at": "2026-11-06T16:39:41.685Z"
},
"data": {
"query": "milk",
"banner": "metro",
"store_id": "82",
"store_name": "Alimentation Maxime Faucher",
"store_address": "8032 Avenue Des Églises, Lévis, QC, G6X 1X7",
"store_confirmed": true,
"fetched_at": "2026-11-06T16:39:41Z",
"page": 1,
"source_url": "https://www.metro.ca/en/online-grocery/search?filter=milk",
"total": 701,
"returned": 50,
"sponsored_rows": 4,
"has_next": true,
"results": [
{
"product_id": "064420320148",
"title": "2% Lactose-Free Protein Milk",
"brand": "Natrel",
"package_size": "2 L",
"unit_details": "2 L",
"average_weight_g": null,
"price": 9.29,
"price_quantity": "ea.",
"regular_price": 9.29,
"sale_price": null,
"on_sale": false,
"sale_valid_to": null,
"sale_text": null,
"price_per_kg": null,
"price_per_lb": null,
"regular_price_per_kg": null,
"unit_prices": [
{
"price": "[trimmed-depth]",
"per_quantity": "[trimmed-depth]",
"per_unit": "[trimmed-depth]"
}
],
"regular_unit_prices": null,
"price_basis": "per_item",
"estimated_item_price": null,
"average_item_weight_g": null,
"taxable": false,
"currency": "CAD",
"discount_amount": null,
"discount_percent": null,
"price_tag": "reg",
"sold_by_weight": false,
"inactive": false,
"stock_status": null,
"category": "Dairy & Eggs",
"sponsored": false,
"image": "https://product-images.metro.ca/images/h4b/h44/15110992265246.jpg",
"url": "https://www.metro.ca/en/online-grocery/aisles/dairy-eggs/milk-cream-butter/2-whole-milk/2-lactose-free-protein-milk/p/064420320148",
"rank": 1
},
{
"product_id": "064420320179",
"title": "3.25% Lactose-Free Protein Milk",
"brand": "Natrel",
"package_size": "2 L",
"unit_details": "2 L",
"average_weight_g": null,
"price": 9.29,
"price_quantity": "ea.",
"regular_price": 9.29,
"sale_price": null,
"on_sale": false,
"sale_valid_to": null,
"sale_text": null,
"price_per_kg": null,
"price_per_lb": null,
"regular_price_per_kg": null,
"unit_prices": [
{
"price": "[trimmed-depth]",
"per_quantity": "[trimmed-depth]",
"per_unit": "[trimmed-depth]"
}
],
"regular_unit_prices": null,
"price_basis": "per_item",
"estimated_item_price": null,
"average_item_weight_g": null,
"taxable": false,
"currency": "CAD",
"discount_amount": null,
"discount_percent": null,
"price_tag": "reg",
"sold_by_weight": false,
"inactive": false,
"stock_status": null,
"category": "Dairy & Eggs",
"sponsored": false,
"image": "https://product-images.metro.ca/images/h61/hd6/14983899316254.jpg",
"url": "https://www.metro.ca/en/online-grocery/aisles/dairy-eggs/milk-cream-butter/lactose-free-non-dairy-milk/3-25-lactose-free-protein-milk/p/064420320179",
"rank": 2
},
{
"product_id": "064420320155",
"title": "1% Lactose-Free Chocolate Protein Milk",
"brand": "Natrel",
"package_size": "2 L",
"unit_details": "2 L",
"average_weight_g": null,
"price": 9.29,
"price_quantity": "ea.",
"regular_price": 9.29,
"sale_price": null,
"on_sale": false,
"sale_valid_to": null,
"sale_text": null,
"price_per_kg": null,
"price_per_lb": null,
"regular_price_per_kg": null,
"unit_prices": [
{
"price": "[trimmed-depth]",
"per_quantity": "[trimmed-depth]",
"per_unit": "[trimmed-depth]"
}
],
"regular_unit_prices": null,
"price_basis": "per_item",
"estimated_item_price": null,
"average_item_weight_g": null,
"taxable": false,
"currency": "CAD",
"discount_amount": null,
"discount_percent": null,
"price_tag": "reg",
"sold_by_weight": false,
"inactive": false,
"stock_status": null,
"category": "Dairy & Eggs",
"sponsored": false,
"image": "https://product-images.metro.ca/images/h88/hd7/15110991577118.jpg",
"url": "https://www.metro.ca/en/online-grocery/aisles/dairy-eggs/milk-cream-butter/flavoured-milk/1-lactose-free-chocolate-protein-milk/p/064420320155",
"rank": 3
}
]
}
}What the Metro & Super C API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| stores | The stores of one banner with their store_id (for every other action): name, address, postal code, phone, today's hours, coordinates, whether it sells online. Narrow by postal code prefix, city, or sort by distance from lat+lon. | Pricing teams call stores to get the stores of one banner with their store_id (for every other action). | banner, store_id, postal_code, city, lat, ... |
| search | Search one Metro or Super C store's shelf: price and its quantity, regular price, sale flag, per-kg / per-lb / unit prices, pack size, average weight of weighed produce, sponsored flag. The store header the site printed is echoed (store_confirmed). | Marketplace operators call search to search one Metro or Super C store's shelf. | query, store_id, banner, page |
| product | One product at one store by its product code (4023, 4688, 061328801366 …) or its page URL: price and quantity, regular price, the sale end date the page prints, unit prices, average weight, description, image, page URL. | Catalog enrichment teams call product to get one product at one store by its product code (4023, 4688, 061328801366 …) or its page URL. | product_id, store_id, banner |
| category | Every product of one aisle at one store, paged, with the same rows as search. `category` is the aisle path of the site (e.g. fruits-vegetables/fruits/grapes) or an aisle URL. | Retail analysts call category to get every product of one aisle at one store, paged, with the same rows as search. | category, store_id, banner, page |
Call search from your stack
curl -X POST https://api.reefapi.com/metro-ca/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"milk","banner":"metro","store_id":"82"}'import os
import requests
REEF_KEY = os.environ["REEF_KEY"]
r = requests.post(
"https://api.reefapi.com/metro-ca/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "milk",
"banner": "metro",
"store_id": "82"
},
timeout=90,
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/metro-ca/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "milk",
"banner": "metro",
"store_id": "82"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.metro-ca.search with {"query":"milk","banner":"metro","store_id":"82"}.Who uses this API and why
- Compare one basket across Metro and Super C stores in a region
- Follow a product's price at several stores, in dollars and per kilo
- Find a store's sale end dates for the items you watch
- List stores near a postal code with address and today's hours
Questions developers ask before integrating
How do I find store numbers?
stores returns them for a banner, by postal code or its first three characters, by city, or by coordinates with lat and lon. Store numbers are per banner, so a Metro number does not work as a Super C number.
Do prices really differ from store to store?
They can. 2 L of Québon 2% milk read 4.60 at one Metro store and 4.72 at another on 2026-11-08, and 4.60 at a Super C. You always read a single store's price, so store_id is required.
How do weighed products come back?
price_basis tells you. per_kg means price is the price for price_quantity, usually 1000 g, with price_per_kg and price_per_lb beside it. estimated_item means the page prints an average piece price, returned in estimated_item_price, while the real price depends on the weight.
When does a sale end?
product returns sale_valid_to. Search and category rows show on_sale and sale_price but no end date, so call product when the date matters.
Is there a stock level or a flyer endpoint?
No stock level: the site publishes none, and stock_status is only 'unavailable' when the site marks an item inactive. There is no flyer action, though search and category rows flag on_sale, and sponsored rows are marked with sponsored.
Does it cover Québec and Ontario, in French?
The engine covers Metro and Super C stores in Québec and Ontario, which you list through stores. Product text comes back in English; there is no French parameter on this API.
What is the Metro & Super C API?
Metro & Super C API is a ReefAPI endpoint group for store-level grocery prices from metro and super c in québec and ontario: the price at the store you pick, sale end dates and per-kg prices. It returns live JSON through POST requests under /metro-ca/v1.
Is the Metro & Super C API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Metro & Super C calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Metro & Super C login or account?
No login to Metro & Super C 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 Metro & Super C data?
The page example is captured from a live stores call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Metro & Super C API use?
Metro & Super C actions currently cost 2-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Metro & Super C from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call metro-ca actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the Metro & Super C API a Metro & Super C scraper?
It is the managed alternative to a DIY Metro & Super C scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same store-level grocery prices from metro and super c in québec and ontario: the price at the store you pick, sale end dates and per-kg prices back as clean JSON.
Why does my Metro & Super C scraper keep getting blocked?
Most Metro & Super C scrapers break on anti-bot defenses, rate limits and IP bans that need rotating residential proxies and browser fingerprinting to clear. ReefAPI handles all of that for you — no proxies, no captchas, no maintenance — and returns live JSON. Blocked calls are free.