# Medi-Market Scraper — Belgian Parapharmacy Products & Prices (`studio-amba/medi-market-scraper`) Actor

Scrape product listings, prices, stock, EAN and CNK pharmacy codes from Medi-Market.be, Belgium's parapharmacy chain. No login required.

- **URL**: https://apify.com/studio-amba/medi-market-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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

## Medi-Market Scraper — Belgian Parapharmacy Products & Prices

Scrape product data from Medi-Market.be, a Belgian parapharmacy chain covering beauty, skincare, health supplements, baby care and everyday pharmacy products. Get structured data including prices, discounts, stock levels, EAN barcodes and CNK pharmacy codes.

### How to scrape Medi-Market data

Enter a search keyword or a category URL, pick a language, and the scraper returns structured product records. No login or cookies required.

#### What is Medi-Market?

Medi-Market is a Belgian parapharmacy chain selling beauty, skincare, health, baby and household products online and in-store, serving both the Dutch- and French-speaking communities. Products carry a CNK code — the same product identifier Belgian pharmacists use — alongside the standard EAN barcode.

Who uses this scraper:

- **Price comparison platforms** — track parapharmacy pricing across skincare, supplements and personal care to power comparison features.
- **Brand managers & manufacturers** — monitor how your products are priced and promoted at a major Belgian parapharmacy, and detect unauthorized discounting.
- **Pharmacy & beauty retailers** — Medi-Market is a pricing benchmark for the Belgian parapharmacy and drugstore market; know when they run promotions.
- **Market researchers** — analyze category sizes, brand representation and discount patterns in Belgian parapharmacy retail.

#### Search by keyword

The fastest way to find specific products:

```json
{
    "searchQuery": "vitamine c",
    "language": "nl",
    "maxResults": 100
}
```

```json
{
    "searchQuery": "vitamine c",
    "language": "fr",
    "maxResults": 100
}
```

#### Browse a category

Scrape an entire product category. Grab category URLs from medi-market.be navigation — the numeric id after `/c/` is what the scraper reads:

```json
{
    "categoryUrl": "https://medi-market.be/nl/lichaam-en-gezicht/c/2220",
    "maxResults": 200
}
```

If a `categoryUrl` is provided, it takes priority over `searchQuery`.

**Tip:** Medi-Market's catalog runs to a few thousand products per top-level category. Target a specific subcategory (visible in the site's left-hand filter panel) for focused scraping, or a parent category for broader coverage. Results are capped at 2000 per query — Medi-Market's own search pagination ceiling.

#### Choose your language

Medi-Market serves both Belgian language communities from the same catalog. Use `language` to read the Dutch (`nl`) or French (`fr`) product names and descriptions:

```json
{
    "searchQuery": "creme solaire",
    "language": "fr",
    "maxResults": 50
}
```

### What data does Medi-Market Scraper extract?

| Field | Type | Description |
|-------|------|-------------|
| `name` | String | Full product title |
| `brand` | String | Brand or manufacturer name |
| `price` | Number | Current selling price in EUR |
| `currency` | String | Always `"EUR"` |
| `originalPrice` | Number | Reference/pre-discount price, when higher than the selling price |
| `discountPercentage` | Integer | Discount percentage off the reference price |
| `ean` | String | 13-digit EAN barcode |
| `cnk` | String | Belgian pharmacy product code (CNK) |
| `sku` | String | Medi-Market internal product code |
| `inStock` | Boolean | Online stock status (null when the source carries no stock signal) |
| `stockLevel` | Integer | Reported stock quantity, when available |
| `url` | String | Full product page URL |
| `imageUrl` | String | Primary product image URL |
| `description` | String | Short product description |
| `category` | String | Deepest category in the breadcrumb |
| `categories` | Array | Full category breadcrumb path |

### Output

A realistic Medi-Market product record:

```json
{
    "name": "Eucerin Hyaluron-Filler +3x Effect Dagcrème SPF 30 50ml",
    "brand": "Eucerin",
    "price": 26.24,
    "currency": "EUR",
    "sku": "115062",
    "url": "https://medi-market.be/nl/c/eucerin-hyaluron-filler-3x-effect-dagcreme-spf-30-50ml/p/115062",
    "scrapedAt": "2026-09-16T19:45:51.137Z",
    "originalPrice": 44.95,
    "discountPercentage": 42,
    "ean": "4005800294945",
    "cnk": "4286712",
    "inStock": true,
    "stockLevel": 2214,
    "imageUrl": "https://medias.medi-market.be/sys-master/products/51700-nl/51700-nl.jpg?timestamp=1753170734113",
    "description": "Hydraterende anti-aging dagcrème. Diepe hydratatie van de huid. Combinatie van hyaluronzuur dat rimpels vermindert.",
    "category": "Eucerin Hyaluron-Filler",
    "categories": ["Aanbiedingen", "Anti-aging dagverzorging", "Eucerin Hyaluron-Filler"]
}
```

### How much does it cost?

| Scenario | Estimated cost |
|----------|---------------|
| 100 products (search) | ~$0.01 |
| 500 products (category) | ~$0.03 |
| 2,000 products (full category) | ~$0.10 |

Medi-Market Scraper reads the site's own product search index directly over plain HTTP — no browser is launched and each request returns up to 200 products, keeping the cost per result very low.

Note: a run's usage cost only settles after the run reports SUCCEEDED — the final amount can differ slightly from the live estimate shown while the run is in progress.

### Can I integrate?

Connect Medi-Market data to your tools:

- **Google Sheets** — track Belgian parapharmacy prices in a spreadsheet
- **Webhooks** — trigger alerts when promotions start or prices drop
- **Zapier / Make** — build automated workflows around price changes
- **Slack** — daily notifications on category price changes
- **Amazon S3 / Google Cloud Storage** — archive weekly pricing snapshots
- **PostgreSQL / MySQL** — feed data into your analytics database

### Can I use it as an API?

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("studio-amba/medi-market-scraper").call(run_input={
    "searchQuery": "vitamine c",
    "language": "nl",
    "maxResults": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    price_info = f"EUR {item['price']}"
    if item.get('originalPrice'):
        price_info += f" (was EUR {item['originalPrice']})"
    print(f"{item['brand']} - {item['name']} -- {price_info}")
```

#### JavaScript

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

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

const run = await client.actor('studio-amba/medi-market-scraper').call({
    searchQuery: 'vitamine c',
    language: 'nl',
    maxResults: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => {
    const sale = item.originalPrice ? ` (was EUR ${item.originalPrice})` : '';
    console.log(`${item.brand} - ${item.name} -- EUR ${item.price}${sale}`);
});
```

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQuery` | String | `"vitamine c"` | Search for products by keyword |
| `categoryUrl` | String | | A Medi-Market category page URL to scrape |
| `language` | String | `"nl"` | Which catalog to read: `"nl"` (Dutch) or `"fr"` (French) |
| `maxResults` | Integer | `100` | Maximum number of products to return (max 2000) |
| `proxyConfiguration` | Object | Apify automatic proxy | Proxy settings — Medi-Market showed no anti-bot protection during testing, so the automatic/free pool is the default |

### FAQ

**Does this scrape the Dutch or French Medi-Market catalog?**
Both. Use the `language` input to select `"nl"` for Dutch product names and descriptions or `"fr"` for French. The underlying catalog and prices are the same, only the language differs.

**How do I find the right category URL?**
Browse medi-market.be, navigate to the category you want, and copy the URL from your browser's address bar (for example `https://medi-market.be/nl/lichaam-en-gezicht/c/2220`). The scraper reads the numeric id after `/c/`.

**What is the CNK code?**
CNK ("Code National / Nationale Kode") is the identifier Belgian pharmacists and pharmacies use to reference a product, alongside the EAN barcode. It's included on nearly every Medi-Market product.

**Can I track promotions and discounts?**
Yes. `originalPrice` and `discountPercentage` are populated whenever a product is discounted against Medi-Market's reference price.

**Are results limited?**
Yes, to 2000 products per search or category — this matches the pagination ceiling on Medi-Market's own search results.

### Limitations

- Product data is read from Medi-Market's own product search index. If Medi-Market changes its catalog structure, some fields may temporarily return empty.
- Ratings and review counts are not available from the source and are not included in the output.
- Very large category scrapes are capped at 2000 products, matching Medi-Market's own search pagination limit.
- Data reflects the public storefront and may change without notice.

### Other pharmacy and health scrapers

Build comprehensive Belgian and European pharmacy/health intelligence:

- [Newpharma Scraper](https://apify.com/studio-amba/newpharma-scraper) — Belgian online pharmacy
- [Multipharma Scraper](https://apify.com/studio-amba/multipharma-scraper) — Belgian pharmacy network
- [Farmaline Scraper](https://apify.com/studio-amba/farmaline-scraper) — Belgian online pharmacy
- [Apotheek Scraper](https://apify.com/studio-amba/apotheek-scraper) — Belgian pharmacy products
- [Kruidvat Scraper](https://apify.com/studio-amba/kruidvat-scraper) — Benelux drugstore chain
- [Pharmacy Price Comparison](https://apify.com/studio-amba/pharmacy-price-comparison) — cross-pharmacy price tracking

### Your feedback

Found an issue or want a new feature? Let us know through the Apify Store actor page. We fix bugs quickly and actively maintain this scraper.

# Actor input Schema

## `searchQuery` (type: `string`):

Search for products by keyword (Dutch or French). Used when no categoryUrl is provided.

## `categoryUrl` (type: `string`):

A Medi-Market category page URL to scrape, e.g. https://medi-market.be/nl/lichaam-en-gezicht/c/2220. Takes priority over searchQuery when set.

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

Which language catalog to read: Dutch (nl) or French (fr). Medi-Market serves both Belgian communities under the same catalog.

## `maxResults` (type: `integer`):

Maximum number of products to return. Hard-capped at 2000 (Medi-Market's own search pagination ceiling).

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

Medi-Market's product API showed no anti-bot protection during testing (plain HTTP, no blocks at concurrency). Defaults to Apify's automatic/free proxy pool. Upgrade to RESIDENTIAL only if you see blocked requests.

## Actor input object example

```json
{
  "searchQuery": "vitamine c",
  "language": "nl",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searchQuery": "vitamine c",
    "categoryUrl": "",
    "language": "nl",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/medi-market-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 = {
    "searchQuery": "vitamine c",
    "categoryUrl": "",
    "language": "nl",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/medi-market-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 '{
  "searchQuery": "vitamine c",
  "categoryUrl": "",
  "language": "nl",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/medi-market-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/medi-market-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/UpYeLtVmgl0n2lMYT/builds/cZTrqxuTUh9eanbfQ/openapi.json
