# Lcbo Product Search Scraper (`stealth_mode/lcbo-product-search-scraper`) Actor

Search and extract detailed product listings from LCBO.com with powerful filtering. Collect 80+ fields per product including pricing, inventory, wine characteristics (acidity, tannins, sweetness), ratings, and availability across Ontario stores.

- **URL**: https://apify.com/stealth\_mode/lcbo-product-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## LCBO Product Search Scraper: Extract Wine & Alcohol Data Instantly

***

### What Is LCBO.com?

LCBO.com is the official e-commerce platform of the Liquor Control Board of Ontario, Canada's largest alcohol retailer. It hosts thousands of wine, spirits, beer, and cider products with detailed product pages, real-time inventory data, and customer ratings. Manually searching and collecting product information across price ranges, alcohol content, ratings, and regional availability is time-intensive — the **LCBO Product Search Scraper** automates this, delivering structured, searchable product datasets instantly.

***

### Overview

The **LCBO Product Search Scraper** extracts comprehensive product data from LCBO search results and detail pages, supporting two flexible input modes:

1. **URL-based scraping** — Paste pre-built search URLs directly
2. **Filter-based search** — Define product criteria and let the scraper build the query

The scraper is ideal for:

- **Wine retailers & sommeliers** tracking product availability and pricing
- **Market researchers** analyzing alcohol product trends and pricing strategies
- **Data analysts** building alcohol industry datasets
- **E-commerce teams** aggregating competitor product catalogs
- **Inventory managers** monitoring stock levels across Ontario stores

Key features include dual input modes, configurable filters (price, rating, alcohol %, sugar content), and access to 80+ product fields including wine-specific attributes.

***

### Input Format

The scraper accepts configuration via two independent modes:

#### Mode 1: URL-Based Scraping

```json
{
  "urls": [
    "https://www.lcbo.com/en/products/wine/red-wine#t=clp-products-wine-red_wine&sort=relevancy&layout=card",
    "https://www.lcbo.com/en/catalogsearch/result/#q=red&t=Products&sort=relevancy&layout=card&f:@lcbo_current_offer=[On%20Sale]&f:@ec_rating=[4..4.9inc]&f:ec_price:range=[5,50]"
  ],
  "max_items_per_url": 200,
  "ignore_url_failures": true
}
```

| Field | Description |
|---|---|
| `urls` | Direct links to LCBO product search or category pages with pre-built filters |
| `max_items_per_url` | Maximum products collected per URL (e.g., `200`) |
| `ignore_url_failures` | If `true`, skips failed URLs instead of halting the run |

#### Mode 2: Search Filter-Based

```json
{
  "keyword": "red",
  "sort_by": "relevancy",
  "on_sale": true,
  "price_range": "5-50",
  "rating": "4",
  "size": "",
  "alcoholic": "7-30",
  "sugar": "5-30",
  "max_items_per_url": 100
}
```

| Field | Description | Example |
|---|---|---|
| `keyword` | Product name or type to search | `red`, `malbec`, `pinot noir` |
| `sort_by` | Sort order for results | `relevancy`, `@ec_final_price ascending`, `@ec_rating descending` |
| `on_sale` | Include only discounted items | `true` or `false` |
| `price_range` | Price filter in CAD (format: min-max) | `5-50`, `10-200` |
| `rating` | Minimum customer rating filter | `1`, `2`, `3`, `4`, `5` |
| `size` | Bottle volume filter in mL (min-max) | `750-1000` |
| `alcoholic` | Alcohol content % (min-max) | `7-30`, `12-15` |
| `sugar` | Sugar content per liter (min-max) | `5-30` |

> **Tip:** Use Mode 1 (URLs) for complex, multi-filter searches; use Mode 2 (search filters) for simple, repeatable queries.

***

### Output Format

**Sample output**

```json
{
  "view_rank_monthly": 606,
  "systitle": "Julia Florista Red ",
  "lcbo_region_name": "Other",
  "created_at": 1642640672000,
  "is_buyable": "true",
  "sysurihash": "evMC2safpeZGdRaw",
  "urihash": "evMC2safpeZGdRaw",
  "sysuri": "https://www.lcbo.com/en/julia-florista-red-532358",
  "lcbo_stock_type": "1",
  "commontabs": "Products",
  "lcbo_vqa_code": "false",
  "systransactionid": 619801,
  "ec_rating": 4.4,
  "ec_final_price": 11.0,
  "stores_low_stock_combined": "false",
  "min_cart_qty": 1,
  "ec_skus": [
    "532358"
  ],
  "cp_add_to_cart_deny": [
    "allow"
  ],
  "sysconcepts": "easy-drinking charmer ; blood orange ; highlighting vanilla ; famed flower ; variety of dishes ; beef ; burgers ; nuts",
  "sell_rank_yearly": 730,
  "concepts": "easy-drinking charmer ; blood orange ; highlighting vanilla ; famed flower ; variety of dishes ; beef ; burgers ; nuts",
  "sysindexeddate": 1789384588000,
  "out_of_stock_threshold": 0,
  "permanentid": "532358",
  "lcbo_bintag_wine_acidity": 3,
  "syslanguage": [
    "English"
  ],
  "transactionid": 619801,
  "title": "Julia Florista Red ",
  "date": 1789384588000,
  "objecttype": "Product",
  "stores_stock": "true",
  "cp_browsing_category_deny": [
    "allow"
  ],
  "view_rank_yearly": 369,
  "low_stock_threshold": 12,
  "lcbo_program": null,
  "country_of_manufacture": "Portugal",
  "upc_number": "5601996273895",
  "loyalty_points": 0,
  "lcbo_kosher": "false",
  "online_inventory": 43,
  "rowid": 1789384588053705437,
  "stores_stock_combined": "true",
  "ec_visibility": 4,
  "ec_shortdesc": "Named after the famed flower girl of Fado, this red is an elegant rendition highlighting vanilla, bright red plum, nuts and hint of blood orange. Truly a soft and easy-drinking charmer that is ideal for a variety of dishes from burgers to rare beef.",
  "size": 5415,
  "ec_name": "Julia Florista Red",
  "lcbo_bintag_wine_sweetness": 2,
  "clickableuri": "https://www.lcbo.com/en/julia-florista-red-532358",
  "avg_reviews": 30,
  "syssource": "ProductsEN",
  "orderingid": 1789384526208,
  "lcbo_bintag_wine_body": 3,
  "syssize": 5415,
  "sysdate": 1789384588000,
  "lcbo_alcohol_percent": 13.0,
  "ec_thumbnails": "https://aem.lcbo.com/content/dam/lcbo/products/5/3/2/3/532358.jpg.thumb.319.319.png",
  "stores_low_stock": "false",
  "lcbo_bottles_per_pack": 1,
  "out_of_stock": "false",
  "lcbo_unit_volume": "750",
  "lcbo_tastingnotes": "Named after the famed flower girl of Fado, this red is an elegant rendition highlighting vanilla, bright red plum, nuts and hint of blood orange. Truly a soft and easy-drinking charmer that is ideal for a variety of dishes from burgers to rare beef.",
  "lcbo_bintag_wine_flavor_intensity": 3,
  "primaryid": "MV3E2QZSONQWM4DFLJDWIUTBO4XDMNRQGEXGIZLGMF2WY5A",
  "lcbo_selling_package_name": "bottle",
  "enabled": "true",
  "wordcount": 39,
  "ec_category": [
    "Promotions",
    "Collections",
    "Promotions|Top 200",
    "Collections|Top Picks",
    "Collections|Great Wines",
    "Collections|Wines of Portugal",
    "Collections|Red Wines on Bonus",
    "Collections|Top Picks|Red Wine",
    "Collections|Red Wine Best Sellers",
    "Collections|Value Wines under $15",
    "Collections|Shop Red Wines by Price",
    "Collections|Shop Red Wines by Price|Under $15",
    "Products",
    "Products|Wine",
    "Products|Wine|Red Wine"
  ],
  "source": "ProductsEN",
  "ec_price": 11.0,
  "ec_category_filter": [
    "Products|Wine|Red Wine"
  ],
  "sell_rank_monthly": 491,
  "ec_description": "Named after the famed flower girl of Fado, this red is an elegant rendition highlighting vanilla, bright red plum, nuts and hint of blood orange. Truly a soft and easy-drinking charmer that is ideal for a variety of dishes from burgers to rare beef.",
  "cp_display_product_prices_deny": [
    "allow"
  ],
  "collection": "default",
  "qty_increments": 1,
  "indexeddate": 1789384588000,
  "lcbo_bintag_wine_tannins": 3,
  "filetype": "txt",
  "default_low_stock": "false",
  "sysclickableuri": "https://www.lcbo.com/en/julia-florista-red-532358",
  "sysfiletype": "txt",
  "language": [
    "English"
  ],
  "lcbo_total_volume": 750,
  "identifiableuri": "https://www.lcbo.com/en/julia-florista-red-532358",
  "default_stock": "true",
  "stores_inventory": "14",
  "lcbo_unit_volume_int": 750,
  "sysrowid": 1789384588053705437,
  "uri": "https://www.lcbo.com/en/julia-florista-red-532358",
  "lcbo_sugar_gm_per_ltr": 11.0,
  "syscollection": "default",
  "max_cart_qty": 9999,
  "lcbo_bottles_per_case": 12,
  "ec_overall_price": 132.0,
  "from_url": "https://www.lcbo.com/en/catalogsearch/result/#q=red&sort=relevancy&f:ec_price:range=[5,50]&f:@ec_rating=[4..4.9inc]&f:lcbo_alcohol_percent:range=[7,30]&f:lcbo_sugar_gm_per_ltr:range=[5,30]&f:@lcbo_current_offer=[On Sale]"
}
```

Each product record contains 80+ fields across multiple categories:

#### Product Identification

| Field | Meaning |
|---|---|
| `System Title` | Official LCBO product name |
| `Title` | Display title (may differ from system title) |
| `EC Name` | E-commerce platform product name |
| `Permanent ID` | Unique LCBO product identifier |
| `Primary ID` | Primary database record ID |
| `UPC Number` | Universal Product Code for retail identification |
| `System URI` | Internal system URL for the product |
| `Clickable URI` | Publicly accessible product page URL |
| `URI` | Full product page web address |

#### Pricing & Monetary

| Field | Meaning |
|---|---|
| `Final Price` | Current purchase price in CAD |
| `EC Price` | E-commerce display price |
| `EC Overall Price` | Normalized price across all SKUs |
| `Price Range` | Inferred min-max pricing (if applicable) |
| `Loyalty Points` | LCBO rewards points earned on purchase |

#### Ratings & Popularity

| Field | Meaning |
|---|---|
| `EC Rating` | Customer review rating (1-5 stars) |
| `Average Reviews` | Mean of all customer reviews |
| `View Rank Monthly` | Monthly popularity ranking |
| `View Rank Yearly` | Annual popularity ranking |
| `Sell Rank Monthly` | Monthly sales ranking |
| `Sell Rank Yearly` | Annual sales ranking |

#### Wine-Specific Attributes

| Field | Meaning | Example |
|---|---|---|
| `LCBO Wine Acidity` | Acidity level (low to high) | Medium, High |
| `LCBO Wine Sweetness` | Sweetness profile | Dry, Off-Dry, Semi-Sweet |
| `LCBO Wine Body` | Wine body classification | Light, Medium, Full |
| `LCBO Wine Flavor Intensity` | Intensity of flavors | Delicate, Medium, Powerful |
| `LCBO Wine Tannins` | Tannin structure (for red wines) | Soft, Balanced, Firm |
| `LCBO Tasting Notes` | Flavor descriptors and notes | "Cherry, oak, spice" |

#### Product Specifications

| Field | Meaning |
|---|---|
| `LCBO Alcohol Percentage` | Alcohol by volume (ABV %) |
| `LCBO Sugar Grams Per Liter` | Sugar content (residual sugar) |
| `LCBO Unit Volume` | Volume per single unit (e.g., 750 mL) |
| `LCBO Unit Volume Integer` | Volume as numeric value |
| `LCBO Total Volume` | Total volume if multi-pack |
| `LCBO Bottles Per Pack` | Units per package |
| `LCBO Bottles Per Case` | Units per case |
| `LCBO Selling Package Name` | Package description |
| `Size` | Standard size label (e.g., 750ml, 1.5L) |
| `System Size` | Internal size classification |

#### Inventory & Availability

| Field | Meaning |
|---|---|
| `Online Inventory` | Quantity available for online purchase |
| `Stores Inventory` | Quantity across Ontario retail stores |
| `Stores Stock` | Store-level stock availability |
| `Stores Stock Combined` | Aggregated store inventory count |
| `Stores Low Stock` | Flagged if below low-stock threshold |
| `Stores Low Stock Combined` | Combined low-stock indicator |
| `Out of Stock` | Boolean: product is unavailable |
| `Out of Stock Threshold` | Quantity at which item is marked out-of-stock |
| `Low Stock Threshold` | Quantity at which low-stock flag triggers |
| `Default Stock` | System-default stock value |
| `Default Low Stock` | System-default low-stock threshold |
| `Is Buyable` | Can the product be purchased online? |
| `LCBO Stock Type` | Inventory classification (e.g., permanent, seasonal) |

#### Categories & Classification

| Field | Meaning |
|---|---|
| `EC Category` | E-commerce category path |
| `EC Category Filter` | Faceted category filter tags |
| `LCBO VQA Code` | VQA (Vintners Quality Alliance) certification code |
| `LCBO Program` | Product program or initiative |
| `LCBO Region Name` | Geographic origin region |
| `Country of Manufacture` | Product source country |
| `Concepts` | Associated product concepts/themes |
| `System Concepts` | Internal concept classifications |
| `Common Tabs` | Product tab groupings |
| `Collection` | Collection or series grouping |

#### Operational & Technical

| Field | Meaning |
|---|---|
| `Created At` | Record creation timestamp |
| `Date` | Product availability date |
| `System Date` | System-recorded date |
| `Indexed Date` | Search index last updated |
| `System Indexed Date` | System index update timestamp |
| `Transaction ID` | Sales transaction identifier |
| `System Transaction ID` | Internal transaction tracking ID |
| `Ordering ID` | Customer order identifier |
| `Minimum Cart Quantity` | Minimum units required per order |
| `Quantity Increments` | Allowed purchase quantity steps |
| `Maximum Cart Quantity` | Maximum units allowed per order |

#### Content & Descriptions

| Field | Meaning |
|---|---|
| `Short Description` | Brief product summary |
| `EC Description` | E-commerce platform description |
| `EC Description` | Full product description |
| `Sanitized Description` | Cleaned HTML description text |
| `Word Count` | Total words in description |
| `LCBO Kosher` | Boolean: product is Kosher-certified |

#### System & Metadata

| Field | Meaning |
|---|---|
| `Language` | Content language code |
| `System Language` | System language setting |
| `Object Type` | Data record type |
| `Source` | Data source indicator |
| `System Source` | Internal data source |
| `Enabled` | Is the product actively listed? |
| `EC Visibility` | E-commerce visibility status |
| `File Type` | Data format classification |
| `System File Type` | Internal file type |
| `Row ID` | Database row identifier |
| `System Row ID` | Internal row tracking ID |
| `System URI Hash` | Hashed URI for deduplication |
| `URI Hash` | Public URI hash identifier |

***

### How to Use

#### Method 1: Scrape by URLs

1. **Find search URLs** — Navigate to LCBO.com, apply your desired filters (price, rating, alcohol %, etc.), and copy the full URL from your browser.
2. **Paste URLs** — Add one or more URLs to the `urls` array in your input configuration.
3. **Set limits** — Adjust `max_items_per_url` (e.g., `200` for comprehensive results).
4. **Enable failover** — Set `ignore_url_failures: true` for multi-URL runs.
5. **Run** — Start the scraper and monitor progress in the logs.

#### Method 2: Search by Filters

1. **Enter a keyword** — Specify a product type (e.g., `red`, `malbec`, `spirits`).
2. **Apply filters** — Set price range, minimum rating, alcohol %, sugar content, bottle size.
3. **Choose sort order** — Select relevancy, price, rating, or trending.
4. **Set item limit** — Define `max_items_per_url` for the search results.
5. **Run** — Execute the scraper; it will build and paginate the search automatically.

**Best practices:**

- For large datasets, use `max_items_per_url: 200` with `ignore_url_failures: true`
- Filter by price or rating to reduce noise and improve relevance
- Wine-specific searches: combine keyword with alcohol % and sugar content filters for precise results

***

### Use Cases & Business Value

- **Competitive pricing:** Track how competitors price similar wines and spirits
- **Market trends:** Identify popular products by region and category
- **Inventory insights:** Monitor stock availability across Ontario
- **Product recommendations:** Build datasets for recommendation engines
- **Wine analysis:** Extract tasting notes and characteristics for sommelier tools
- **Sales forecasting:** Analyze ratings and popularity trends to predict demand

The LCBO Product Search Scraper transforms unstructured product pages into queryable, actionable datasets that power business intelligence, retail analytics, and product discovery platforms.

***

### Conclusion

The **LCBO Product Search Scraper** delivers comprehensive product intelligence from Canada's largest alcohol retailer. With flexible search modes, advanced filtering, and access to 80+ rich data fields — including wine-specific attributes like acidity, tannins, and tasting notes — it's the fastest way to build alcohol product datasets. Start scraping today and unlock insights that manual browsing cannot provide.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `keyword` (type: `string`):

Enter the keyword to search for items

## `sort_by` (type: `string`):

Sort items by options

## `on_sale` (type: `boolean`):

If true, the scraper will only scrape items that are on sale.

## `price_range` (type: `string`):

Enter the price range to filter items by

## `rating` (type: `string`):

Enter the minimum star rating to filter items by

## `size` (type: `string`):

Enter the size to filter items by

## `alcoholic` (type: `string`):

Enter the alcoholic content to filter items by

## `sugar` (type: `string`):

Enter the sugar content to filter items by

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.lcbo.com/en/products/wine/red-wine#t=clp-products-wine-red_wine&sort=relevancy&layout=card"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "urls": [
        "https://www.lcbo.com/en/products/wine/red-wine#t=clp-products-wine-red_wine&sort=relevancy&layout=card"
    ],
    "ignore_url_failures": true,
    "on_sale": false,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/lcbo-product-search-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 = {
    "urls": ["https://www.lcbo.com/en/products/wine/red-wine#t=clp-products-wine-red_wine&sort=relevancy&layout=card"],
    "ignore_url_failures": True,
    "on_sale": False,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/lcbo-product-search-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.lcbo.com/en/products/wine/red-wine#t=clp-products-wine-red_wine&sort=relevancy&layout=card"
  ],
  "ignore_url_failures": true,
  "on_sale": false,
  "max_items_per_url": 20
}' |
apify call stealth_mode/lcbo-product-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stealth_mode/lcbo-product-search-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1c9gUO1qzbWK7cwLU/builds/eizDCMeVbbjALvxEh/openapi.json
