# budni Scraper — German Drugstore Products & Prices (`studio-amba/budni-scraper`) Actor

Scrape products, prices, brands, EAN codes and price-per-unit from budni.de — the Hamburg-area German drugstore chain. Search by keyword, full pagination. No login needed.

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

## budni Scraper — German Drugstore Products & Prices

Scrape products, prices, brands, EAN codes and price-per-unit from [budni.de](https://www.budni.de), a Hamburg-area German drugstore chain with roughly 200 stores. Search by keyword and get clean, structured JSON. No login required.

Built for price monitoring, catalog research, and competitive analysis in the German drugstore/retail space — the same category as our `rossmann-scraper`, `mueller-de-scraper` and `dm-scraper` actors.

### What it does

budni.de is a Next.js storefront. Its search results page embeds the full product catalog match (name, brand, price, EAN, price-per-unit, discount) directly as structured data in the page response — no anti-bot protection was found on this endpoint, so the actor talks to it with plain HTTP requests, no browser needed.

- **Keyword search** — pass any search term (`shampoo`, `zahnpasta`, `deo`, `windeln`) and get matching products.
- **Full pagination** — most search terms match hundreds of products on budni.de (e.g. `shampoo` → 945 matches, `deo` → 546); the actor walks every page until it hits your `maxResults` or runs out of matches, not just the first page.
- **Deduplication** — products are deduplicated by budni's internal article ID within a run.
- **Complete pricing on every item** — unlike some storefronts that only show price on promotional items, budni's own data includes the full price, price-per-unit, and (when on offer) the discount and pre-discount price for every single product, not just the ones on sale.

### Output

Each product is one record. Real examples from a live test run (query `shampoo`):

```json
{
  "name": "Super Strong Shampoo Bambus",
  "brand": "SANTE",
  "price": 3.99,
  "currency": "EUR",
  "url": "https://www.budni.de/sortiment/produkte/6170803007",
  "scrapedAt": "2026-09-06T14:20:19.905Z",
  "pricePerUnit": "15.96 €/L",
  "ean": "4055297220446",
  "productId": "6170803007",
  "imageUrl": "https://api-gateway-prod.budni-service.app/image/public/epim/68df3e21d3890fa42e90a9cb660d464ee79dfccaacb5f886b6f6148699bd6a70/medium.webp",
  "language": "de"
}
```

An item on a weekly offer, with the discount fields populated:

```json
{
  "name": "Shampoo Mango/Avocado",
  "brand": "JEAN & LEN",
  "price": 3.49,
  "currency": "EUR",
  "url": "https://www.budni.de/sortiment/produkte/6373461004",
  "scrapedAt": "2026-09-06T14:20:19.906Z",
  "originalPrice": 4.29,
  "pricePerUnit": "11.63 €/L",
  "discount": "-18%",
  "ean": "4260602128694",
  "productId": "6373461004",
  "imageUrl": "https://api-gateway-prod.budni-service.app/image/public/epim/08534e681048f45f0fdb3398157a7e911565fbd730ca603b5ed29bd99844ad4d/medium.webp",
  "language": "de"
}
```

#### Fields

| Field | Description |
|-------|-------------|
| `name` | Product name |
| `brand` | Brand / manufacturer |
| `price` | Current selling price as a number (already reflects any active discount) |
| `currency` | Currency code (`EUR`) |
| `url` | Full product page URL |
| `originalPrice` | Pre-discount manufacturer recommended price, when the item is on offer |
| `pricePerUnit` | Price per standard unit, e.g. `"15.96 €/L"` |
| `discount` | Discount label (e.g. `-18%`), only present on offer items |
| `ean` | EAN/GTIN barcode number |
| `productId` | budni.de's internal article ID |
| `imageUrl` | Primary product image URL |
| `language` | Content language (`de`) |
| `scrapedAt` | ISO 8601 timestamp of the scrape |

In a 30-item test run, `name`, `brand`, `price`, `currency`, `url`, `ean`, `productId`, `imageUrl` and `pricePerUnit` were populated on 100% of results — `originalPrice` and `discount` only appear on the subset of items currently on a weekly offer, which is correct (not a data-quality gap).

`inStock` is intentionally not included: budni.de only exposes real per-store availability once you pick a physical "Filiale" on the site, so there is no reliable national stock signal to scrape. We'd rather leave the field out entirely than guess.

### How to scrape budni data

1. Open the actor and set a **Search Query** (for example `shampoo`, `deo`, `zahnpasta`, `duschgel`). Leave it empty and it defaults to `shampoo`.
2. Set **Max Results** to the number of products you want — budni.de returns 24 products per page and most keywords match hundreds, so this actor can pull deep result sets, not just a first page.
3. Leave **Proxy Configuration** on its default (automatic Apify proxy) — budni.de has no anti-bot protection on product search, so residential proxies aren't needed here.
4. Click **Start**. When the run finishes, download the dataset as JSON, CSV or Excel, or pull it from the API.

#### Input example

```json
{
  "searchQuery": "deo",
  "maxResults": 200
}
```

#### Input example — quick test run

```json
{
  "searchQuery": "zahnpasta",
  "maxResults": 5
}
```

### Cost estimate

This actor runs on the STANDARD pay-per-result pricing tier. Each request is a single plain-HTTP call that returns up to 24 fully-populated products (no browser render, no per-product detail-page hop needed) — this is one of the cheapest-to-run actors in the drugstore category. A 200-result run typically completes in well under a minute.

A run's usage cost only settles after it reports SUCCEEDED — checking cost or dataset item counts while a run is still in progress will undercount both, so wait for the run to finish before relying on those numbers.

### Common use cases

- **Price monitoring** — track prices across drugstore categories (personal care, household, baby) over time.
- **Catalog research** — pull structured data on budni's assortment for a category or brand.
- **Competitive analysis** — compare budni's pricing against Rossmann, dm, and Müller.
- **Regional coverage** — budni is a Hamburg-area chain not covered by the bigger national drugstore actors, useful when you need North German pricing specifically.

### Limitations

- Covers the German budni.de storefront (EUR pricing) only.
- No per-store stock/availability data — budni only exposes that once a physical store is selected on the site itself, and it isn't reliable at a national level.
- Search relevance and result order follow budni's own ranking; the actor doesn't re-rank results.
- Product descriptions aren't included — budni only publishes the long-form description on the individual product page, not in the search results this actor reads. Name, brand, price, EAN and price-per-unit are all included.

### FAQ

**Does this need a login?**
No. The actor only reads publicly published product data. No account, password or cookies are required.

**Does it use a headless browser?**
No. budni.de's search results carry the full product data (including price) in the page response itself, so this actor uses plain HTTP requests — faster and cheaper than a browser-based actor.

**Why is `originalPrice` sometimes missing?**
Most products are listed at their normal price with no active promotion. `originalPrice` and `discount` only appear when budni currently has a markdown on that specific item.

**How far does pagination go?**
As far as `maxResults` and the site's own match count allow. Common search terms like `shampoo` or `deo` match hundreds of products on budni.de, and the actor pages through all of them (24 at a time, matching the site's own page size) until either limit is hit.

**Is this legal?**
The actor collects publicly available product and pricing information. You are responsible for using the data in line with budni.de's terms and applicable law.

### Related Scrapers

- [Rossmann Scraper](https://apify.com/studio-amba/rossmann-scraper) — Europe's second-largest drugstore chain (Germany, Poland, Hungary, Turkey)
- [dm Scraper](https://apify.com/studio-amba/dm-scraper) — Germany's largest drugstore chain
- [Mueller.de Scraper](https://apify.com/studio-amba/mueller-de-scraper) — another large German drugstore chain

### Maintained by Studio Amba

We run 700+ scrapers for European websites, and the priority is keeping every one of them working. Automated runs test this actor against the live site and verify the output is complete. When the website changes, the scraper usually gets repaired the same day, without you having to report anything. Questions and issues go straight to the people who built it, and most get an answer the same day.

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs, deduplication, delta detection, and delivery to your inbox, Google Sheets, or API, maintenance included. We can also build a custom version with your exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email <hello@studioamba.dev> for a free data sample.

### Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or connected to BUDNI Handels- und Service GmbH & Co. KG or budni.de. All product data belongs to its respective owners.

# Actor input Schema

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

Search for products by keyword (e.g., 'shampoo', 'zahnpasta', 'windeln'). Defaults to 'shampoo' if left empty.

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

Maximum number of products to return. budni.de returns 24 products per page and paginates fully for most search terms (typically hundreds of matches per keyword).

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

Proxy settings. Usually not needed — budni.de has no anti-bot protection on its product search.

## Actor input object example

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

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

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

```

## MCP server setup

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