# LCBO Products Scraper — Ontario Wine, Beer & Spirits (`ocrad/lcbo-products-scraper`) Actor

Scrape LCBO.com (Ontario liquor board) products from any category or search URL: name, price, sale status, LCBO number, type, origin, producer, varietal, alcohol %, size, container, sugar, VQA, availability. English and French. Export JSON/CSV/Excel.

- **URL**: https://apify.com/ocrad/lcbo-products-scraper.md
- **Developed by:** [Ocrad](https://apify.com/ocrad) (community)
- **Categories:** E-commerce, Automation, Agents
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 records

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### LCBO Products Scraper

***

Ontario Wine, Beer & Spirits. Provide any LCBO.com category or search URL (English `/en/` or French `/fr/`) and get the product catalog as structured data: price and sale status, LCBO number, type, origin, producer, varietal, alcohol %, size and container, sugar content, VQA / Made in Ontario badges and availability.

***

#### **📋 Example Output**

```json
{
  "id": "55014",
  "lcboNumber": "55014",
  "url": "https://www.lcbo.com/en/stonebridge-chardonnay-estate-55014",
  "title": "Stonebridge Chardonnay Estate",
  "price": 48.95,
  "currency": "CAD",
  "regularPrice": 48.95,
  "isOnSale": false,
  "saleEndsAt": null,
  "category": "Wine > White Wine",
  "productType": "White Wine",
  "country": "Ontario",
  "region": null,
  "producer": "STONEBRIDGE",
  "grapeVarietal": "Chardonnay",
  "alcoholPct": 13,
  "volume": "750 ml",
  "container": "bottle",
  "packaging": "750 ml bottle",
  "sugarContent": "2 g/L",
  "program": "LCBO",
  "vqa": true,
  "organic": null,
  "kosher": null,
  "score": null,
  "releaseDate": null,
  "availability": "In stock",
  "imageUrl": "https://aem.lcbo.com/content/dam/lcbo/products/0/5/5/0/055014.jpg.thumb.319.319.png",
  "rating": null,
  "reviewCount": 0,
  "upc": null,
  "description": "Hand-harvested Chardonnay grapes from Stonebridge Estate are vinified in oak with minimal intervention and matured for almost two years in new and used French oak barrels. It unfolds with aromas of apple, citrus and spice, leading to a creamy palate of ripe orchard fruit, spice and vanilla with a vibrant finish.",
  "madeIn": "Ontario",
  "badges": "VQA Wines, Made In Ontario",
  "storeAvailability": "24 available in store now | 24 available for shipping",
  "language": "en",
  "scrapedAt": "2026-10-28T20:12:37.686Z"
}
```

#### ⚙️ **Configuration**

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `url` | String | *(required)* | LCBO.com category or search URL, e.g. `https://www.lcbo.com/en/products/wine/red-wine` or `https://www.lcbo.com/en/catalogsearch/result/?q=prosecco`. |
| `maxItems` | Integer | `100` | Maximum number of products to return (0 = whole category/search; up to 96 products per listing request). |
| `detailedInfo` | Boolean | `true` | Visit each product page for alcohol %, made in, sugar, varietal, release date, badges, size and store stock. Keep it on: the listing API only returns these attributes for a few products. |
| `proxyConfiguration` | Object | Apify Proxy (auto) | Proxy settings; switch to RESIDENTIAL only if results are empty. |

##### Example Input

```json
{
  "url": "https://www.lcbo.com/en/products/wine/red-wine",
  "maxItems": 200,
  "detailedInfo": true
}
```

##### Getting your category or search URL

1. Open LCBO.com in English or French and browse to a category (Wine, Beer, Spirits, Cider, Ready to Drink…) or type a search keyword
2. Copy the full URL from your browser address bar (e.g. `https://www.lcbo.com/en/products/wine/red-wine`)
3. Paste it as the `url` input — filters set in the page (price, country…) are not applied; narrow down with a sub-category or a search keyword instead

Available top-level categories: `products/wine`, `products/beer`, `products/spirits`, `products/cider`, `products/ready-to-drink`, `products/non-alcoholic`, `products/gifts-entertaining`. `country` and `madeIn` carry the "Made In" value shown on the product page (a country or a region such as Ontario). `storeAvailability` reflects the store the website selects by default.

***

#### 💬 **Support and Feedback**

Reach out via Apify support channels or leave feedback on the Actor's page.

#### **Is it legal to scrape LCBO.com data?**

It is legal to scrape publicly available data such as product names, prices and attributes. The results do not contain personal data. Respect LCBO's terms of use and your local regulations — consult your legal advisor if unsure.

# Actor input Schema

## `url` (type: `string`):

An LCBO.com category or search URL (English /en/ or French /fr/), e.g. https://www.lcbo.com/en/products/wine/red-wine or https://www.lcbo.com/en/catalogsearch/result/?q=prosecco.

## `maxItems` (type: `integer`):

Maximum number of products to return (0 = the whole category/search, up to 96 products per request).

## `detailedInfo` (type: `boolean`):

Visit each product page for the 'More Details' table (alcohol %, made in, sugar, varietal, release date), VQA / Made in Ontario badges, size and store availability. Keep it on: the listing API returns the LCBO attributes for only a few products. One extra request per product.

## `proxyConfiguration` (type: `object`):

Proxy settings. Defaults to Apify Proxy (auto). Switch to RESIDENTIAL only if results are empty.

## Actor input object example

```json
{
  "url": "https://www.lcbo.com/en/products/wine",
  "maxItems": 24,
  "detailedInfo": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `id` (type: `string`):

LCBO product number (SKU)

## `lcboNumber` (type: `string`):

LCBO / VINTAGES product number (same as id)

## `url` (type: `string`):

Product page URL

## `title` (type: `string`):

Product name

## `price` (type: `string`):

Current price (number, CAD)

## `currency` (type: `string`):

Currency (CAD)

## `regularPrice` (type: `string`):

Regular price before discount (number, CAD)

## `isOnSale` (type: `string`):

true when the current price is below the regular price

## `saleEndsAt` (type: `string`):

End date of the limited-time offer, when on sale

## `category` (type: `string`):

Category path, e.g. Wine > Red Wine

## `productType` (type: `string`):

Product type (deepest product category), e.g. Red Wine

## `country` (type: `string`):

Country / origin

## `region` (type: `string`):

Region of origin

## `producer` (type: `string`):

Producer name

## `grapeVarietal` (type: `string`):

Grape variety(ies)

## `alcoholPct` (type: `string`):

Alcohol percentage by volume (number)

## `volume` (type: `string`):

Unit volume, e.g. 750 ml

## `container` (type: `string`):

Container type, e.g. bottle, can

## `packaging` (type: `string`):

Selling unit as displayed, e.g. 6 x 355 mL can

## `sugarContent` (type: `string`):

Residual sugar, e.g. 5 g/L

## `program` (type: `string`):

LCBO program(s), e.g. Vintages, LCBO

## `vqa` (type: `string`):

true for VQA Ontario wines

## `organic` (type: `string`):

true for organic products

## `kosher` (type: `string`):

true for kosher products

## `score` (type: `string`):

Critic score when available

## `releaseDate` (type: `string`):

Vintages release date

## `availability` (type: `string`):

Online stock status: In stock / Out of stock

## `imageUrl` (type: `string`):

Main product image URL

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

Average customer rating (0-5)

## `reviewCount` (type: `string`):

Number of customer reviews

## `upc` (type: `string`):

UPC / barcode

## `description` (type: `string`):

Product description / tasting notes (text)

## `madeIn` (type: `string`):

Made In value from the product page (detail)

## `badges` (type: `string`):

Product badges, e.g. VQA Wines, Made In Ontario (detail)

## `storeAvailability` (type: `string`):

Stock lines shown on the product page for the default store (detail)

## `language` (type: `string`):

Language of the labels: en or fr

## `scrapedAt` (type: `string`):

ISO 8601 timestamp when the record was scraped

# 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 = {
    "url": "https://www.lcbo.com/en/products/wine",
    "maxItems": 24,
    "detailedInfo": true,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ocrad/lcbo-products-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 = {
    "url": "https://www.lcbo.com/en/products/wine",
    "maxItems": 24,
    "detailedInfo": True,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("ocrad/lcbo-products-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 '{
  "url": "https://www.lcbo.com/en/products/wine",
  "maxItems": 24,
  "detailedInfo": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call ocrad/lcbo-products-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ocrad/lcbo-products-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/pywE4SI0vPydEM4W9/builds/AzwuMEXSg7Z6wBlHh/openapi.json
