# BIPA Scraper — Austria Drugstore Products & Prices (`studio-amba/bipa-scraper`) Actor

Scrape product listings, prices, ratings, and availability from bipa.at, Austria's #2 drugstore chain (REWE Group). Search by keyword or category. No login required.

- **URL**: https://apify.com/studio-amba/bipa-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/platform/actors/running/actors-in-store#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

## BIPA Scraper

Scrape products, prices, ratings, and availability from bipa.at — Austria's #2 drugstore chain (REWE Group), covering health, beauty, baby, and household products.

### What is BIPA Scraper?

BIPA is one of Austria's two dominant drugstore chains, with hundreds of stores nationwide and a full online catalogue spanning skincare, hair care, make-up, personal hygiene, baby products, and household goods. This scraper reads the retailer's own Salesforce Commerce Cloud search API — no HTML guesswork, no brittle CSS selectors — for fast, structured extraction.

If you need reliable Austrian drugstore product data at scale — competitive pricing, catalogue tracking, or feeding a comparison platform — this actor delivers clean, structured results.

**Common use cases:**

- **Price monitoring** — Track BIPA's pricing and promotions over time for products you care about
- **Price benchmarking** — Compare BIPA against DM, Rossmann, and other drugstore retailers in our fleet
- **Brand monitoring** — Watch how a specific brand is priced and merchandised on BIPA
- **Product catalogue enrichment** — Feed BIPA product data (brand, price, rating, images) into your own comparison or affinity tool
- **Austrian market research** — Study category trends and assortment in the Austrian drugstore market

### What data does BIPA Scraper extract?

- **Product name & brand** — Full product name and manufacturer/brand
- **Price & discount** — Current price, original (strike-through) price, and discount percentage on promoted items
- **Price per unit** — BIPA's own normalized per-100ml/per-kg price string
- **Content size** — Package size (e.g. "355 ml")
- **Customer ratings** — Average rating and total review count (null when no reviews exist yet, never guessed)
- **Stock status** — In stock / out of stock / unknown (nullable — never coerced to false when the source doesn't say), plus a numeric stock level when BIPA exposes one
- **Product identifiers** — BIPA's internal product SKU
- **Category** — BIPA's own category slug
- **Product images** — Direct image URLs

### How to scrape BIPA data

The scraper offers two approaches:

#### Search by keyword

Enter any German/Austrian search term — "shampoo", "zahnpasta", "duschgel", "creme" — or a brand name like "Nivea". The actor queries BIPA's own product-search API, the same one the website's search bar uses.

#### Browse by category URL

Paste a bipa.at category URL, e.g. `https://www.bipa.at/c/haar/pflege/shampoos`, to scrape everything listed there instead of searching.

#### Input parameters

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `searchQuery` | String | `shampoo` | Search keyword (ignored if `categoryUrl` is set) |
| `categoryUrl` | String | — | bipa.at category URL to browse, e.g. `https://www.bipa.at/c/haar/pflege/shampoos` |
| `maxResults` | Integer | 100 | Maximum products to return (hard-capped at 20,000) |
| `inStockOnly` | Boolean | `false` | Off by default (includes out-of-stock and unknown-stock products). When on, drops products BIPA explicitly marks as not orderable |
| `proxyConfiguration` | Object | Apify automatic proxy | bipa.at has no bot-challenge layer (verified live) — the default Apify proxy is sufficient |

### Output

```json
{
  "name": "Difeel Shampoo Rosemary and Mint",
  "brand": "Difeel",
  "price": 7.49,
  "originalPrice": null,
  "currency": "EUR",
  "discount": null,
  "pricePerUnit": "100 ml 2,11",
  "contentSize": "355 ml",
  "productId": "B3-560423",
  "inStock": true,
  "stockLevel": 14,
  "onlineOnly": false,
  "rating": 5,
  "reviewCount": 8,
  "category": "haar-pflege-shampoos",
  "imageUrl": "https://www.bipa.at/dw/image/v2/AAFT_PRD/on/demandware.static/-/Sites-catalog/de_AT/v1787382208455/original/560423.png",
  "url": "https://www.bipa.at/p/difeel-shampoo-rosemary-and-mint/B3-560423",
  "scrapedAt": "2026-08-22T09:52:26.167Z"
}
```

### How it works

bipa.at is a Salesforce Commerce Cloud storefront (a React "Composable Storefront" / PWA Kit app). Its listing data comes from Salesforce's own Shopper Search API, which requires a short-lived guest access token that the site mints for itself on page load. This actor runs a single lightweight browser page load to capture that token, then pages through the full result set with plain HTTP requests — no browser needed for the bulk of the run, which keeps runs fast and cheap. If the token expires mid-run (only relevant on very large `maxResults` pulls), the actor re-mints it automatically and resumes.

### How much does it cost?

Each page of results returns up to 200 products in a single request. One browser page load mints the session token; all subsequent pagination is plain HTTP, so compute stays low.

| Volume | Estimated CU | Estimated Cost |
|--------|-------------|----------------|
| 100 products | ~0.02 CU | ~$0.01 |
| 1,000 products | ~0.08 CU | ~$0.04 |
| 10,000 products | ~0.6 CU | ~$0.30 |

These are Apify platform-cost estimates only; actual cost also depends on your Apify plan. Usage cost only settles after the run reports **SUCCEEDED** — a run that fails or is aborted mid-way is not charged for items it never wrote.

### Can I integrate?

Export your data as JSON, CSV, Excel, or XML, or pipe it directly into your existing tools:

- **Google Sheets** — Automatically push product data to a shared spreadsheet
- **Webhooks** — Trigger a custom URL when the scrape completes
- **Zapier / Make / n8n** — Connect to thousands of apps without writing code
- **Amazon S3 / Google Cloud** — Dump large datasets straight to cloud storage

### Can I use it as an API?

Yes. Integrate BIPA product data directly into your applications.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("studio-amba/bipa-scraper").call(run_input={
    "searchQuery": "shampoo",
    "maxResults": 200,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['brand']} — {item['name']}: EUR {item['price']}")
```

#### JavaScript

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

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

const run = await client.actor('studio-amba/bipa-scraper').call({
    searchQuery: 'shampoo',
    maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => {
    console.log(`${item.brand} — ${item.name}: EUR ${item.price}`);
});
```

### FAQ

**Does BIPA sell only beauty products?**
No. Beauty and personal care are BIPA's core categories, but the catalogue also covers baby products, household goods, health items, and food supplements.

**Why is `inStock` sometimes `null` instead of `true` or `false`?**
When BIPA doesn't publish a clear orderable status for a listing, the field is left `null` rather than guessed. Treat `null` as "unknown", not as "out of stock".

**Can I filter by brand?**
There's no dedicated brand filter input, but searching for a brand name (e.g. "Nivea", "Pantene") works well since BIPA's search matches brand names directly.

**How frequently can I run the scraper?**
As often as you need for price-monitoring use cases. Daily or weekly runs are common.

**Do I need a proxy?**
No. bipa.at doesn't run a bot-challenge layer, so the actor's default Apify proxy setting works reliably.

### Tips for effective BIPA data extraction

1. **Use category URLs for a stable, bounded set** — a category page (e.g. all shampoos) gives a fixed, predictable product list, unlike a broad keyword search where relevance ranking can shift slightly between runs.
2. **Pair with dm-scraper, Rossmann Scraper, and Kruidvat Scraper** — BIPA, dm, Rossmann, and Kruidvat together cover most of the German-speaking and Benelux drugstore landscape; join on brand and product name for cross-retailer pricing.
3. **Watch the `discount` field for promo tracking** — BIPA runs frequent "Aktion" promotions.
4. **Use `pricePerUnit` for fair size comparison** — products come in many pack sizes; the per-unit price normalizes that.

### Limitations

- Search result ordering can shift slightly between requests (site-side relevance ranking), so very large `maxResults` pulls on a broad keyword may return fewer unique products than requested — the actor de-duplicates automatically and stops cleanly rather than returning repeats. Category URLs do not have this issue.
- No ingredient lists or full product descriptions — this actor extracts commerce fields (name, brand, price, stock, rating), not marketing copy.
- Austria (bipa.at) only.
- No purchase history, loyalty pricing, or store-specific stock data — this reads the public online catalogue only.

### Other pharmacy & drugstore scrapers

Need drugstore, pharmacy, or beauty data from more sources? Explore our full collection:

- [dm Scraper](https://apify.com/studio-amba/dm-scraper) — Germany's largest drugstore chain
- [Rossmann Scraper](https://apify.com/studio-amba/rossmann-scraper) — German/Polish/Hungarian/Turkish drugstore chain
- [Kruidvat Scraper](https://apify.com/studio-amba/kruidvat-scraper) — Belgian/Dutch drugstore chain
- [Douglas.de Scraper](https://apify.com/studio-amba/douglas-de-scraper) — Germany's #1 perfumery chain
- [Shop Apotheke Scraper](https://apify.com/studio-amba/shopapotheke-scraper) — Europe's leading online pharmacy (DE/AT/CH/BE/FR/IT)

### Your feedback

Found a bug? Need a new feature? Want help building a pipeline on top of BIPA data? [Open an issue](https://console.apify.com/actors/studio-amba/bipa-scraper/issues) or contact us on Apify. We read every message and ship fixes fast.

# Actor input Schema

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

Search bipa.at for products by keyword (German/Austrian terms work best, e.g. "shampoo", "zahnpasta", "duschgel"). Ignored if categoryUrl is set. Defaults to "shampoo" if both are left empty.

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

A bipa.at category page URL to scrape instead of a keyword search. Example: https://www.bipa.at/c/haar/pflege/shampoos . Takes priority over searchQuery when both are set.

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

Maximum number of products to return. Hard-capped at 20,000 per run.

## `inStockOnly` (type: `boolean`):

Off by default (includes out-of-stock and unknown-stock products). When enabled, drops any product bipa.at explicitly marks as not orderable.

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

Proxy settings. bipa.at has no bot-challenge layer (verified live) — the Apify automatic proxy is sufficient, no residential group needed.

## Actor input object example

```json
{
  "searchQuery": "shampoo",
  "maxResults": 20,
  "inStockOnly": false,
  "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": "shampoo",
    "categoryUrl": "",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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