# Millesima Wine Scraper - Prices & Critic Ratings (`mrbridge/millesima-wine-scraper`) Actor

Scrape Millesima.fr for Bordeaux and Burgundy wines: per-bottle and per-case prices, vintage, appellation, producer, stock status and critic ratings from 18 publications including Robert Parker, Wine Spectator and Decanter. En primeur pricing is covered for recent vintages. By MrBridge

- **URL**: https://apify.com/mrbridge/millesima-wine-scraper.md
- **Developed by:** [MrBridge](https://apify.com/mrbridge) (community)
- **Categories:** E-commerce, Automation
- **Features:** Limited permissions
- **Stats:** 18 total users, 0 monthly users, 93.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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?

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

## Millesima Wine Scraper

[![Watch the Millesima Wine Scraper video walkthrough](https://img.youtube.com/vi/hj0YdM2GWSE/maxresdefault.jpg)](https://youtu.be/hj0YdM2GWSE)

Extract wine data from [Millesima.fr](https://www.millesima.fr), one of Europe's leading online wine merchants. Get prices, vintages, critic ratings (Robert Parker, Wine Spectator, Decanter), appellations, and regions for thousands of wines.

**No login required, no API key, no coding.** Click "Try for free" and start extracting wine data.

### What does this scraper do?

Millesima Wine Scraper pulls wine data from Millesima.fr, including critic scores from 18 wine publications. It crawls product pages and returns one structured row per wine, with the producer, vintage, region, price and ratings as separate fields.

**Key features:**

- **Critic ratings**: Robert Parker, Wine Spectator, Decanter, James Suckling, Jeb Dunnuck, Vinous, Neal Martin, Antonio Galloni
- **Complete data**: name, per-bottle and per-case prices, vintage, region, appellation, producer, color, alcohol, classification, stock status, image
- **Input options**: start from any category page or use the default all-wines URL
- **Pagination**: automatically crawls multiple pages per category
- **Export**: JSON, CSV, Excel, XML

### Quick start: test in 60 seconds

1. Click **"Try for free"** on the [Millesima Wine Scraper](https://apify.com/mrbridge/millesima-wine-scraper) page
2. Keep the prefilled **maxItems** of 100 for a quick first test, or clear the field to extract every wine reachable from your start URLs (bounded by your per-run spending limit)
3. Click **"Start"**
4. Download your data from the **Dataset** tab in JSON, CSV, or Excel format

### Which wine scraper should I use?

| Need | Best scraper | What it does |
|------|-----------|-------------|
| Critic ratings (Parker, Spectator, Decanter...) | **Millesima Wine Scraper** (this one) | Prices + scores from 18 major critics |
| Community ratings & taste profiles | [Vivino Wine Scraper](https://apify.com/mrbridge/vivino-powerful-scraper) | Browse Vivino wines by region |
| Look up specific wines by name/URL | [Vivino Wine Data Scraper](https://apify.com/mrbridge/vivino-wine-data-scraper) | Search Vivino by wine name or URL |
| Grape popularity, scores & prices | [Wine-Searcher Grape Scraper](https://apify.com/mrbridge/wine-searcher-grape-scraper) | Popularity, scores & prices by grape variety on Wine-Searcher |

### Why scrape Millesima.fr?

Millesima is a major online wine retailer specializing in **fine wines and en primeur offerings**. The site contains:

- Thousands of wines with verified critic scores from top publications
- En primeur pricing for recent Bordeaux and Burgundy vintages
- Historical price data across multiple vintages

Here are common use cases:

- **Price monitoring**: track wine prices across vintages and appellations
- **Investment analysis**: compare critic ratings to identify undervalued wines
- **Market research**: analyze pricing trends by region, vintage, or producer
- **Inventory sourcing**: find wines matching specific rating and price criteria
- **Collection management**: build a database with critic scores for your cellar

### How do I scrape Millesima?

1. Click **"Try for free"** above to open the Actor
2. Optionally change the **start URLs** to target a specific region (e.g., Bordeaux, Bourgogne)
3. Set **maxItems** to limit the number of wines extracted
4. Click **"Start"** to begin extraction
5. When finished, download your data from the **Dataset** tab in JSON, CSV, or Excel format

### What data can you extract?

| Field | Type | Description |
|-------|------|-------------|
| `name` | string | Full wine name including château/domaine |
| `priceMin` | number | Cheapest available format in EUR TTC (typically the single bottle) |
| `priceMax` | number | Most expensive format in EUR TTC (typically the full case) |
| `vintage` | integer | Production year |
| `region` | string | Wine region (Bordeaux, Bourgogne, and more) |
| `subRegion` | string | Sub-region (e.g. Côte de Beaune) |
| `appellation` | string | Appellation d'origine |
| `producer` | string | Producer / château / domaine |
| `country` | string | Country of origin |
| `color` | string | Rouge, Blanc, Rosé, Effervescent or Champagne |
| `alcohol` | number | Alcohol content (% vol) |
| `classification` | string | Classification (1er cru, Grand cru, and more) |
| `farming` | string | Farming / certification (organic, biodynamic, and more) |
| `inStock` | boolean | Whether at least one format is in stock |
| `availability` | string | Earliest deliverable date across formats (today for in-stock wines) |
| `description` | string | Millesima's short tasting note (French) |
| `imageUrl` | string | Bottle image URL (Millesima CDN) |
| `partNumber` | string | Millesima SKU |
| `ratings` | object | Critic scores keyed by critic name (Parker, Wine Spectator, and more) |
| `formats` | array | One entry per purchasable format (bottle, case...) with its own `listPrice`, `offerPrice`, `availability`, `inStock` and `promotion` |
| `promotion` | boolean | Whether the wine is currently on promotion |
| `productType` | string | Product type as labeled by Millesima (Vin, and more) |
| `exclusiveCellar` | boolean | Part of Millesima's exclusive cellar selection |
| `isSpirit` | boolean | Whether the product is a spirit rather than a wine |
| `url` | string | Direct link to product page |

Note for v2.x users: the former `price` field was split into `priceMin` and `priceMax` in v3.0.0. The old value corresponded to the case price for most wines, which `priceMax` now surfaces explicitly.

### About this Actor

Maintained by **MrBridge**. See [Millesima scraper details](https://mr-bridge.com/solutions/millesima-wine-scraper) or the [full scraper lineup](https://mr-bridge.com/scrapers). For context on where wine prices and ratings come from, read [The Wine Data Landscape](https://mr-bridge.com/articles/wine-data-landscape-prices-ratings).

### How do I configure the scraper?

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | array | All wines page | URLs to start scraping from |
| `maxItems` | integer | 100 prefilled in Console, unlimited via API | Maximum wines to extract (empty or 0 = no limit) |
| `maxPagesPerCategory` | integer | unlimited | Maximum pages per start URL (empty or 0 = every page) |
| `proxyConfiguration` | object | No proxy | Proxy settings |

#### Example input

```json
{
    "startUrls": [
        { "url": "https://www.millesima.fr/bordeaux.html" },
        { "url": "https://www.millesima.fr/bourgogne.html" }
    ],
    "maxItems": 500,
    "maxPagesPerCategory": 20
}
```

### Output example

```json
{
    "name": "Louis Latour : Aloxe-Corton 1er cru \"Les Chaillots\" 2018",
    "priceMin": 82,
    "priceMax": 480,
    "vintage": 2018,
    "region": "Bourgogne",
    "subRegion": "Côte de Beaune",
    "appellation": "Aloxe-Corton",
    "producer": "Louis Latour",
    "country": "France",
    "color": "Rouge",
    "alcohol": 13.5,
    "classification": "1er cru",
    "farming": "Agriculture Raisonnée",
    "inStock": true,
    "availability": "2026-07-27",
    "description": "Un 1er Cru charpenté aux notes de cerise confite, d'épices douces et de sous-bois",
    "imageUrl": "https://static.millesima.com/s3/attachements/h280px/E054_2015NM_c.png",
    "partNumber": "E054/18",
    "ratings": {
        "Robert Parker": "88",
        "Jancis Robinson": "16.5",
        "Wine Spectator": "89",
        "James Suckling": "92",
        "Allen Meadows": "88",
        "Wine Decider": "90"
    },
    "formats": [
        {
            "label": "1 Bouteille (75cl)",
            "partNumber": "E054/18/CU/CC/1",
            "listPrice": 82,
            "offerPrice": 82,
            "availability": "2026-07-27",
            "inStock": true,
            "promotion": false
        },
        {
            "label": "Un carton de 6 Bouteilles (75cl)",
            "partNumber": "E054/18/C/CC/6",
            "listPrice": 480,
            "offerPrice": 480,
            "availability": "2026-07-27",
            "inStock": true,
            "promotion": false
        }
    ],
    "promotion": false,
    "productType": "Vin",
    "exclusiveCellar": false,
    "isSpirit": false,
    "url": "https://www.millesima.fr/louis-latour-aloxe-corton-1er-cru-les-chaillots-2018.html"
}
```

### How much does it cost to scrape Millesima?

Millesima Wine Scraper uses Apify's pay-per-event pricing. Each wine successfully delivered to the default dataset is billed as one result event. Failed pages go to the `run-errors` key-value store instead, so they do not create result charges. If a run returns no wines, there are no result charges.

The price per wine depends on your Apify subscription tier, and the Actor reads it at runtime. Apify currently bills platform usage separately from result events. The [Pricing tab](https://apify.com/mrbridge/millesima-wine-scraper/pricing) shows the current event rate and the separate usage component.

Set **Max cost per run** in the run options to cap one run. Apify enforces that limit, and the scraper stops delivering wines when it is reached.

### Which wine critics are included?

The scraper extracts scores from these major wine publications:

| Abbreviation | Critic |
|-------------|--------|
| RP | Robert Parker (Wine Advocate) |
| WS | Wine Spectator |
| DE | Decanter |
| JS | James Suckling |
| JR | Jancis Robinson |
| JD | Jeb Dunnuck |
| NM | Neal Martin (Vinous) |
| VG | Antonio Galloni (Vinous) |
| AM | Allen Meadows (Burghound) |
| BD | Bettane & Desseauve |
| FIG | Le Figaro |
| RVF | Revue du Vin de France |
| RG | René Gabriel |
| JMQ | Jean-Marc Quarin |
| WE | Wine Enthusiast |
| WD | Wine Decider |
| ama | Alexandre Ma |
| twi | The Wine Independent |

### Tips for best results

1. **Start with a specific region**: targeting one region is faster than scraping all wines
2. **Test with a small maxItems first**: use 50-100 to verify results before large runs
3. **Use `maxPagesPerCategory`** to sample the first pages of several categories instead of exhausting one
4. **Full-category runs**: clear the prefilled `maxItems` (and leave `maxPagesPerCategory` empty) and the Actor crawls the whole category (a region like Bourgogne yields 3,000+ wines). Check your per-run spending limit covers it, and raise the run timeout if you use residential proxies
5. **Schedule regular runs**: wine prices change frequently, especially for en primeur

### More wine data tools

- [AI wine pairing with Vivino ratings](https://apify.com/mrbridge/vivino-mcp-server): ask Claude or ChatGPT for wines by rating, price or style, and get pairing ideas for a meal or a budget.
- [Vivino ratings and reviews scraper](https://apify.com/mrbridge/vivino-wine-data-scraper): ratings, prices, taste profiles and reviews for a list of wines, by name or by Vivino URL.
- [Vivino wine ratings and prices by region](https://apify.com/mrbridge/vivino-powerful-scraper): every wine of a Vivino region or producer page, with ratings, prices, vintages and taste profiles.
- [Wine-Searcher scraper from a list](https://apify.com/mrbridge/wine-searcher-scraper-from-list): critic scores, cheapest prices and merchants for your own list of wines and spirits.
- [wine prices by region and appellation](https://apify.com/mrbridge/wine-searcher-region-scraper): popularity rank, critic score and average price for the wines of a region or appellation.
- [wine prices by grape variety](https://apify.com/mrbridge/wine-searcher-grape-scraper): popularity, critic scores and prices for any of the 1,054 grape varieties on Wine-Searcher.

### FAQ

#### How often is Millesima data updated?

Millesima updates prices and inventory regularly. For the most current data, run the scraper weekly or set up a scheduled run via the Apify platform.

#### Can I scrape specific wine regions only?

Yes. Change the `startUrls` parameter to target a specific category URL like `https://www.millesima.fr/bordeaux.html` or `https://www.millesima.fr/bourgogne.html`.

#### What if a wine has no critic rating?

Wines without critic scores have `ratings: null`. Not all wines on Millesima have been reviewed by all critics.

#### Is the data exported in English or French?

Wine names, regions, and appellations are in their original French form as displayed on Millesima.fr.

#### Can I schedule automated runs?

Yes. Use the Apify platform's scheduling feature to run the scraper daily, weekly, or at any custom interval. Combined with webhooks or integrations (Zapier, Make), you can automate your wine data pipeline.

### Is it legal to scrape Millesima?

This scraper only extracts publicly available data that any visitor can see on Millesima.fr: wine prices, vintages, critic ratings, and product descriptions. It does not access private accounts, bypass authentication, or extract personal user data.

When used for legitimate purposes such as market research, price comparison, or wine collection management, web scraping of publicly available data is generally considered acceptable. However, scraped data may be subject to Millesima's Terms of Service and applicable data protection regulations (GDPR in the EU).

Always use scraped data responsibly and in compliance with your local laws.

### Integrate into your workflow

#### API integration

Call this actor programmatically using the [Apify API](https://docs.apify.com/api/v2). Get your API token from [Settings → Integrations](https://console.apify.com/settings/integrations).

**cURL:**

```bash
curl "https://api.apify.com/v2/acts/mrbridge~millesima-wine-scraper/run-sync-get-dataset-items" \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -d '{
    "startUrls": [{"url": "https://www.millesima.fr/bordeaux.html"}],
    "maxItems": 100
  }'
```

**Node.js:**

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('mrbridge/millesima-wine-scraper').call({
    startUrls: [{ url: 'https://www.millesima.fr/bordeaux.html' }],
    maxItems: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Found ${items.length} wines with critic ratings`);
```

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("mrbridge/millesima-wine-scraper").call(run_input={
    "startUrls": [{"url": "https://www.millesima.fr/bordeaux.html"}],
    "maxItems": 100,
})

for wine in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{wine['name']} - {wine['priceMin']}€ - {wine.get('ratings') or {}}")
```

#### Scheduled runs: track prices over time

1. Create a **Task** with your saved input (region URLs, max items)
2. Go to the **Schedules** tab → Create schedule
3. Set a cron expression, e.g. `0 8 * * 1` for every Monday at 8 AM UTC

#### No-code integrations

| Platform | What it does | Setup |
|----------|-------------|-------|
| **[Google Sheets](https://docs.apify.com/platform/integrations)** | Export wine data to a Google Sheet automatically | Integrations tab → Google Drive |
| **[Airtable](https://docs.apify.com/platform/integrations/airtable)** | Sync wines to an Airtable base with field mapping | Integrations tab → Airtable |
| **[Zapier](https://docs.apify.com/platform/integrations/zapier)** | Trigger Zaps on run completion → push to 5,000+ apps | Apify Zapier connector |
| **[Make](https://docs.apify.com/platform/integrations/make)** | Visual workflows: scrape → transform → insert into DB | Apify Make module |
| **[n8n](https://docs.apify.com/platform/integrations/n8n)** | Self-hosted workflow automation with Apify trigger node | Apify n8n community node |

#### Integrate with Zapier, Make or n8n

- **Zapier**: Add "Apify" trigger → "Run Actor" with Actor ID `YYFcotMx2QaXrWa0r`
- **Make**: Add "Apify" module → "Run an Actor" with Actor ID `YYFcotMx2QaXrWa0r`
- **n8n**: Use the [Apify n8n node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.apify/) or HTTP Request: `POST https://api.apify.com/v2/acts/mrbridge~millesima-wine-scraper/runs?token=YOUR_APIFY_TOKEN`

***

### Support

Having issues? Open an issue on the [Issues tab](https://console.apify.com/actors/YYFcotMx2QaXrWa0r/issues) or contact us through Apify support.

# Changelog

This Actor's version history is a separate document: https://apify.com/mrbridge/millesima-wine-scraper/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

URLs to start scraping from. Default is the main wine catalog page.

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

Maximum number of wines to scrape. Prefilled at 100 so a first run finishes in under a minute. Clear the field (or set 0) for no limit: the run then extracts every wine reachable from your start URLs, bounded only by your Apify spending limit per run.

## `maxPagesPerCategory` (type: `integer`):

Maximum number of listing pages to crawl per start URL. Leave empty (or 0) to crawl every page of the category.

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

Proxy settings. **Leave OFF unless you specifically need IP rotation.** The Actor's own outbound IP works fine for Millesima, so no proxy is needed. ⚠️ Millesima rejects Apify Proxy datacenter IPs with HTTP 403. If you enable proxy, the Actor will automatically use the RESIDENTIAL pool (the only one that works); choosing another group manually will likely fail.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.millesima.fr/tous-nos-vins.html"
    }
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `datasetJsonDownload` (type: `string`):

Direct JSON download with all extracted wines.

## `datasetCsvDownload` (type: `string`):

Direct CSV download, opens in Excel, Google Sheets, and more.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.millesima.fr/tous-nos-vins.html"
        }
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrbridge/millesima-wine-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 = {
    "startUrls": [{ "url": "https://www.millesima.fr/tous-nos-vins.html" }],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("mrbridge/millesima-wine-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 '{
  "startUrls": [
    {
      "url": "https://www.millesima.fr/tous-nos-vins.html"
    }
  ],
  "maxItems": 100
}' |
apify call mrbridge/millesima-wine-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrbridge/millesima-wine-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/YYFcotMx2QaXrWa0r/builds/p4fQifRIIJCbbYcjj/openapi.json
