# Save-On-Foods & PriceSmart Foods Scraper API - Canada (`sunny_eternity/save-on-foods-pricesmart-scraper`) Actor

Extract product data from Pattison Food Group grocery stores (Save-On-Foods, PriceSmart Foods), including prices, images, package sizes, and normalized unit pricing. Export data in JSON/CSV, run via API, or schedule regular price monitoring.

- **URL**: https://apify.com/sunny\_eternity/save-on-foods-pricesmart-scraper.md
- **Developed by:** [JChaw](https://apify.com/sunny_eternity) (community)
- **Categories:** Automation, E-commerce, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Save-On-Foods & PriceSmart Grocery Price Scraper API

Extract grocery prices and product data from Save-On-Foods and PriceSmart Foods, including product names, current prices, sale prices, unit prices, package sizes, product images, product URLs, weekly deals, and availability.

This Actor is built for Western Canada grocery price monitoring, retail analytics, grocery price comparison apps, food inflation research, and automated Canadian grocery data pipelines.

Use it to collect structured Save-On-Foods and PriceSmart Foods product data by search term, category, postal code, or store location, then export results as JSON, CSV, Excel, or through the Apify API.

### Who is this for?

- Developers building grocery price comparison apps
- Retail analysts monitoring Western Canada grocery prices
- CPG brands tracking Save-On-Foods and PriceSmart promotions
- Researchers studying food inflation and grocery affordability
- Data teams building Canadian grocery product databases
- Agencies and consultants creating retail dashboards
- Indie hackers building shopping, deal, or price alert tools

### Features

- 🚀 **Fast & reliable**: Calls the internal Pattison storefrontgateway API directly — no slow browser automation, no CAPTCHAs
- 🛒 **Two banners, one scraper**: Extract data from Save-On-Foods and PriceSmart Foods with a single actor
- 📊 **Complete product data**: Names, prices, unit prices, package sizes, images, URLs, and product IDs
- 💰 **Sale & promo tracking**: Capture was-prices and multi-buy deals
- 📍 **Location-aware pricing**: Auto-resolve the nearest store by Canadian postal code or specify a store ID (rsid)
- ⚖️ **Normalized unit prices**: Get comparable $/100g or $/100ml pricing across products
- 📁 **Multiple export formats**: Download scraped data as JSON, CSV, or Excel
- 🔌 **Integrations**: Connect with Zapier, Make, Google Sheets, webhooks, and the Apify API

### What data does Save-On-Foods & PriceSmart Scraper extract?

| 🏷️ Product name                     | 💲 Price & sale price                 |
| ----------------------------------- | ------------------------------------- |
| 📦 Package size (e.g., 500g)        | 📊 Unit price (e.g., $0.30/100ml)     |
| 🖼️ Product image URL                | 🔗 Product page URL                   |
| 🆔 Product ID                       | 📍 Store location ID (rsid)           |
| ⚖️ Selling type (by weight/by unit) | 📈 Comparable unit price (normalized) |
| 🏷️ Multi-buy deals                  | 🏬 Store location name                |

### ⬇️ Input

| Field          | Type     | Required | Description                                                      |
| -------------- | -------- | -------- | ---------------------------------------------------------------- |
| `banner`       | string   | ✅       | Store banner: `saveonfoods` or `pricesmart`                      |
| `categories`   | string[] | ✳️       | Departments or subcategories to scrape (multi-select dropdown)   |
| `categoryUrls` | string[] | ✳️       | Custom category IDs for subcategories not in the dropdown        |
| `postal_code`  | string   | ✳️       | Canadian postal code to auto-resolve the nearest store           |
| `locationId`   | string   | ✳️       | Explicit store rsid (takes priority over `postal_code`)          |

> ✳️ At least one of `categories` or `categoryUrls` must be provided to choose what to scrape.
> ✳️ At least one of `postal_code` or `locationId` must be provided so the actor knows which store to query. If both are provided, `locationId` takes priority. The default input ships with `postal_code` set to `V6M 2P8` (Vancouver, BC).

#### Category selection

The `categories` dropdown supports **125+ options** organized across **14 top-level departments** and **111 subcategories**:

- **📁 Departments** (e.g., `fruits-vegetables`, `bakery`) — scrapes all subcategories within
- **└ Subcategories** (e.g., `dairy-eggs/cheese`, `bakery/breads`) — scrapes a single subcategory

When you select a department, the actor automatically queues each of its subcategories for scraping.

#### Example inputs

**Single subcategory:**
```json
{
  "banner": "saveonfoods",
  "categories": ["bakery/breads"]
}
````

**Entire department:**

```json
{
  "banner": "saveonfoods",
  "categories": ["dairy-eggs", "bakery"]
}
```

**Mix of departments and subcategories:**

```json
{
  "banner": "saveonfoods",
  "categories": ["meat-seafood", "dairy-eggs/cheese", "frozen/frozen-pizza"]
}
```

**Scrape with postal code:**

```json
{
  "banner": "saveonfoods",
  "postal_code": "V6M 2P8",
  "categories": ["dairy-eggs", "meat-seafood", "frozen/ice-cream-desserts"]
}
```

**Scrape at a specific store (rsid):**

```json
{
  "banner": "pricesmart",
  "locationId": "2274",
  "categories": ["fruits-vegetables/fresh-fruit", "bakery/breads", "pantry/canned-packaged"]
}
```

**Custom category IDs (for subcategories not in the dropdown):**

```json
{
  "banner": "saveonfoods",
  "categoryUrls": ["30683"]
}
```

### ⬆️ Output

Results are stored in a dataset accessible from the Output or Storage tab. Export as JSON, CSV, or Excel.

#### JSON output example

```json
{
  "store": "Save-On-Foods",
  "name": "Organic Whole Milk 2L",
  "price": "5.99",
  "unit_price": "$0.30/100ml",
  "image_url": "https://assets.shop.saveonfoods.com/products/...",
  "product_url": "https://www.saveonfoods.com/sm/planning/rsid/1982/product/...",
  "product_id": "00000000123456",
  "location": "1982",
  "location_name": "Save-On-Foods Marine Drive",
  "category": "dairy-eggs/milk-creams",
  "selling_type": "by_unit",
  "package_size": "2000ml",
  "comparable_unit_price": 0.30,
  "was_price": null,
  "is_on_sale": false,
  "multi_buy_deal": null
}
```

#### Output fields

| Field                   | Description                                                  |
| ----------------------- | ------------------------------------------------------------ |
| `store`                 | Store name (Save-On-Foods or PriceSmart Foods)               |
| `name`                  | Product display name                                         |
| `price`                 | Current price (without $ symbol)                             |
| `unit_price`            | Raw unit price string from store (e.g., "$0.30/100ml")       |
| `product_url`           | Direct link to product page                                  |
| `selling_type`          | `by_weight` or `by_unit` — how the product is priced         |
| `package_size`          | Package size as string (e.g., "500g", "2L")                  |
| `comparable_unit_price` | Normalized price per 100g or 100ml for comparison            |
| `was_price`             | Previous price before sale (null if not on sale)             |
| `is_on_sale`            | Whether the product currently has a deal                     |
| `multi_buy_deal`        | Multi-buy promotion text (e.g., "2 for $5.00")               |
| `location`              | Store location ID (rsid)                                     |
| `location_name`         | Store name (e.g., "Save-On-Foods Marine Drive")              |

### 🏪 Supported stores

| Banner        | Store Name        | API Handler                      |
| ------------- | ----------------- | -------------------------------- |
| `saveonfoods` | Save-On-Foods     | Pattison Storefront Gateway API  |
| `pricesmart`  | PriceSmart Foods  | Pattison Storefront Gateway API  |

Both stores are operated by Pattison Food Group and use the same underlying Storefront Gateway API, so the scraper works identically for both.

### ❓ FAQ

#### How does the Save-On-Foods & PriceSmart scraper work?

It calls the internal Pattison Storefront Gateway API directly — the same API the Save-On-Foods and PriceSmart Foods websites use — which is much faster and more reliable than browser-based scraping or Puppeteer automation. The scraper handles pagination automatically, requesting each page until all products are collected.

#### Is there an official Save-On-Foods or PriceSmart API?

Pattison Food Group does not offer a public API for product or pricing data. This actor gives you a reliable alternative by calling the same internal endpoints used by the Save-On-Foods and PriceSmart Foods websites, so you get fresh, structured grocery data without browser automation.

#### Is it legal to scrape Save-On-Foods or PriceSmart?

Scraping publicly available product and price information is generally legal, but you are responsible for complying with each retailer's terms of service and any applicable laws in your jurisdiction. Use the data responsibly and avoid excessive request volume.

#### How much does it cost to run?

The actor runs on Apify's pay-per-usage model. Small scrapes (a few categories) typically fit within Apify's free tier credits. Larger full-store scrapes scale with the number of products and API calls.

#### Can I scrape multiple categories at once?

Yes! Select multiple departments or subcategories in the `categories` dropdown to scrape them in a single run. Selecting a department automatically queues all of its subcategories.

#### Which provinces does this cover?

Save-On-Foods and PriceSmart Foods operate primarily in British Columbia, Alberta, Saskatchewan, Manitoba, and Yukon. Postal code resolution works for all major Canadian metro areas served by these banners.

#### How do I find the location ID (rsid) for my store?

Use the `postal_code` field instead — the actor will automatically resolve the nearest store. Alternatively, browse to your store on saveonfoods.com or pricesmartfoods.com — the rsid appears in the URL (e.g., `/sm/planning/rsid/1982/`). Common Vancouver store IDs:

**Save-On-Foods:** `1982` (Marine Drive)
**PriceSmart Foods:** `2274`

#### Can I integrate the scraper with other tools?

Yes! Use Apify integrations to connect with Zapier, Make, Google Sheets, Airbyte, and more. You can also trigger runs via webhooks or the Apify API and export scraped data as JSON, CSV, or Excel.

#### Can I schedule recurring scrapes?

Yes — use Apify's built-in scheduler to run the actor daily, weekly, or on any cron schedule. This is ideal for tracking grocery price history over time or monitoring sales and weekly deals.

### 🔗 Related Actors

Scraping more Canadian grocery banners? Pair this actor with our Loblaws scraper for full national coverage:

- [Loblaws Grocery Scraper](https://apify.com/sunny_eternity/loblaws-grocery-scraper) — extract prices and product data from Real Canadian Superstore and No Frills.

### 📝 Your feedback

We're always working on improving the performance of our Actors. If you've got any technical feedback for Save-On-Foods & PriceSmart Grocery Scraper or found a bug, please create an issue on the Actor's Issues tab.

# Actor input Schema

## `banner` (type: `string`):

Which Pattison Food Group banner to scrape

## `categories` (type: `array`):

Select departments (📁) or specific subcategories (└). Selecting a department scrapes all products in that department.

## `categoryUrls` (type: `array`):

Optional: provide raw numeric category IDs for subcategories not listed above (e.g., '30683' for Apples). Find IDs in the saveonfoods.com URL: /categories/{slug}-id-{ID}.

## `postal_code` (type: `string`):

Canadian postal code (e.g., 'V6M 2P8') to auto-resolve the nearest store. locationId takes priority if both provided.

## `locationId` (type: `string`):

Optional store rsid (e.g., '1982' for Save-On Marine Drive Vancouver). Faster than postal\_code — skips location lookup. Find it in the saveonfoods.com URL: /sm/planning/rsid/{ID}/.

## Actor input object example

```json
{
  "banner": "saveonfoods",
  "categories": [
    "fruits-vegetables"
  ],
  "postal_code": "V6M 2P8"
}
```

# Actor output Schema

## `products` (type: `string`):

Complete dataset of scraped products including names, prices, images, unit pricing, and package sizes from the specified store category

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("sunny_eternity/save-on-foods-pricesmart-scraper").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("sunny_eternity/save-on-foods-pricesmart-scraper").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 '{}' |
apify call sunny_eternity/save-on-foods-pricesmart-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=sunny_eternity/save-on-foods-pricesmart-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Save-On-Foods & PriceSmart Foods Scraper API - Canada",
        "description": "Extract product data from Pattison Food Group grocery stores (Save-On-Foods, PriceSmart Foods), including prices, images, package sizes, and normalized unit pricing. Export data in JSON/CSV, run via API, or schedule regular price monitoring.",
        "version": "1.0",
        "x-build-id": "ftsfttz0tdtLsX5IU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sunny_eternity~save-on-foods-pricesmart-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sunny_eternity-save-on-foods-pricesmart-scraper",
                "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/sunny_eternity~save-on-foods-pricesmart-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sunny_eternity-save-on-foods-pricesmart-scraper",
                "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/sunny_eternity~save-on-foods-pricesmart-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sunny_eternity-save-on-foods-pricesmart-scraper",
                "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": [
                    "banner"
                ],
                "properties": {
                    "banner": {
                        "title": "Store Banner",
                        "enum": [
                            "saveonfoods",
                            "pricesmart"
                        ],
                        "type": "string",
                        "description": "Which Pattison Food Group banner to scrape",
                        "default": "saveonfoods"
                    },
                    "categories": {
                        "title": "Categories",
                        "type": "array",
                        "description": "Select departments (📁) or specific subcategories (└). Selecting a department scrapes all products in that department.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "fruits-vegetables",
                                "fruits-vegetables/fresh-fruit",
                                "fruits-vegetables/fresh-vegetables",
                                "fruits-vegetables/fresh-juice-smoothies",
                                "fruits-vegetables/fresh-noodle-tofu-soy-products",
                                "fruits-vegetables/salad-kits-greens-essentials",
                                "fruits-vegetables/dried-snack-fruit-nuts",
                                "fruits-vegetables/dressing-dips",
                                "fruits-vegetables/trays-baskets-platters",
                                "dairy-eggs",
                                "dairy-eggs/butter-margarine",
                                "dairy-eggs/cheese",
                                "dairy-eggs/chilled-juice-drinks",
                                "dairy-eggs/dough-products",
                                "dairy-eggs/eggs-substitutes",
                                "dairy-eggs/milk-creams",
                                "dairy-eggs/milk-substitutes",
                                "dairy-eggs/pudding-desserts",
                                "dairy-eggs/sour-cream-dips",
                                "dairy-eggs/yogurt",
                                "meat-seafood",
                                "meat-seafood/bacon",
                                "meat-seafood/beef-veal",
                                "meat-seafood/chicken-turkey",
                                "meat-seafood/fish",
                                "meat-seafood/frozen-meat",
                                "meat-seafood/frozen-seafood",
                                "meat-seafood/game-specialty-meats",
                                "meat-seafood/hot-dogs-sausages",
                                "meat-seafood/lamb",
                                "meat-seafood/meat-alternatives",
                                "meat-seafood/pork-ham",
                                "meat-seafood/shrimp-shell-fish",
                                "meat-seafood/smoked-cured-fish",
                                "deli-ready-made-meals",
                                "deli-ready-made-meals/cheese",
                                "deli-ready-made-meals/dips-spreads-olives",
                                "deli-ready-made-meals/meat",
                                "deli-ready-made-meals/party-platters",
                                "deli-ready-made-meals/quick-ready-meals-sides",
                                "bakery",
                                "bakery/bagels-english-muffins",
                                "bakery/breads",
                                "bakery/cakes",
                                "bakery/dessert-pastries",
                                "bakery/frozen-bakery",
                                "bakery/pies-tarts",
                                "bakery/pitas-flatbread-wraps",
                                "bakery/pizza-crust-crumbs",
                                "bakery/rolls-buns",
                                "bakery/roti-naan-breads",
                                "pantry",
                                "pantry/baking-goods",
                                "pantry/breakfast",
                                "pantry/beverages",
                                "pantry/bulk",
                                "pantry/candy",
                                "pantry/canned-packaged",
                                "pantry/condiments-toppings",
                                "pantry/herbs-spices-seasonings",
                                "pantry/marinates-sauces",
                                "pantry/oils-vinegars",
                                "pantry/pasta-sauces-grains",
                                "pantry/snacks",
                                "frozen",
                                "frozen/frozen-appetizers-snacks",
                                "frozen/frozen-bakery",
                                "frozen/frozen-beverages-ice",
                                "frozen/frozen-breakfast",
                                "frozen/frozen-fruit",
                                "frozen/frozen-meals-sides",
                                "frozen/frozen-meat",
                                "frozen/frozen-pizza",
                                "frozen/frozen-seafood",
                                "frozen/frozen-vegetables",
                                "frozen/ice-cream-desserts",
                                "international-foods",
                                "international-foods/asian",
                                "international-foods/european",
                                "international-foods/indian-middle-eastern",
                                "international-foods/latin-mexican",
                                "international-foods/mediterranean",
                                "plant-based-non-dairy",
                                "plant-based-non-dairy/egg-alternatives",
                                "plant-based-non-dairy/meat-alternatives",
                                "plant-based-non-dairy/non-dairy-beverages",
                                "plant-based-non-dairy/non-dairy-cheese",
                                "plant-based-non-dairy/non-dairy-creamers",
                                "plant-based-non-dairy/non-dairy-frozen-dessert",
                                "plant-based-non-dairy/non-dairy-spreads-condiments",
                                "plant-based-non-dairy/non-dairy-yogurt",
                                "plant-based-non-dairy/tofu",
                                "health-beauty",
                                "health-beauty/beauty",
                                "health-beauty/diet-nutrition",
                                "health-beauty/medicine-health",
                                "health-beauty/personal-care",
                                "cleaning-paper-home",
                                "cleaning-paper-home/air-freshners-candles",
                                "cleaning-paper-home/bakeware-baking-tools",
                                "cleaning-paper-home/cleaning-supplies",
                                "cleaning-paper-home/household-essentials",
                                "cleaning-paper-home/kitchen-dining",
                                "cleaning-paper-home/laundry-essentials",
                                "cleaning-paper-home/outdoor-living",
                                "cleaning-paper-home/paper-products",
                                "cleaning-paper-home/plastic-foil-storage",
                                "pet-care",
                                "pet-care/cat",
                                "pet-care/dog",
                                "pet-care/pet-grooming",
                                "pet-care/small-animal-fish-bird",
                                "baby-care",
                                "baby-care/baby-accessories-toys",
                                "baby-care/baby-bath-skincare",
                                "baby-care/baby-food",
                                "baby-care/baby-formula",
                                "baby-care/baby-health-wellness",
                                "baby-care/baby-wipes",
                                "baby-care/diapers",
                                "floral-and-garden",
                                "floral-and-garden/bouquets",
                                "floral-and-garden/ferns-outdoor-floral",
                                "floral-and-garden/potted-plants",
                                "floral-and-garden/roses"
                            ],
                            "enumTitles": [
                                "📁 Fruits & Vegetables",
                                "  └ Fresh Fruit",
                                "  └ Fresh Vegetables",
                                "  └ Fresh Juice & Smoothies",
                                "  └ Fresh Noodle, Tofu & Soy Products",
                                "  └ Salad Kits, Greens & Essentials",
                                "  └ Dried, Snack Fruit & Nuts",
                                "  └ Dressing & Dips",
                                "  └ Trays, Baskets & Platters",
                                "📁 Dairy & Eggs",
                                "  └ Butter & Margarine",
                                "  └ Cheese",
                                "  └ Chilled Juice & Drinks",
                                "  └ Dough Products",
                                "  └ Eggs & Substitutes",
                                "  └ Milk & Creams",
                                "  └ Milk Substitutes",
                                "  └ Pudding & Desserts",
                                "  └ Sour Cream & Dips",
                                "  └ Yogurt",
                                "📁 Meat & Seafood",
                                "  └ Bacon",
                                "  └ Beef & Veal",
                                "  └ Chicken & Turkey",
                                "  └ Fish",
                                "  └ Frozen Meat",
                                "  └ Frozen Seafood",
                                "  └ Game & Specialty Meats",
                                "  └ Hot Dogs & Sausages",
                                "  └ Lamb",
                                "  └ Meat Alternatives",
                                "  └ Pork & Ham",
                                "  └ Shrimp & Shell Fish",
                                "  └ Smoked & Cured Fish",
                                "📁 Deli & Ready-Made Meals",
                                "  └ Cheese",
                                "  └ Dips, Spreads & Olives",
                                "  └ Meat",
                                "  └ Party Platters",
                                "  └ Quick & Ready Meals & Sides",
                                "📁 Bakery",
                                "  └ Bagels & English Muffins",
                                "  └ Breads",
                                "  └ Cakes",
                                "  └ Dessert & Pastries",
                                "  └ Frozen Bakery",
                                "  └ Pies & Tarts",
                                "  └ Pitas, Flatbread & Wraps",
                                "  └ Pizza Crust & Crumbs",
                                "  └ Rolls & Buns",
                                "  └ Roti & Naan Breads",
                                "📁 Pantry",
                                "  └ Baking Goods",
                                "  └ Breakfast",
                                "  └ Beverages",
                                "  └ Bulk",
                                "  └ Candy",
                                "  └ Canned & Packaged",
                                "  └ Condiments & Toppings",
                                "  └ Herbs, Spices & Seasonings",
                                "  └ Marinades & Sauces",
                                "  └ Oils & Vinegars",
                                "  └ Pasta, Sauces & Grains",
                                "  └ Snacks",
                                "📁 Frozen",
                                "  └ Frozen Appetizers & Snacks",
                                "  └ Frozen Bakery",
                                "  └ Frozen Beverages & Ice",
                                "  └ Frozen Breakfast",
                                "  └ Frozen Fruit",
                                "  └ Frozen Meals & Sides",
                                "  └ Frozen Meat",
                                "  └ Frozen Pizza",
                                "  └ Frozen Seafood",
                                "  └ Frozen Vegetables",
                                "  └ Ice Cream & Desserts",
                                "📁 International Foods",
                                "  └ Asian",
                                "  └ European",
                                "  └ Indian & Middle Eastern",
                                "  └ Latin & Mexican",
                                "  └ Mediterranean",
                                "📁 Plant-Based & Non-Dairy",
                                "  └ Egg Alternatives",
                                "  └ Meat Alternatives",
                                "  └ Non-Dairy Beverages",
                                "  └ Non-Dairy Cheese",
                                "  └ Non-Dairy Creamers",
                                "  └ Non-Dairy Frozen Dessert",
                                "  └ Non-Dairy Spreads & Condiments",
                                "  └ Non-Dairy Yogurt",
                                "  └ Tofu",
                                "📁 Health & Beauty",
                                "  └ Beauty",
                                "  └ Diet & Nutrition",
                                "  └ Medicine & Health",
                                "  └ Personal Care",
                                "📁 Cleaning, Paper & Home",
                                "  └ Air Fresheners & Candles",
                                "  └ Bakeware & Baking Tools",
                                "  └ Cleaning Supplies",
                                "  └ Household Essentials",
                                "  └ Kitchen & Dining",
                                "  └ Laundry Essentials",
                                "  └ Outdoor Living",
                                "  └ Paper Products",
                                "  └ Plastic, Foil & Storage",
                                "📁 Pet Care",
                                "  └ Cat",
                                "  └ Dog",
                                "  └ Pet Grooming",
                                "  └ Small Animal, Fish & Bird",
                                "📁 Baby Care",
                                "  └ Baby Accessories & Toys",
                                "  └ Baby Bath & Skincare",
                                "  └ Baby Food",
                                "  └ Baby Formula",
                                "  └ Baby Health & Wellness",
                                "  └ Baby Wipes",
                                "  └ Diapers",
                                "📁 Floral & Garden",
                                "  └ Bouquets",
                                "  └ Ferns & Outdoor Floral",
                                "  └ Potted Plants",
                                "  └ Roses"
                            ]
                        },
                        "default": [
                            "fruits-vegetables"
                        ]
                    },
                    "categoryUrls": {
                        "title": "Custom Category IDs (optional)",
                        "type": "array",
                        "description": "Optional: provide raw numeric category IDs for subcategories not listed above (e.g., '30683' for Apples). Find IDs in the saveonfoods.com URL: /categories/{slug}-id-{ID}.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "postal_code": {
                        "title": "Postal Code",
                        "pattern": "^[A-Za-z]\\d[A-Za-z]\\s?\\d[A-Za-z]\\d$",
                        "type": "string",
                        "description": "Canadian postal code (e.g., 'V6M 2P8') to auto-resolve the nearest store. locationId takes priority if both provided.",
                        "default": "V6M 2P8"
                    },
                    "locationId": {
                        "title": "Store Location ID (rsid)",
                        "type": "string",
                        "description": "Optional store rsid (e.g., '1982' for Save-On Marine Drive Vancouver). Faster than postal_code — skips location lookup. Find it in the saveonfoods.com URL: /sm/planning/rsid/{ID}/."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
