# Millesima Wine & Spirits Scraper - Prices & Critic Scores (`punkrecordsdata/millesima-wine-scraper`) Actor

Look up fine wines and spirits from Millesima.fr: real per-format prices, stock status, and every independent critic score (Wine Spectator, Decanter, James Suckling, Jancis Robinson, Vinous and more) with full tasting notes.

- **URL**: https://apify.com/punkrecordsdata/millesima-wine-scraper.md
- **Developed by:** [PunkRecordsData](https://apify.com/punkrecordsdata) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 wine records

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 & Spirits Scraper - Prices & Critic Scores

### What does Millesima Wine & Spirits Scraper do?

**Millesima Wine & Spirits Scraper** extracts data from [Millesima.fr](https://www.millesima.fr), a leading French fine wine merchant specializing in Bordeaux and Burgundy (plus a growing spirits selection). Give it a wine's URL, or a whole region/appellation page, and it returns **real per-format prices** (bottle, case, magnum...), stock status, and — the real differentiator — **every independent critic score Millesima republishes for that wine** (Wine Spectator, Decanter, James Suckling, Jancis Robinson, Vinous and more), each with the full tasting note. Those critic scores are normally locked behind paid subscriptions on the critics' own sites.

No login, no CAPTCHA. Runs on the Apify platform with API access, scheduling, monitoring and CSV/Excel/JSON export.

### Why use Millesima Wine & Spirits Scraper?

- **Fine wine investment & collecting** — pull every critic score for a wine in one call instead of paying for 5+ separate critic subscriptions.
- **Price monitoring** — track real per-format prices (single bottle vs. case vs. magnum) across vintages.
- **Wine list & catalog building** — populate a restaurant or retailer's wine list with real tasting notes and scores.
- **Market research** — scan an entire appellation (e.g. Pauillac, Cornas) for what's available and how it's rated.

### How to use Millesima Wine & Spirits Scraper

1. Go to the **Input tab** and paste one or more Millesima product URLs (e.g. `https://www.millesima.fr/chateau-lynch-bages-2010.html`), or a region/appellation page (e.g. `https://www.millesima.fr/bordeaux.html`) to pull every wine listed there.
2. Toggle **bottle formats & prices** and **critic scores** on or off — each is billed separately.
3. Click **Run**. Download results as JSON, CSV, or Excel from the dataset viewer.

### Input

- **Wine or spirit page URLs** — direct Millesima product pages.
- **Region / appellation page URLs** — category pages to crawl (pagination handled automatically).
- **Max Items** — cap on how many wines to process (10 on free plan).
- **Bottle formats & prices / Critic scores & tasting notes** — toggle which extra records to fetch per wine.

Example input:

```json
{
    "startUrls": [{ "url": "https://www.millesima.fr/chateau-lynch-bages-2010.html" }],
    "maxItems": 10,
    "includeVariants": true,
    "includeCriticScores": true
}
```

### Output

The dataset contains up to three record types per wine:

- **Wine record** — name, appellation, region, grape composition, alcohol, price range.
- **Variant price record** — one row per bottle format (single bottle, case of 6, magnum...) with real price and stock status.
- **Critic score record** — one row per independent critic score, with the full tasting note.

```json
{
    "recordType": "critic-score-record",
    "url": "https://www.millesima.fr/chateau-lynch-bages-2010.html",
    "productName": "Château Lynch-Bages 2010",
    "critic": "James Suckling",
    "score": "98/100",
    "tastingNote": "A beautifully elegant wine. Such finesse and airy quality for this estate..."
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data table

| Field | Description |
| --- | --- |
| `productName` | Wine or spirit name, including vintage |
| `appellation` / `region` / `vineyard` / `country` | Origin, from appellation up to country |
| `grapeVariety` | Grape composition (e.g. Cabernet Sauvignon/Merlot/Cabernet Franc/Petit Verdot) |
| `minPrice` / `maxPrice` | Real price range across all bottle formats (EUR) |
| `sku` / `format` / `bottleSizeCl` | Bottle-format identity (variant records) |
| `listPrice` / `offerPrice` / `inStock` / `stockStatus` | Real price and availability per format |
| `critic` / `criticAuthor` / `score` / `tastingNote` | Independent critic score and full tasting note (critic records) |

### Pricing / Cost estimation

This actor uses **Pay Per Event** pricing — you only pay for the record types you actually request. The **wine record** is the primary event; bottle-format prices and critic scores are optional add-ons, only charged when turned on.

A single wine typically has 1-3 bottle formats and 2-10 independent critic scores, so a run of 50 wines with both extras on usually costs the equivalent of 50 wine records plus a few hundred variant/critic records.

### Tips or Advanced options

- **Turn on only what you need** — each extra toggle is a separate billable event.
- **Use appellation/region pages for discovery** — you don't need to know exact wine names in advance; point the actor at a region page and it follows pagination automatically.
- **Schedule it** — combine with Apify scheduling to track price and critic-score changes over vintages.

### FAQ, disclaimers, and support

**Is this legal?** This actor only extracts publicly available product and review information already published by Millesima on its own product pages.

**Why do some wines have no critic scores?** Not every wine has been reviewed by every critic — the actor returns exactly what Millesima publishes for that specific wine, no invented data.

Found a bug or want extra fields? Open an issue in the Issues tab or contact us for a **custom scraper** tailored to your sourcing pipeline.

# Actor input Schema

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

Direct millesima.fr product page URLs (e.g. https://www.millesima.fr/chateau-lynch-bages-2010.html). Fastest way to look up specific wines.

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

millesima.fr category pages to crawl for wines (e.g. https://www.millesima.fr/bordeaux.html or https://www.millesima.fr/haut-medoc.html). Every wine listed on the category is looked up automatically, following pagination.

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

Cap on how many wines/spirits to process. Free users: limited to 10 (preview). Paid users: optional, up to 1,000,000.

## `includeVariants` (type: `boolean`):

Every bottle size Millesima sells this wine in (single bottle, case of 6, magnum...) with its own real price, SKU and stock status.

## `includeCriticScores` (type: `boolean`):

Every independent critic score Millesima republishes for this wine (Wine Spectator, Decanter, James Suckling, Jancis Robinson, Vinous, and more), each with the full tasting note text — usually paywalled on the critics' own sites.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.millesima.fr/chateau-lynch-bages-2010.html"
    }
  ],
  "maxItems": 10,
  "includeVariants": true,
  "includeCriticScores": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields: wine name, appellation, price range, top critic score

## `fullData` (type: `string`):

Complete dataset including bottle-format prices and every critic score

# 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/chateau-lynch-bages-2010.html"
        }
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("punkrecordsdata/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/chateau-lynch-bages-2010.html" }],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("punkrecordsdata/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/chateau-lynch-bages-2010.html"
    }
  ],
  "maxItems": 10
}' |
apify call punkrecordsdata/millesima-wine-scraper --silent --output-dataset

```

## MCP server setup

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