# Pharm24.gr Scraper — Greece Pharmacy Products & Prices (`studio-amba/pharm24-gr-scraper`) Actor

Scrape products, prices, brands, EANs, and stock status from Pharm24.gr, one of Greece's largest online pharmacies. Covers OTC medicines, supplements, cosmetics, and parapharmacy products.

- **URL**: https://apify.com/studio-amba/pharm24-gr-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

## Pharm24.gr Pharmacy Scraper (Greece)

Extract pharmacy product data from [pharm24.gr](https://www.pharm24.gr), one of Greece's largest online pharmacies. Give the actor a search keyword and get back clean JSON with product names, brands, prices, EAN barcodes, categories, and stock status.

This is a price and catalogue scraper. It reads the same product data pharm24.gr already publishes on its own pages (name, price, brand, barcode, stock). It does not sell, prescribe, or fulfil anything — and like every Greek online pharmacy, pharm24.gr's own catalogue is limited to OTC medicines, supplements, cosmetics, and parapharmacy products, since prescription-only medicines cannot legally be sold online in Greece.

### How to scrape Pharm24 data

1. Enter a **search query** in Greek, for example `παυσιπονο` (painkiller), `βιταμινη c`, or `αντιηλιακο` (sunscreen).
2. Alternatively, provide **Start URLs** pointing at a specific category or brand page (e.g. `https://www.pharm24.gr/bioderma-m-186.html`) to scrape that listing directly instead of searching.
3. Set **maxResults** for how many products you want back.
4. Leave **fetchProductDetails** on (the default) for full data — brand, EAN barcode, category, description, and an accurate stock flag all come from the product page itself, not the search results grid.
5. Run the actor. Results land in the dataset as one JSON object per product, in the order pharm24.gr's own search relevance ranking returns them.

If you leave the search query empty, the actor falls back to a broad default keyword (`παυσιπονο`) so a run always returns data.

### Why use this actor

- **Price monitoring**: track OTC medicine, supplement, and parapharmacy prices at one of Greece's largest online pharmacies.
- **Barcode matching**: every result carries an EAN/GTIN barcode (read from the site's own schema.org product data), so you can match pharm24.gr's assortment against other pharmacies, price comparison feeds, or your own catalogue.
- **Discount tracking**: both the current selling price and the pre-discount list price (Π.Λ.Τ. — the Greek "recommended retail price" marking) are returned, so you can see which products are on promotion and by how much.
- **Stock checks**: with `fetchProductDetails` on, each product carries an in-stock flag read from the site's own availability data.

No login, no cookies, and no browser automation. The actor reads the site's own server-rendered pages, which makes runs fast and cheap. pharm24.gr sits behind Cloudflare, but recon confirmed it serves plain HTML with no JavaScript challenge — no residential proxy required.

### Input

| Field | Type | Description |
|---|---|---|
| `searchQuery` | string | Product keyword in Greek. Falls back to `παυσιπονο` when empty. Ignored if `startUrls` is set. |
| `startUrls` | array | Optional list of category, brand, or product page URLs to scrape directly instead of searching. Max 50. |
| `maxResults` | integer | Maximum products to return. Default 100, hard cap 5,000. |
| `fetchProductDetails` | boolean | ON by default. Fetches each product's detail page (one extra request per item) for brand, EAN, category, description, and an accurate stock flag. Turn OFF for a faster, cheaper run that only returns name, price, and URL — brand/EAN/category/inStock will be null. |
| `proxyConfiguration` | object | Apify proxy settings. The default automatic pool suffices; no residential proxy is needed. |

#### Example input

```json
{
    "searchQuery": "βιταμινη c",
    "maxResults": 100,
    "fetchProductDetails": true
}
```

#### Example input — specific brand page

```json
{
    "startUrls": [
        { "url": "https://www.pharm24.gr/bioderma-m-186.html" }
    ],
    "maxResults": 50
}
```

### Output

One JSON object per product:

| Field | Example | Notes |
|---|---|---|
| `name` | `"Bioderma Hydrabio Serum 72h Moisturising Booster 40ml"` | Full product name including size/pack |
| `brand` | `"Bioderma"` | Only populated when `fetchProductDetails` is on |
| `price` | `19.11` | Current selling price |
| `currency` | `"EUR"` | Always EUR |
| `originalPrice` | `25.19` | Pre-discount list price, `null` when the item isn't discounted |
| `ean` | `"3701129811757"` | EAN/GTIN barcode. Only populated when `fetchProductDetails` is on |
| `sku` | `"074428"` | Site-internal product code |
| `category` | `"Εταιρείες > Bioderma"` | Breadcrumb path as pharm24.gr states it. Only populated when `fetchProductDetails` is on |
| `inStock` | `true` | `true`, `false`, or `null` when the site doesn't state one. Only meaningful when `fetchProductDetails` is on — note the default search results already exclude out-of-stock items, so a listing-only run tells you nothing either way about stock |
| `rating` | `4.5` | Out of 5, where the site shows a rating |
| `reviewCount` | `14` | Number of reviews, where shown |
| `url` | `"https://www.pharm24.gr/bioderma-..."` | Product page URL |
| `imageUrl` | `"https://cdn.pharm24.gr/images/..."` | Product image |
| `description` | `"Bioderma Hydrabio Serum..."` | Truncated to 2000 characters. Only populated when `fetchProductDetails` is on |
| `source` | `"pharm24.gr"` | Source domain |
| `country` | `"GR"` | Country code |
| `scrapedAt` | `"2026-09-09T09:23:23.703Z"` | ISO 8601 timestamp |

#### Example output JSON

```json
{
    "name": "Avene Xeracalm A.D Replenishing Balm 400ml",
    "brand": "Avène",
    "price": 22.8,
    "currency": "EUR",
    "originalPrice": 35.08,
    "ean": "3282770399523",
    "sku": "027205",
    "category": "Εταιρείες > Avène",
    "inStock": true,
    "rating": 4.5,
    "reviewCount": 14,
    "url": "https://www.pharm24.gr/avene-xeracalm-ad-baume-relipidant-400ml-p-27205.html",
    "imageUrl": "https://cdn.pharm24.gr/images/200x200-90/Photo3282770399523_1.jpg",
    "description": "Avene Xeracalm A.D Replenishing Balm...",
    "source": "pharm24.gr",
    "country": "GR",
    "scrapedAt": "2026-09-09T09:23:23.703Z"
}
```

### Cost estimate

Pricing is Pay-Per-Event: a flat fee per run plus a small fee per result. With `fetchProductDetails` on (the default), each result costs one search-page request (shared across up to 200 results) plus one product-page request — still cheap, since there's no anti-bot tax on this site. With `fetchProductDetails` off, each result is essentially free beyond the shared search-page fetch. Either way, a run's usage cost only settles after the run reports SUCCEEDED — checking Apify's cost estimate mid-run will show a number far below the final total.

### Limitations / known issues

- `brand`, `ean`, `category`, `description`, and an accurate `inStock` flag require `fetchProductDetails` to be on (the default). With it off you only get `name`, `price`, `originalPrice`, `url`, `imageUrl`, and (where shown) `rating`/`reviewCount`.
- `startUrls` runs fetch exactly the URLs given and do not auto-paginate beyond that page — use `searchQuery` for a run that walks multiple result pages.
- Prescription-only medicines are not part of pharm24.gr's own online catalogue (Greek law does not allow selling them online), so this actor never encounters or returns them.
- Product descriptions are truncated to 2000 characters to keep dataset rows manageable.

### Related Scrapers

Studio AMBA runs a wider EU pharmacy cluster — check these out for other markets:

- [Gintarinė Scraper](https://apify.com/studio-amba/gintarine-lt-scraper) — Lithuania
- [Multipharma Scraper](https://apify.com/studio-amba/multipharma-scraper) — Belgium
- [Newpharma Scraper](https://apify.com/studio-amba/newpharma-scraper) — Belgium/France
- [Redcare Pharmacy (FR) Scraper](https://apify.com/studio-amba/redcare-pharmacy-fr-scraper) — France
- [Pharmacy Price Comparison](https://apify.com/studio-amba/pharmacy-price-comparison) — multi-pharmacy price comparison

# Actor input Schema

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

Search for products by name, brand, or category, in Greek (e.g. 'παυσιπονο', 'βιταμινη c', 'αντιηλιακο'). Leave empty to use the default keyword below.

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

Optional: scrape specific category, brand, or product pages instead of a search query (e.g. https://www.pharm24.gr/bioderma-m-186.html). When set, this overrides searchQuery. Max 50 URLs.

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

Maximum number of products to return.

## `fetchProductDetails` (type: `boolean`):

ON by default. When enabled, the actor visits each product's detail page (one extra request per item) to read the site's own schema.org Product JSON-LD — this is the only source for brand, EAN barcode, category, description, and an accurate in-stock status. Turn OFF for a faster, cheaper run that only returns name, price, and URL from the listing page (brand/EAN/category/inStock will be null).

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

Proxy settings. Pharm24.gr sits behind Cloudflare but serves plain HTML with no JS challenge (verified in recon, Sep 2026) and is not geo-locked — Apify's automatic/free proxy pool is sufficient, no residential proxy needed.

## Actor input object example

```json
{
  "searchQuery": "παυσιπονο",
  "maxResults": 20,
  "fetchProductDetails": true,
  "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": "παυσιπονο",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/pharm24-gr-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": "παυσιπονο",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/pharm24-gr-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": "παυσιπονο",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/pharm24-gr-scraper --silent --output-dataset

```

## MCP server setup

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