# Canada Grocery Deals - Flyer Prices by Postal Code (`gratifying_graph/canada-grocery-deals`) Actor

Current flyer deals from Canadian grocery chains (Loblaws, Metro, Sobeys, IGA, Walmart, Super C, Maxi and more) for any postal code. Search by product, compare prices across chains, track deals on a schedule. EN + FR.

- **URL**: https://apify.com/gratifying\_graph/canada-grocery-deals.md
- **Developed by:** [Jimmy A](https://apify.com/gratifying_graph) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 0 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 deal results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Canada Grocery Deals - Flyer Prices from Every Major Chain by Postal Code

Current weekly **flyer deals from Canadian grocery chains** for any postal code, normalized into one clean schema. Search by product, filter by chain, and compare prices across Loblaws, Metro, Sobeys, IGA, Walmart, Maxi, Super C, No Frills, FreshCo, Adonis and more - all in a single run.

This actor reads the same public flyer data that shoppers see on the flyer aggregators. It is HTTP-first: no browser, no proxies, no login. Deals are regional, so you pass a postal code and get the flyers that actually run in that area.

### What you get

One record per deal:

```json
{
  "dealId": 1017046716,
  "query": "chicken",
  "postalCode": "H2X 1Y6",
  "name": "FRESH BONELESS CHICKEN BREASTS",
  "merchant": "IGA",
  "merchantId": 4592,
  "currentPrice": 12.24,
  "originalPrice": null,
  "currency": "CAD",
  "priceText": "/lb $26.99/kg",
  "saleStory": "350 Scene+ PTS",
  "category": "Food, Beverages & Tobacco > Food Items",
  "brandIds": ["8548"],
  "flyerId": 7964171,
  "validFrom": "2026-06-11T04:00:00+00:00",
  "validTo": "2026-06-18T03:59:59+00:00",
  "imageUrl": "https://f.wishabi.net/page_items/421878246/1780325324/extra_large.jpg",
  "source": "Flipp public search (flyer data published by merchants)",
  "fetchedAt": "2026-06-10T21:29:45.221Z"
}
````

`currentPrice` and `originalPrice` are numeric where the flyer gives a clean price. `priceText` keeps the raw per-unit text (e.g. `/lb $26.99/kg`) and `saleStory` keeps the promo line (e.g. `40% DE RABAIS`, `2 for $5`, loyalty-points offers) so nothing is lost. `validFrom`/`validTo` are the flyer's run dates.

### Filters

- **postalCode** (required): Canadian postal code, e.g. `H2X 1Y6`. Flyers differ by region.
- **queries** (required): one or more product terms (`milk`, `chicken`, `diapers`). One search per term.
- **merchants**: only keep these chains (case-insensitive substring, e.g. `Metro`, `IGA`, `Maxi`). Empty = all chains.
- **locale**: `en-ca` or `fr-ca` for English or French product names.
- **maxItemsPerQuery**: cap deals per search term.
- **onlyWithPrice**: skip image-only promos that carry no parseable price (default true).

### Use cases

- **Price comparison apps**: cheapest chicken across every chain near a shopper this week
- **Deal alerts**: run on a schedule, diff against last week, notify on a target price
- **Meal-planning and budgeting tools**: pull this week's deals for a shopping list by postal code
- **Market and CPG research**: track promo depth and frequency by brand, chain, and region over time
- **AI agents**: ask "what milk deals are near H2X 1Y6 this week" through the standby API endpoint

### API / Standby mode for AI agents

Call the actor as a synchronous HTTP endpoint:

```
GET /?postalCode=H2X1Y6&q=milk&merchant=Metro&locale=en-ca
```

Returns `{ count, deals: [...] }` immediately. Works as a tool for agent frameworks that support Apify actors.

### Pricing

Pay per event:

| Event | Price |
|---|---|
| Actor start | $0.0005 |
| Per deal record | $0.001 |
| API call (standby) | $0.02 |

A daily check of three products in one city returns roughly 50-150 deals, about $1.50-4.50/month. Tracking many products or many postal codes scales linearly - tell us your use case if you need a snapshot tier.

### FAQ

**Where does the data come from?**
The public flyer search backend used by Canadian flyer aggregators - the same flyers the chains publish for shoppers each week. The actor reads logged-out, public, non-personal data only.

**Are these in-store shelf prices?**
No. These are advertised flyer/promo prices for the stated validity window. In-store regular prices are not part of flyer data.

**Why do I need a postal code?**
Flyers are regional. A deal in Montreal may not run in Calgary, and the same chain ships different flyers by area.

**English or French?**
Both. Pass `fr-ca` for French product names (useful for Quebec chains), `en-ca` otherwise.

**Why are some prices null but priceText is filled?**
Flyer items sometimes advertise "2 for $5" or "40% off" instead of a single number. The numeric fields stay null and the offer is preserved in `priceText` and `saleStory`.

**CSV export?**
Every Apify dataset exports as CSV, JSON, Excel, or via API.

# Actor input Schema

## `postalCode` (type: `string`):

Canadian postal code (e.g. H2X 1Y6). Deals are local: flyers differ by region.

## `queries` (type: `array`):

Products to search for (e.g. chicken, milk, diapers). One search per term.

## `merchants` (type: `array`):

Only include these chains (case-insensitive substring, e.g. Metro, IGA, Maxi). Empty = all chains.

## `locale` (type: `string`):

Flyer language. en-ca for English Canada, fr-ca for French Canada.

## `maxItemsPerQuery` (type: `integer`):

Cap on the number of flyer deals returned per search term.

## `onlyWithPrice` (type: `boolean`):

Skip flyer items without a parseable price (e.g. image-only promos).

## Actor input object example

```json
{
  "postalCode": "H2X 1Y6",
  "queries": [
    "milk",
    "chicken"
  ],
  "merchants": [],
  "locale": "en-ca",
  "maxItemsPerQuery": 200,
  "onlyWithPrice": true
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "postalCode": "H2X 1Y6",
    "queries": [
        "milk",
        "chicken"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gratifying_graph/canada-grocery-deals").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "postalCode": "H2X 1Y6",
    "queries": [
        "milk",
        "chicken",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("gratifying_graph/canada-grocery-deals").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "postalCode": "H2X 1Y6",
  "queries": [
    "milk",
    "chicken"
  ]
}' |
apify call gratifying_graph/canada-grocery-deals --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=gratifying_graph/canada-grocery-deals",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Canada Grocery Deals - Flyer Prices by Postal Code",
        "description": "Current flyer deals from Canadian grocery chains (Loblaws, Metro, Sobeys, IGA, Walmart, Super C, Maxi and more) for any postal code. Search by product, compare prices across chains, track deals on a schedule. EN + FR.",
        "version": "1.0",
        "x-build-id": "IBeh2Sd9KaCEozo5O"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/gratifying_graph~canada-grocery-deals/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-gratifying_graph-canada-grocery-deals",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/gratifying_graph~canada-grocery-deals/runs": {
            "post": {
                "operationId": "runs-sync-gratifying_graph-canada-grocery-deals",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/gratifying_graph~canada-grocery-deals/run-sync": {
            "post": {
                "operationId": "run-sync-gratifying_graph-canada-grocery-deals",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "postalCode",
                    "queries"
                ],
                "properties": {
                    "postalCode": {
                        "title": "Postal code",
                        "type": "string",
                        "description": "Canadian postal code (e.g. H2X 1Y6). Deals are local: flyers differ by region."
                    },
                    "queries": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Products to search for (e.g. chicken, milk, diapers). One search per term.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "merchants": {
                        "title": "Merchant filter",
                        "type": "array",
                        "description": "Only include these chains (case-insensitive substring, e.g. Metro, IGA, Maxi). Empty = all chains.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "locale": {
                        "title": "Language",
                        "enum": [
                            "en-ca",
                            "fr-ca"
                        ],
                        "type": "string",
                        "description": "Flyer language. en-ca for English Canada, fr-ca for French Canada.",
                        "default": "en-ca"
                    },
                    "maxItemsPerQuery": {
                        "title": "Max deals per search term",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Cap on the number of flyer deals returned per search term.",
                        "default": 200
                    },
                    "onlyWithPrice": {
                        "title": "Only deals with a numeric price",
                        "type": "boolean",
                        "description": "Skip flyer items without a parseable price (e.g. image-only promos).",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
