# Apotea Product Details Scraper (`ecomscrape/apotea-product-details-scraper`) Actor

Automate pharmaceutical product data extraction from Apotea.se, Sweden's largest online pharmacy. Extract product details, pricing, stock information, and comprehensive product data for market analysis, price monitoring, and competitive intelligence in the Nordic healthcare e-commerce sector.

- **URL**: https://apify.com/ecomscrape/apotea-product-details-scraper.md
- **Developed by:** [ecomscrape](https://apify.com/ecomscrape) (community)
- **Categories:** Automation, E-commerce, Developer tools
- **Stats:** 4 total users, 1 monthly users, 92.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period.You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#rental-actors

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

## Contact

If you encounter any issues or need to exchange information, please feel free to contact us through the following link:
[My profile](https://apify.com/ecomscrape)

## **Apotea.se Product Scraper: Extract Pharmacy Data Efficiently**

### Introduction: Why Scrape Apotea.se?

Apotea.se stands as Sweden's premier online pharmacy, offering over 24,000 over-the-counter products and approximately 16,000 prescription medications for both humans and animals. Founded in 2011, the platform has grown from approximately €1.1 million to €450 million in annual revenue, becoming Sweden's favorite online store according to multiple PostNord surveys.

For businesses, researchers, and analysts in the pharmaceutical and healthcare sectors, accessing structured product data from Apotea.se provides invaluable insights into Nordic market trends, pricing strategies, product availability, and consumer preferences. Manual data collection from such an extensive catalog is impractical and time-consuming. This is where automated scraping becomes essential, enabling efficient extraction of comprehensive product information at scale.

### Overview: Apotea.se Product Details Scraper

The Apotea.se Product Details Scraper is a specialized data extraction tool designed to systematically collect comprehensive product information from individual product pages on the Apotea.se platform. This scraper handles the technical complexities of navigating Sweden's largest online pharmacy website, extracting structured data that can be used for various analytical and commercial purposes.

#### Key Features

This scraper excels in several critical areas:

- **Comprehensive Data Extraction**: Captures all essential product attributes including identification numbers, names, descriptions, pricing, stock status, and detailed product specifications
- **Residential Proxy Support**: Utilizes residential proxies to mimic genuine user behavior, reducing detection risk and ensuring consistent data access
- **Retry Mechanism**: Built-in retry logic (configurable up to 2 attempts per URL) ensures data collection even when facing temporary access issues
- **Error Handling**: Includes failure tolerance options to continue processing remaining URLs even if some requests fail
- **Structured Output**: Delivers data in a standardized format ready for database integration, analysis, or API consumption

#### Ideal Users

This tool serves multiple stakeholder groups:

- **Market Research Analysts**: Track pricing trends, product launches, and market positioning in the Nordic pharmaceutical sector
- **E-commerce Competitors**: Monitor competitive pricing, product descriptions, and availability strategies
- **Healthcare Data Scientists**: Build datasets for predictive modeling, demand forecasting, and consumer behavior analysis
- **Price Comparison Services**: Maintain updated product catalogs with current pricing information
- **Supply Chain Managers**: Monitor product availability and stock patterns across categories

### Input and Output Specifications

Example url 1: https://www.apotea.se/a-derma-cutalgan-ultra-calming-refreshing-spray-100-ml

Example url 2: https://www.apotea.se/mario-badescu-repairing-facial-spray-with-hypochlorous-acid-118-ml

Example url 3: https://www.apotea.se/mario-badescu-spritz-mist-glow-kit-3x118-ml

Example Screenshot of product information page:

![](https://i.ibb.co/4Z60VXFJ/Screenshot-from-2025-10-23-12-05-00.png)

#### Input Format

The scraper accepts JSON configuration with specific parameters to control the extraction process:

```json
{
  "max_retries_per_url": 2, // Maximum waiting time when accessing the links you provided.
  "proxy": { // Add a proxy to ensure that during the data collection process, you are not detected as a bot.
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL" 
    ],
    "apifyProxyCountry": "SG" // You should choose an Country that coincides with the Country you want to collect data from
  },
  "ignore_url_failures": true,
  "urls": [ // Links to product information pages.
    "https://www.apotea.se/a-derma-cutalgan-ultra-calming-refreshing-spray-100-ml",
    "https://www.apotea.se/mario-badescu-repairing-facial-spray-with-hypochlorous-acid-118-ml",
    "https://www.apotea.se/mario-badescu-spritz-mist-glow-kit-3x118-ml"
  ]
}
```

**Key Input Parameters:**

**1. Retry Configuration**

This parameter defines how many additional attempts the scraper will make if a URL fails to load properly. Setting this to 2 means each URL gets up to 3 total attempts (initial + 2 retries). For stable data collection from Apotea.se, a value between 1-3 is recommended.

**2. Proxy Settings**

- `useApifyProxy`: Enables proxy rotation to avoid IP blocking
- `apifyProxyGroups`: "RESIDENTIAL" proxies appear as regular home internet connections, making requests less detectable
- `apifyProxyCountry`: **Critical recommendation** - Set this to "SE" (Sweden) instead of "SG" for optimal performance. Swedish IPs are more appropriate for accessing Swedish pharmacy websites and reduce the risk of geographic access restrictions

**3. URL Configuration**

- `ignore_url_failures`: When set to `true`, the scraper continues processing even if some URLs fail, ensuring maximum data collection
- `urls`: Array of full product page URLs from Apotea.se. Each URL must point to a specific product detail page, not category or listing pages

#### Output Format and Data Fields

You get the output from the apotea.se Product Details Scraper stored in a tab. The following is an example of the Information Fields collected after running the Actor.

```json
[ // List of product information
  {
  "id": "http://www.apotea.se/#242708",
  "name": "A-Derma Cutalgan Ultra-Calming Refreshing Spray 100 ml",
  "description": "<p>A-Derma Cutalgan Ultra-Calming Refreshing Spray är en intensivt lugnande spray för känslig hud som känns torr eller stramar pga torrhet. Cutalgan Refreshing Spray har en kylande och lugnande effekt för att lindra dessa känslor av obehag i huden. Kan användas både på vuxna och barn.</p><p>Kan användas i ansikte, kropp, hårbotten och yttre intimområden.</p><p>Testad under dermatologisk, pediatrisk och gynekologisk kontroll.</p>",
  "image": "https://media.apotea.se/product-images/XL/a-derma-cutalgan-spray-100-ml-0.jpg",
  "url": "https://www.apotea.se/a-derma-cutalgan-ultra-calming-refreshing-spray-100-ml",
  "brand": {
    "@type": "Brand",
    "name": "A-Derma"
  },
  "offers": {
    "@type": "Offer",
    "availability": "https://schema.org/InStock",
    "item_condition": "https://schema.org/NewCondition",
    "price": 149,
    "price_currency": "SEK",
    "price_valid_until": "2026-10-23",
    "seller": {
      "@type": "Organization",
      "name": "www.apotea.se"
    }
  },
  "comparative_price": "JämförprisJfr-pris 1 490 kr/l",
  "stock_info": [],
  "product_dosage": "Skaka flaskan och spraya 20 cm från huden. Applicera så ofta du behöver, upp till 6 ggr/dag. Sprid ut över huden vid behov. Spraya inte i ögonen. För applicering i ansiktet, spraya först i handen. För spädbarn, barn och vuxna.",
  "product_contents": "Aqua, Caprylic/Capric Triglyceride, Glycerin, Uncaria Tomentosa Extract, Avena Sativa Leaf/Stem Extract, Acrylates/C10-30 Alkyl Acrylate Crosspolymer, Benzoic Acid, Caprylyl Glycol, Carbomer, Propylene Glycol, Sclerotium Gum, Sodium Hydroxide",
  "product_facts": [
    {
      "key": "EAN",
      "value": "<dd class=\"product-fact-value\">3282770209648</dd>"
    },
    {
      "key": "Varumärke",
      "value": "<dd class=\"product-fact-value\"><a href=\"/a-derma\">A-Derma</a></dd>"
    },
    {
      "key": "Kategori",
      "value": "<dd class=\"product-fact-value\"><a href=\"/ansikte\">Ansikte</a> &gt; <a href=\"/ansiktsvatten\">Ansiktsvatten</a><br></dd>"
    },
    {
      "key": "Förpackningsstorlek",
      "value": "<dd class=\"product-fact-value\">100 ml</dd>"
    }
  ],
  "price_history": {
    "labels": [
      "2025-09-23",
      "2025-09-24",
      "2025-09-25",
      "2025-09-26",
      "2025-09-27",
      "2025-09-28",
      "2025-09-29",
      "2025-09-30",
      "2025-10-01",
      "2025-10-02",
      "2025-10-03",
      "2025-10-04",
      "2025-10-05",
      "2025-10-06",
      "2025-10-07",
      "2025-10-08",
      "2025-10-09",
      "2025-10-10",
      "2025-10-11",
      "2025-10-12",
      "2025-10-13",
      "2025-10-14",
      "2025-10-15",
      "2025-10-16",
      "2025-10-17",
      "2025-10-18",
      "2025-10-19",
      "2025-10-20",
      "2025-10-21",
      "2025-10-22"
    ],
    "prices": [
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219,
      219
    ],
    "price_type": [
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1,
      1
    ],
    "lowest_chart_price": 219
  }
}, // ... Many other product details
]
```

The scraper extracts an extensive range of product data fields, each serving specific analytical and business purposes:

##### Core Identification Fields

**ID**: Unique product identifier assigned by Apotea.se

- *Purpose*: Enables consistent tracking across scraping sessions and database operations
- *Format*: Alphanumeric string
- *Use case*: Primary key for database storage, deduplication, and product matching

**Name**: Official product name

- *Purpose*: Primary product descriptor for display and search
- *Format*: Text string (typically 50-150 characters)
- *Use case*: Product catalogs, search indexing, comparison tables

**URL**: Direct link to the product page

- *Purpose*: Reference link for verification, updates, and user navigation
- *Format*: Full HTTPS URL
- *Use case*: Validation, re-scraping, customer redirection

##### Visual and Marketing Content

**Image**: Product image URL(s)

- *Purpose*: Visual representation for catalogs, e-commerce platforms, and marketing materials
- *Format*: URL(s) pointing to image files
- *Use case*: Website display, mobile apps, marketing materials, visual recognition systems

**Description**: Detailed product description

- *Purpose*: Marketing copy explaining product benefits, usage, and features
- *Format*: HTML or plain text (typically 100-500 words)
- *Use case*: SEO content, product information pages, customer education

**Brand**: Manufacturer or brand name

- *Purpose*: Brand-level analysis and categorization
- *Format*: Text string
- *Use case*: Brand performance tracking, supplier analysis, customer filtering

##### Pricing and Commercial Data

**Offers**: Current pricing information

- *Purpose*: Track active prices, discounts, and promotional offers
- *Format*: Structured object with price, currency, and offer validity
- *Use case*: Price monitoring, competitive analysis, promotion tracking, dynamic pricing strategies

**Comparative Price**: Reference or competitor prices

- *Purpose*: Show savings or market positioning
- *Format*: Price value with currency
- *Use case*: Price comparison tools, savings calculations, market positioning analysis

**Price History**: Historical pricing data

- *Purpose*: Track price changes over time
- *Format*: Array of price-timestamp pairs
- *Use case*: Trend analysis, seasonal pricing patterns, promotion effectiveness studies

##### Inventory and Availability

**Stock Info**: Current availability status

- *Purpose*: Real-time inventory tracking
- *Format*: Status indicator (e.g., "In Stock", "Out of Stock", quantity available)
- *Use case*: Inventory management, availability notifications, demand forecasting

##### Pharmaceutical-Specific Information

**Product Dosage**: Dosage information for medications

- *Purpose*: Critical health information for pharmaceutical products
- *Format*: Structured text (e.g., "500mg", "2 tablets daily")
- *Use case*: Healthcare compliance, product specification sheets, regulatory documentation

**Product Contents**: Ingredients or composition

- *Purpose*: Detailed ingredient lists for transparency and allergen information
- *Format*: Structured list or text
- *Use case*: Allergen alerts, ingredient analysis, regulatory compliance

**Product Facts**: Additional specifications and attributes

- *Purpose*: Technical details, certifications, usage instructions
- *Format*: Key-value pairs or structured text
- *Use case*: Product specifications, regulatory compliance, customer information

#### Sample Output Example

### How to Use: Step-by-Step Guide

#### Step 1: Collect Target URLs

Browse Apotea.se and compile a list of product page URLs you want to scrape. Ensure each URL points to an individual product page, not category or search results pages.

#### Step 2: Configure Your Input

Create your JSON configuration file:

- Set `max_retries_per_url` to 1-2 for balanced performance
- Configure proxy settings with `apifyProxyCountry: "SE"` for best results
- Add your URL list to the `urls` array
- Set `ignore_url_failures: true` to maximize data collection

#### Step 3: Execute the Scraper

Submit your configuration to the scraping platform. The scraper will:

- Rotate through residential proxies
- Visit each URL sequentially or in parallel
- Extract all configured data fields
- Retry failed requests automatically
- Compile results into structured output

#### Step 4: Process and Analyze Results

Once complete, you'll receive structured JSON or CSV output ready for:

- Database import
- Spreadsheet analysis
- API integration
- Visualization tools

#### Best Practices

- **Batch Processing**: Scrape 100-500 products per run for optimal stability
- **Regular Updates**: Schedule periodic scrapes to track price changes and availability
- **Data Validation**: Always verify a sample of results against source pages
- **Proxy Geography**: Use Swedish (SE) proxies for accessing Swedish websites
- **Rate Limiting**: Respect reasonable request rates to avoid overwhelming servers
- **Error Monitoring**: Review failed URLs and adjust retry settings if needed

#### Common Issues and Solutions

**Problem**: High failure rate on URLs

- **Solution**: Increase `max_retries_per_url` and verify proxy country is set to "SE"

**Problem**: Missing data fields in output

- **Solution**: Some products may not have all fields (e.g., prescription drugs might lack certain public information)

**Problem**: Slow scraping speed

- **Solution**: Check proxy performance and consider splitting large URL lists into smaller batches

### Benefits and Real-World Applications

#### Time and Resource Efficiency

Manual data collection from thousands of products would require hundreds of hours of repetitive work. This scraper reduces that time to minutes or hours, depending on the dataset size. Teams can redirect human resources from tedious data entry to strategic analysis and decision-making.

#### Practical Applications

**Competitive Intelligence**: Monitor competitor pricing strategies, product launches, and inventory patterns in real-time. Track how competing pharmacies position similar products.

**Market Research**: Build comprehensive datasets of pharmaceutical product offerings, pricing structures, and market trends across the Nordic region. Identify gaps in the market or emerging product categories.

**Price Optimization**: Use historical price data and comparative pricing to develop dynamic pricing strategies that remain competitive while maximizing margins.

**Inventory Planning**: Analyze stock patterns and availability trends to inform procurement decisions and predict demand fluctuations.

**Content Aggregation**: Build price comparison websites, pharmaceutical directories, or consumer information platforms with accurate, up-to-date product data.

**Regulatory Compliance**: Maintain records of product information, ingredient lists, and dosage information for compliance and documentation purposes.

#### Business Value

The structured data provided by this scraper enables data-driven decision-making in the pharmaceutical e-commerce sector. Companies can respond faster to market changes, optimize their pricing strategies based on real competitor data, and identify new market opportunities through comprehensive market analysis.

### Conclusion

The Apotea.se Product Details Scraper provides a robust, efficient solution for extracting comprehensive pharmaceutical product data from Sweden's largest online pharmacy. Whether you're conducting market research, building competitive intelligence systems, or aggregating product information for consumer services, this tool delivers accurate, structured data ready for immediate use.

By automating the data extraction process with built-in reliability features like retry mechanisms and proxy rotation, businesses can focus on generating insights rather than collecting data. The comprehensive output format captures everything from basic product information to detailed pharmaceutical specifications and pricing history.

Ready to streamline your pharmaceutical data collection? Start extracting actionable insights from Apotea.se today with this specialized scraping solution.

## Related Actors

- [**Apotea.se Product Search Scraper**](https://apify.com/ecomscrape/apotea-product-search-scraper): A specialized data extraction tool engineered to harvest detailed product information from apotea's product marketplace.

## Your feedback

We are always working to improve Actors' performance. So, if you have any technical feedback about apotea.se Product Details Scraper or simply found a bug, please create an issue on the Actor's Issues tab in Apify Console.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the Specific product urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `max_retries_per_url` (type: `integer`):

Limit the number of retries for each URL if the scrape is detected as a bot or the page fails to load

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped after the maximum number of retries.

## `proxy` (type: `object`):

Select proxies to be used by your scraper.

## Actor input object example

```json
{
  "urls": [
    "https://www.apotea.se/a-derma-cutalgan-ultra-calming-refreshing-spray-100-ml"
  ],
  "max_retries_per_url": 2,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "urls": [
        "https://www.apotea.se/a-derma-cutalgan-ultra-calming-refreshing-spray-100-ml"
    ],
    "max_retries_per_url": 2,
    "ignore_url_failures": false,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ecomscrape/apotea-product-details-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 = {
    "urls": ["https://www.apotea.se/a-derma-cutalgan-ultra-calming-refreshing-spray-100-ml"],
    "max_retries_per_url": 2,
    "ignore_url_failures": False,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("ecomscrape/apotea-product-details-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.apotea.se/a-derma-cutalgan-ultra-calming-refreshing-spray-100-ml"
  ],
  "max_retries_per_url": 2,
  "ignore_url_failures": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call ecomscrape/apotea-product-details-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ecomscrape/apotea-product-details-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/unQm8CpseLT4m3ccd/builds/Y4dc0lTMo2no9RoYo/openapi.json
