# IGA Québec API — store-level grocery prices for IGA and IGA extra stores in Quebec: regular price, current sale with end date, per-kg pricing, Scene+ points, stock flag, UPCs, stores

> IGA stores in Quebec with their store number (for every other action): name, address, postal code, phone, opening hours, coordinates. Nearest first with `lat`+`lon` or `postal_code`; or look one up by `store_id`; or match a name / city with `query`.
> ReefAPI engine `iga-qc` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/iga-qc/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/iga-qc/v1/stores — 1 credit
IGA stores in Quebec with their store number (for every other action): name, address, postal code, phone, opening hours, coordinates. Nearest first with `lat`+`lon` or `postal_code`; or look one up by `store_id`; or match a name / city with `query`.

**Parameters:**
- `store_id` (string, optional) — One store by its number.
- `query` (string, optional) — Free text matched against store name, city and address.
- `lat` (number, optional) — Latitude (with `lon`): stores nearest first, with distance_km.
- `lon` (number, optional) — Longitude, with `lat`.
- `limit` (integer, optional, default 10) — At most this many stores.

**Returns:** total, returned, stores[]{store_id, name, banner, address, city, province, postal_code, phone, lat, lon, shop_type, store_hours{monday…sunday}, url, distance_km}

**Example request body:**
```json
{
  "lat": "46.7328",
  "lon": "-71.2679",
  "limit": "5"
}
```

### POST https://api.reefapi.com/iga-qc/v1/search — 2 credits
Search one IGA store's shelf: regular price, the current sale price and its end date, per-kg or per-item basis, Scene+ points, multi-buy, in-stock flag, UPCs and pack size per row.

**Parameters:**
- `query` (string, required) — What to search for (product words, a brand or a UPC). May be empty when `category` is given (browse the aisle).
- `store_id` (string, required) — The IGA store number (4 digits, e.g. 0444 = IGA extra St-Romuald, Lévis). Prices, sales and stock are that store's. Get numbers from the `stores` action.
- `page` (integer, optional, default 1) — Result page, 1-50.
- `page_size` (integer, optional, default 24) — Rows per page (1-100).
- `sort` (enum, optional, default "relevance") — Result order (the site's own sorts). [one of: relevance, price_asc, price_desc, name_asc, name_desc]
- `category` (string, optional) — Only this category, as the `categories` action or a row's category / subcategory prints it (English names).
- `on_sale` (boolean, optional, default false) — Only products with a promotion running now at this store.
- `language` (enum, optional, default "en") — Language of product texts. [one of: en, fr]

**Returns:** query, store_id, store_name, store_address, page, page_size, total (source count), returned, has_next, results[]{product_id, article_number, store_id, title, brand, upcs[], uom, package_size, package_count, shipping_weight, max_weight_kg, price (what you pay now), currency, regular_price, sale_price, on_sale, sale_valid_from, sale_valid_to, sale_promotion_number, sale_requires_loyalty_card, price_basis ('per_item' | 'per_kg'), price_unit, price_per_kg, regular_price_per_kg, estimated_item_price (always null: not published), member_price (Scene+ member flyer price when the store publishes one), multi_buy[], scene_plus_points, percent_off[], active_promotions[], upcoming_promotions[], in_stock, stock_status, category, subcategory, category_path, image, source_updated_at, url}

**Example request body:**
```json
{
  "query": "milk",
  "store_id": "0444"
}
```

### POST https://api.reefapi.com/iga-qc/v1/product — 1 credit
One product at one IGA store, by product_id (as a row returns it), article number, UPC / GTIN or produce PLU: every price field with dates, all running and coming promotions, stock flag, UPCs, pack size, category, description, image and the product page.

**Parameters:**
- `store_id` (string, required) — The IGA store number (4 digits, e.g. 0444 = IGA extra St-Romuald, Lévis). Prices, sales and stock are that store's. Get numbers from the `stores` action.
- `product_id` (string, optional) — The `product_id` of a row (38512_EA_0444), or its article number (38512 / 38512_EA).
- `upc` (string, optional) — A UPC / GTIN printed on the pack (8-14 digits). Exact match only.
- `plu` (string, optional) — A 4-5 digit produce PLU (4023 = red seedless grapes); matched through the PLU-embedded UPC the store indexes.
- `language` (enum, optional, default "en") — Language of product texts. [one of: en, fr]

**Returns:** store_id, store_name, store_address, matched_by, fetched_at, product{product_id, article_number, store_id, title, brand, upcs[], uom, package_size, package_count, shipping_weight, max_weight_kg, price (what you pay now), currency, regular_price, sale_price, on_sale, sale_valid_from, sale_valid_to, sale_promotion_number, sale_requires_loyalty_card, price_basis ('per_item' | 'per_kg'), price_unit, price_per_kg, regular_price_per_kg, estimated_item_price (always null: not published), member_price (Scene+ member flyer price when the store publishes one), multi_buy[], scene_plus_points, percent_off[], active_promotions[], upcoming_promotions[], in_stock, stock_status, category, subcategory, category_path, image, source_updated_at, url} + description, country_of_origin, product_of_canada, gtin

**Example request body:**
```json
{
  "store_id": "0444",
  "upc": "061328801366"
}
```

### POST https://api.reefapi.com/iga-qc/v1/deals — 3 credits
Everything with a promotion running now at one IGA store (this week's flyer prices, Scene+ points offers), optionally inside one category or matching a word.

**Parameters:**
- `store_id` (string, required) — The IGA store number (4 digits, e.g. 0444 = IGA extra St-Romuald, Lévis). Prices, sales and stock are that store's. Get numbers from the `stores` action.
- `query` (string, optional) — Optional words to narrow the deals.
- `category` (string, optional) — Only this category, as the `categories` action or a row's category / subcategory prints it (English names).
- `page` (integer, optional, default 1) — Result page, 1-50.
- `page_size` (integer, optional, default 24) — Rows per page (1-100).
- `sort` (enum, optional, default "relevance") — Result order (the site's own sorts). [one of: relevance, price_asc, price_desc, name_asc, name_desc]
- `language` (enum, optional, default "en") — Language of product texts. [one of: en, fr]

**Returns:** store_id, page, total, returned, has_next, results[]{product_id, article_number, store_id, title, brand, upcs[], uom, package_size, package_count, shipping_weight, max_weight_kg, price (what you pay now), currency, regular_price, sale_price, on_sale, sale_valid_from, sale_valid_to, sale_promotion_number, sale_requires_loyalty_card, price_basis ('per_item' | 'per_kg'), price_unit, price_per_kg, regular_price_per_kg, estimated_item_price (always null: not published), member_price (Scene+ member flyer price when the store publishes one), multi_buy[], scene_plus_points, percent_off[], active_promotions[], upcoming_promotions[], in_stock, stock_status, category, subcategory, category_path, image, source_updated_at, url}

**Example request body:**
```json
{
  "store_id": "0444"
}
```

### POST https://api.reefapi.com/iga-qc/v1/categories — 1 credit
The category tree of one IGA store with product counts (department and aisle level), to use as `category` in search and deals.

**Parameters:**
- `store_id` (string, required) — The IGA store number (4 digits, e.g. 0444 = IGA extra St-Romuald, Lévis). Prices, sales and stock are that store's. Get numbers from the `stores` action.
- `language` (enum, optional, default "en") — Language of product texts. [one of: en, fr]

**Returns:** store_id, total_products, departments[]{name, count}, aisles[]{path, count}

**Example request body:**
```json
{
  "store_id": "0444"
}
```

## 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=iga-qc
- Human docs page: https://reefapi.com/docs/iga-qc
- Overview page: https://reefapi.com/iga-qc-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
