# Metro & Super C API — Quebec / Ontario grocery prices per store from metro.ca and superc.ca: price, regular price, sale end date, per-kg and unit prices, 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.
> ReefAPI engine `metro-ca` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/metro-ca/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free.
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Clients that add connectors by URL, such as ChatGPT and the Claude app, connect with OAuth 2.1 (the user pastes their key once on a ReefAPI page; discovery at `/.well-known/oauth-protected-resource/mcp`). Config files send the key as `Authorization: Bearer <key>`. `?key=<key>` in the URL also works as a last-resort fallback.

## Endpoints

### POST https://api.reefapi.com/metro-ca/v1/stores — 2 credits
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.

**Parameters:**
- `banner` (enum, optional, default "metro") — Which banner: metro (metro.ca) or superc (superc.ca). Store numbers are per banner. [one of: metro, superc]
- `store_id` (string, optional) — Only this store.
- `postal_code` (string, optional) — Postal code or its first 3 characters.
- `city` (string, optional) — City (accents and case ignored).
- `lat` (number, optional) — Latitude, with `lon`: nearest first, with distance_km.
- `lon` (number, optional) — Longitude, with `lat`.
- `limit` (integer, optional, default 50) — At most this many stores.

**Returns:** banner, total, matched, returned, stores[]{store_id, name, sells_online, address, city, province, postal_code, phone, lat, lon, hours_today, distance_km}

**Example request body:**
```json
{
  "banner": "superc",
  "postal_code": "G6W"
}
```

### POST https://api.reefapi.com/metro-ca/v1/search — 3 credits
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).

**Parameters:**
- `query` (string, required) — What to search for (words, a brand, a product code or UPC).
- `banner` (enum, optional, default "metro") — Which banner: metro (metro.ca) or superc (superc.ca). Store numbers are per banner. [one of: metro, superc]
- `store_id` (string, required) — The store whose shelf you read (prices and sales differ store by store). Metro 82 = Alimentation Maxime Faucher, Lévis; Super C 6131 = St-Romuald. List them with `stores`.
- `page` (integer, optional, default 1) — Result page (1-50).

**Returns:** query, banner, store_id, store_name, store_confirmed, page, total, returned, sponsored_rows, has_next, fetched_at, results[]{product_id (Metro product code / PLU / UPC), title, brand, package_size, unit_details, average_weight_g, price (what you pay now, for price_quantity), price_quantity (e.g. 'ea.', '1000 g'), regular_price, sale_price, on_sale, sale_valid_to (product only), sale_text, price_per_kg, price_per_lb, regular_price_per_kg, unit_prices[]{price, per_quantity, per_unit}, regular_unit_prices[], price_basis ('per_item' | 'per_kg' | 'estimated_item'), currency, estimated_item_price (the 'avg. ea.' estimate when the site prints one, else null), average_item_weight_g, taxable (+tx), discount_amount, discount_percent, price_tag ('reg' | 'promo'), sold_by_weight, inactive, stock_status ('unavailable' when the site marks the item inactive, else null: the site publishes no stock level), category, sponsored, image, url, rank}

**Example request body:**
```json
{
  "query": "milk",
  "banner": "metro",
  "store_id": "82"
}
```

### POST https://api.reefapi.com/metro-ca/v1/product — 3 credits
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.

**Parameters:**
- `product_id` (string, required) — The product code a search row returns (a produce PLU such as 4023, or a UPC such as 061328801366; a 12-digit UPC typed without its leading zero is found too), or a product page URL.
- `banner` (enum, optional, default "metro") — Which banner: metro (metro.ca) or superc (superc.ca). Store numbers are per banner. [one of: metro, superc]
- `store_id` (string, required) — The store whose shelf you read (prices and sales differ store by store). Metro 82 = Alimentation Maxime Faucher, Lévis; Super C 6131 = St-Romuald. List them with `stores`.

**Returns:** banner, store_id, store_name, store_confirmed, fetched_at, product{product_id (Metro product code / PLU / UPC), title, brand, package_size, unit_details, average_weight_g, price (what you pay now, for price_quantity), price_quantity (e.g. 'ea.', '1000 g'), regular_price, sale_price, on_sale, sale_valid_to (product only), sale_text, price_per_kg, price_per_lb, regular_price_per_kg, unit_prices[]{price, per_quantity, per_unit}, regular_unit_prices[], price_basis ('per_item' | 'per_kg' | 'estimated_item'), currency, estimated_item_price (the 'avg. ea.' estimate when the site prints one, else null), average_item_weight_g, taxable (+tx), discount_amount, discount_percent, price_tag ('reg' | 'promo'), sold_by_weight, inactive, stock_status ('unavailable' when the site marks the item inactive, else null: the site publishes no stock level), category, sponsored, image, url, rank} + product_number, description, availability_note

**Example request body:**
```json
{
  "product_id": "4023",
  "banner": "superc",
  "store_id": "6131"
}
```

### POST https://api.reefapi.com/metro-ca/v1/category — 3 credits
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.

**Parameters:**
- `category` (string, required) — Aisle path after /aisles/ in the site's URLs, or the full aisle URL.
- `banner` (enum, optional, default "metro") — Which banner: metro (metro.ca) or superc (superc.ca). Store numbers are per banner. [one of: metro, superc]
- `store_id` (string, required) — The store whose shelf you read (prices and sales differ store by store). Metro 82 = Alimentation Maxime Faucher, Lévis; Super C 6131 = St-Romuald. List them with `stores`.
- `page` (integer, optional, default 1) — Result page (1-50).

**Returns:** category, banner, store_id, store_name, store_confirmed, page, total, returned, has_next, results[]{product_id (Metro product code / PLU / UPC), title, brand, package_size, unit_details, average_weight_g, price (what you pay now, for price_quantity), price_quantity (e.g. 'ea.', '1000 g'), regular_price, sale_price, on_sale, sale_valid_to (product only), sale_text, price_per_kg, price_per_lb, regular_price_per_kg, unit_prices[]{price, per_quantity, per_unit}, regular_unit_prices[], price_basis ('per_item' | 'per_kg' | 'estimated_item'), currency, estimated_item_price (the 'avg. ea.' estimate when the site prints one, else null), average_item_weight_g, taxable (+tx), discount_amount, discount_percent, price_tag ('reg' | 'promo'), sold_by_weight, inactive, stock_status ('unavailable' when the site marks the item inactive, else null: the site publishes no stock level), category, sponsored, image, url, rank}

**Example request body:**
```json
{
  "category": "fruits-vegetables/fruits/grapes",
  "banner": "metro",
  "store_id": "82"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=metro-ca
- Human docs page: https://reefapi.com/docs/metro-ca
- Overview page: https://reefapi.com/metro-ca-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
