# asiafoodland Scraper - German Asia Shop Prices (`sian.agency/asiafoodland-product-scraper`) Actor

Exportiere den asiafoodland.de-Katalog: Preise, Grundpreis, EAN-Codes, Marken, Zutaten, Herkunftsland und Lagerbestand für 2.220 asiatische Lebensmittel.

- **URL**: https://apify.com/sian.agency/asiafoodland-product-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 catalogues

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

## asiafoodland Scraper — German Asia Shop Prices, EAN & Ingredients 🍜

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Tesco](https://img.shields.io/badge/Store-Tesco%20Products-00539F)](https://apify.com/sian.agency/tesco-product-scraper?fpr=sian) [![Google Shopping](https://img.shields.io/badge/Store-Google%20Shopping%20Prices-4285F4)](https://apify.com/sian.agency/google-shopping-price-scraper?fpr=sian) [![Kleinanzeigen](https://img.shields.io/badge/Store-Kleinanzeigen%20Listings-1AE392)](https://apify.com/sian.agency/kleinanzeigen-scraper?fpr=sian)

#### 🎉 All 2,220 products, with EAN barcodes, ingredients and a real price per kilo

##### Built for anyone pricing, sourcing or comparing Asian food in Germany

### 🔎 What is the asiafoodland German Asia Shop Scraper — and when should you use it?

The **asiafoodland German Asia Shop Scraper** turns the public product catalogue of asiafoodland.de, a large German Asian grocery into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** German Asian-grocery products as rows: the price in euros including VAT, the shop's own Grundpreis so a 52 g snack bag and a 1 kg rice sack compare on one axis, the brand, the pack size, the star rating and the delivery window. Every row says whether the shop can ship it, and carries the unit count where the shop tracks stock. Offers bring their previous price and the date the offer ends. Detail mode opens each product page and adds the EAN barcode, the shop's article number, the ingredient list, the country of origin, the allergen note, the full description, the shelf path and the image gallery.

**Use something else when:** the products are not from a German Asian grocery. Use [Tesco Product Scraper](https://apify.com/sian.agency/tesco-product-scraper?fpr=sian) for mainstream supermarket groceries, with the same price-and-unit-price row shape. Use [Google Shopping Price Tracker](https://apify.com/sian.agency/google-shopping-price-scraper?fpr=sian) for what every other retailer charges for the same barcode, across shops rather than inside one. Use [Kleinanzeigen Scraper](https://apify.com/sian.agency/kleinanzeigen-scraper?fpr=sian) for Germany's biggest classifieds site, for second-hand goods rather than a shop catalogue. This actor covers what asiafoodland.de publishes for shoppers: its four shelves (Food, Non-Food, Getränke & Tee, Sushi & Co), its search results, and its product pages. It reads one shop, so it says what asiafoodland charges, not what anyone else charges. The shop publishes ingredients and allergens as free text rather than structured nutrition values, so calories and macros are not available at any price. Each run is a snapshot; price history exists only if you schedule the run and keep the datasets.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/asiafoodland-product-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want product prices, barcodes and ingredients from asiafoodland.de using the Apify Actor `sian.agency/asiafoodland-product-scraper`.

Use it when I need: German Asian-grocery products as rows: the price in euros including VAT, the shop's own Grundpreis so a 52 g snack bag and a 1 kg rice sack compare on one axis, the brand, the pack size, the star rating and the delivery window. Every row says whether the shop can ship it, and carries the unit count where the shop tracks stock. Offers bring their previous price and the date the offer ends. Detail mode opens each product page and adds the EAN barcode, the shop's article number, the ingredient list, the country of origin, the allergen note, the full description, the shelf path and the image gallery.

Don't use it when: the products are not from a German Asian grocery — use tesco-product-scraper or google-shopping-price-scraper or kleinanzeigen-scraper instead.

How to call it: leave `operation` on `catalog` and either put German words in `searchTerms` (`ramen`, `sojasauce`, `currypaste` — the shop is German, so German words find the most) or pick a `shelf` from the dropdown, where every entry carries the product count measured by walking it. `categoryUrls` reaches any of the shop's 395 shelves, including the sub-shelves the dropdown does not list. `sortBy` offers the five orders the shop actually honours, and it decides which products you get when `maxItems` stops a run early. `inStockOnly` drops what the shop cannot ship today, which is about a third of the catalogue. Switch `operation` to `productDetail` and give `productUrls` a list of product pages to get the EAN, the ingredients, the country of origin and the allergens; catalogue mode is far cheaper per product, so use detail mode on the products you have already narrowed down..

Start with this input:
{
  "operation": "catalog",
  "searchTerms": [
    "ramen"
  ],
  "shelf": "Any",
  "sortBy": "priceAsc",
  "inStockOnly": true,
  "maxItems": 100
}

Ask me which products or shelves to cover, whether sold-out products should come back too, and whether the EAN barcode, ingredients and allergens are worth the higher per-product charge of detail mode, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *List every instant ramen asiafoodland sells under 3 euro, sorted by price per kilo.*
- *Export the whole Sushi & Co shelf with brand, pack size and whether it is in stock today.*
- *Give me the EAN barcode, ingredients and country of origin for every curry paste in the shop.*
- *Which products on the Snacks & Süßes shelf are on offer right now, and when does each offer end?*
- *Walk the whole catalogue and tell me which brands asiafoodland carries most products from.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/asiafoodland-product-scraper.md](https://apify.com/sian.agency/asiafoodland-product-scraper.md).

### 📋 Overview

**asiafoodland.de sells Asian food, drinks, sushi supplies and kitchen goods across Germany from its base in Hagen.** This actor turns its whole shop into rows you can sort, filter and join.

**What you get:**

- ✅ **The complete catalogue**: 2,220 products, counted against the shop's own sitemap. A product filed on two shelves is returned once, not twice.
- 🏷️ **EAN barcodes on every product page**: 20 of 20 sampled products published a GTIN-13. That is the join key that lets a row meet a wholesaler list without fuzzy name matching.
- ⚖️ **A real price per kilo**: the shop's own Grundpreis sits on nearly every row, so a 52 g snack bag and a 1 kg rice sack compare on one axis.
- 🥗 **Ingredients, origin and allergens**: detail rows carry the shop's ingredient text on 14 of 20 sampled products, country of origin on 14, and the allergen note on 7.
- 📦 **Availability with three states, not two**: in stock, sold out, or a product whose options are chosen on its own page and whose listing says nothing either way. 1,628 of 2,395 shelf entries were available when the catalogue was measured.
- 🌏 **A specialist assortment**: gochujang, tamarind paste, Thai curry pastes, sushi rice. Products a mainstream German supermarket does not stock.

### ✨ Features

- 🛒 **Search or browse**: German keywords, one shelf, several shelves, or the entire shop in one run.
- 🗂️ **Fifteen shelves with counts that were measured**: every product count in the picker came from walking that shelf to its last page.
- ↕️ **Sorting that actually sorts**: five orderings, each confirmed to change what the shop returns. The one the shop ignores is not offered.
- 🔬 **A deeper row when you want it**: EAN, article number, ingredients, country of origin, allergens, full description, shelf path and image gallery.
- ✅ **In-stock filtering**: keep only what the shop can ship, or take everything and decide later.
- 🔢 **A hard maximum**: a first run costs exactly what you set.
- 🔁 **Quiet retries**: a page the shop turns away is fetched again automatically, and a retry never appears on your bill.
- 💰 **Billed per product returned**: an empty search, an empty shelf and an unreadable link all cost nothing.
- 📄 **A run report every time**: what came back, what did not, what it cost, and copy buttons for the product links.

### 🎬 Quick Start

Pick a mode, give it something to look for, set a maximum. Catalogue mode is the one to start with, because it returns many products per request and never needs a link. Everything below runs without setup beyond an Apify token.

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~asiafoodland-product-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "catalog", "searchTerms": ["ramen"], "maxItems": 25}'
```

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose search or browse

Type German words into **Search terms**: `ramen`, `sojasauce`, `currypaste`, `kokosmilch`. Or clear that field and pick a **Shelf** to walk one instead.

#### Step 2: Set your maximum

Leave it at 25 for a first look. Raise it to 2500 when you want a whole shelf or the entire shop.

#### Step 3: Run it and open the dataset

Export as JSON, CSV or Excel, or read the run report for a table with copy buttons.

**That's it! In under two minutes, you'll have:**

- One row per product, with price, price per kilo, brand and availability
- A dataset you can schedule weekly to watch prices move
- A list of product links ready for detail mode

### 📥 Input Configuration

| Field | Type | Required | Description |
|---|---|---|---|
| `operation` | string | No | `catalog` (search or browse) or `productDetail` (deeper rows) |
| `searchTerms` | array | No | German search words, one per line |
| `shelf` | string | No | Which shelf to walk. `Any` walks the whole shop |
| `categoryUrls` | array | No | Shelf addresses from the shop, including sub-shelves |
| `sortBy` | string | No | `shopDefault`, `nameAsc`, `priceAsc`, `priceDesc`, `bestSelling`, `mostViewed` |
| `inStockOnly` | boolean | No | Keep only products the shop can ship |
| `productUrls` | array | No | Product page links for `productDetail` |
| `maxItems` | integer | No | Stop after this many rows (default 25, max 2500) |

**Example: search**

```json
{
  "operation": "catalog",
  "searchTerms": ["ramen", "sojasauce"],
  "sortBy": "priceAsc",
  "maxItems": 100
}
```

**Example: the whole shop**

```json
{
  "operation": "catalog",
  "searchTerms": [],
  "shelf": "Any",
  "maxItems": 2500
}
```

**Example: one shelf, in stock only**

```json
{
  "operation": "catalog",
  "searchTerms": [],
  "shelf": "food/reis-nudeln",
  "inStockOnly": true,
  "maxItems": 200
}
```

**Example: deeper rows**

```json
{
  "operation": "productDetail",
  "productUrls": [
    "https://www.asiafoodland.de/food/reis-nudeln/nudeln/reisnudeln/farmer-reisnudeln-s-1mm-reisbandnudeln-400g.html",
    "https://www.asiafoodland.de/food/snacks-suesses/snacks/taro-fisch-snack-bbq-52g.html"
  ]
}
```

### 📤 Output

Results are saved to the Apify dataset with **39 fields**, including:

| Field | Type | Description |
|---|---|---|
| `productName` | string | The product as the shop names it |
| `productUrl` | string | Its page on the shop |
| `productId` | integer | The shop's own product id, used to remove duplicates |
| `ean` | string | EAN-13 barcode (detail mode) |
| `sku` | string | The shop's own article number (detail mode) |
| `brand` | string | Manufacturer or house brand |
| `priceEur` | number | Price in EUR, VAT included |
| `oldPriceEur` | number | The previous price, when the product is on offer |
| `saleEndsAt` | string | When that offer ends, in the shop's own wording |
| `basePriceEur` | number | The shop's own Grundpreis |
| `basePriceUnit` | string | What that Grundpreis is per: `1 kg`, `1 l` |
| `packSize` | string | The pack the price refers to, such as `400,00 g` |
| `vatNote` | string | The shop's VAT line: 7% on food, 19% on non-food |
| `availability` | string | `InStock`, `OutOfStock`, or empty when the listing does not say |
| `stockQuantity` | integer | Units on hand, where the shop tracks them |
| `deliveryTime` | string | The shop's own delivery wording |
| `ingredients` | string | Ingredient text (detail mode) |
| `countryOfOrigin` | string | Where the product is made (detail mode) |
| `allergens` | string | The shop's allergen note (detail mode) |
| `categoryPath` | string | The shelf path this product sits on (detail mode) |

**Example row:**

```json
{
  "productName": "Farmer - Reisnudeln (S) 1mm - Reisbandnudeln - 400g",
  "productUrl": "https://www.asiafoodland.de/food/reis-nudeln/nudeln/reisnudeln/farmer-reisnudeln-s-1mm-reisbandnudeln-400g.html",
  "productId": 76,
  "sku": "HS3230",
  "ean": "8850521115125",
  "brand": "Farmer",
  "priceEur": 3.69,
  "currency": "EUR",
  "packSize": "400,00 g",
  "basePriceEur": 9.23,
  "basePriceUnit": "1 kg",
  "vatNote": "inkl. 7% USt.",
  "availability": "InStock",
  "inStock": true,
  "stockQuantity": 12,
  "deliveryTime": "Lieferzeit max. 6 Tage",
  "ingredients": "Reismehl",
  "countryOfOrigin": "Thailand",
  "packContent": "400g",
  "storageNote": "Kühl und trocken lagern.",
  "categoryPath": "Food > Reis & Nudeln > Nudeln > Reisnudeln",
  "operation": "productDetail",
  "scrapedAt": "2026-09-10T10:00:00.000Z"
}
```

### 💼 Use Cases & Examples

#### 1. Asian grocery price monitoring in Germany

**A category buyer needs to know what a specialist retailer charges, at the pack size that matters.**

**Input:** search terms like `sojasauce`, `currypaste`, `reis`, or the Food shelf
**Output:** one row per product with price, Grundpreis per kilo and availability
**Use:** schedule it weekly and diff the datasets to see which lines moved.

#### 2. Product matching on EAN barcodes

**A marketplace seller wants to line this catalogue up against a wholesaler list.**

**Input:** product links in `productDetail` mode
**Output:** the EAN-13 barcode, published on every sampled product page, plus the shop's article number
**Use:** join on the barcode instead of guessing whether two product names mean the same jar.

#### 3. Ingredient and allergen screening

**A dietary app or a food buyer needs to filter a shelf by what is actually in the jar.**

**Input:** a shelf walked in catalogue mode, then its product links in detail mode
**Output:** ingredient text, country of origin and the shop's allergen note
**Use:** flag everything containing fish sauce, or split Thai production from Vietnamese.

#### 4. Restocking and availability tracking

**A competitor analyst wants to see what sells out and what comes back.**

**Input:** a shelf, run on a schedule
**Output:** availability, the unit count where the shop tracks it, and the delivery window
**Use:** find the products that spend the most weeks unavailable, and drop them from a plan.

#### 5. Assortment research for a competing shop

**A founder is deciding what an Asian specialist range in Germany should contain.**

**Input:** `shelf: "Any"`, `maxItems: 2500`
**Output:** all 2,220 products with brands, shelf paths, pack sizes and prices
**Use:** size the categories before committing to stock, and see which third the shop cannot currently ship.

#### 6. Catalogue and content feeds

**A comparison site needs product copy and images it does not have to write.**

**Input:** product links in `productDetail` mode
**Output:** the full German description, the image gallery, the storage note and the manufacturer
**Use:** seed product pages without rewriting every description by hand.

#### 7. AI agents and shopping assistants

**An assistant needs live prices for a recipe's ingredients.**

**Input:** one search term per ingredient
**Output:** structured rows with price, Grundpreis and availability
**Use:** answer "what would this dish cost tonight" with numbers rather than guesses.

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/asiafoodland-product-scraper').call({
  operation: 'catalog',
  searchTerms: ['ramen', 'sojasauce'],
  sortBy: 'priceAsc',
  maxItems: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/asiafoodland-product-scraper').call(
    run_input={
        'operation': 'catalog',
        'shelf': 'food/gewuerze-pasten',
        'inStockOnly': True,
        'maxItems': 400,
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['productName'], item['priceEur'], item['availability'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~asiafoodland-product-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "productDetail", "productUrls": ["https://www.asiafoodland.de/food/snacks-suesses/snacks/taro-fisch-snack-bbq-52g.html"]}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: a weekly schedule, or a webhook from your own system
2. **HTTP Request**: call the actor API with your shelf or search terms
3. **Process**: compare the new prices against last week's dataset
4. **Action**: write to a sheet, update your catalogue, or send an alert when something moves

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 products** per run, with every field and both modes
- No card required
- Enough to see the shape of the data before you commit

#### PAID Tier (Production Ready)

- **Unlimited** products per run, so the whole 2,220-product catalogue fits in one go
- Pay per product returned: an empty search, an empty shelf and an unreadable link all cost nothing
- A run report with the itemised charges every time

💰 **$0.01 per catalogue product and $0.02 per detail product**, plus a $0.05 run start. Catalogue rows are the cheap, broad mode. Detail rows cost more because each one is its own request to the shop. Every paid plan from Bronze to Diamond pays the same per-product rate.

🔗 [View current pricing](https://apify.com/sian.agency/asiafoodland-product-scraper?fpr=sian)

### ❓ Frequently Asked Questions

**Q: How many products are there?**
A: 2,220. Leave the shelf on Everything, clear the search terms and raise the maximum to 2500 for a complete export.

**Q: What is the difference between catalogue mode and detail mode?**
A: Catalogue mode is broad and cheap. It returns one row per product with price, Grundpreis, brand, pack size, image, availability and delivery window, 24 products per request. Detail mode is deep. It returns one row per product link and adds the EAN barcode, the article number, the ingredient list, the country of origin, the allergen note, the full description, the shelf path and the image gallery.

**Q: Do I get EAN barcodes?**
A: In detail mode, yes. All 20 sampled product pages published a GTIN-13. The shop puts barcodes on product pages only, which is why catalogue rows leave the field empty.

**Q: How much of the catalogue is in stock?**
A: 1,628 of the 2,395 shelf entries were available when the shop was measured, so roughly two products in three. Sold-out products stay visible and most still show their last price. The shop's own default order puts everything it can ship first, so a run with a small maximum returns available products without you asking.

**Q: Why do some rows have no availability at all?**
A: Because the listing genuinely does not say. A handful of products have a size or flavour that must be chosen on the product page, and their tile carries no order control either way. Reporting that as empty is more honest than guessing, and **In stock only** drops them along with the sold-out ones.

**Q: Why does the shop show a comma and my export a dot?**
A: The shop is German and writes 3,69EUR. Rows carry a real number, 3.69, so a spreadsheet can add them up without a locale conversion. The currency is always EUR.

**Q: Can I cover more than one shelf in a single run?**
A: Yes. Pick one from the dropdown and paste any number of further shelf addresses into **Shelf links**. Duplicates are removed on the shop's own product id, so a product filed on two shelves is billed once.

**Q: Why does a run take a little longer than other shop scrapers?**
A: This shop screens automated traffic, so a page it turns away is fetched again automatically. That costs you nothing, but it does add seconds. Catalogue mode is much faster per product, since one request returns 24 of them.

**Q: What output formats are available?**
A: JSON, CSV and Excel, exported straight from the Apify dataset.

### 🐛 Troubleshooting

**A search returns nothing**

- The shop is German. Try `sojasauce` rather than soy sauce, `nudeln` rather than noodles.
- Browse instead: clear the search terms and pick a shelf from the dropdown.

**Fewer rows than the shelf claims**

- Check the maximum. It stops the run the moment that many rows exist.
- Check **In stock only**. It removes about a third of the catalogue.

**A product link comes back as removed**

- The shop takes pages down. Search the catalogue for the product name to find its replacement, or walk the shelf it sat on.

**A row has no EAN, no ingredients and no origin**

- Catalogue rows never carry those. Only detail mode reads the product page where the shop publishes them.

**A row has no price**

- The shop prints no price on a small number of products. That is what the shop itself shows, not a failed read.

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

asiafoodland is a trademark of its owner. This tool is not affiliated with, endorsed by or sponsored by asiafoodland, and reads only information the shop publishes for shoppers.

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

Catalogue searches the shop for your keywords, or walks the shelves you pick, and returns one row per product with price, price per kilo or litre, brand, image, stock count, delivery window and in-stock state. Product detail takes product page links and returns one deeper row each, adding the EAN barcode, the shop's article number, the ingredient list, the country of origin, the allergen note, the full description, the shelf path and every published image. Catalogue is far cheaper per product:…

## `searchTerms` (type: `array`):

German search words, one per line. The shop is German, so German words find the most. Each term is searched separately and every product it returns becomes a row. Clear this field, leave the shelf on Everything and leave the shelf links empty to export the whole shop instead - all 2,220 products.

## `shelf` (type: `string`):

Which shelf to walk when you are not searching. Every count was measured by walking the shelf to its last page on 2026-09-10. Everything walks all four top shelves and removes duplicates by the shop's product id, which is why it returns 2,220 rather than the 2,395 the four shelves sum to - about 175 products are filed twice. The ten entries below the four top shelves are sub-shelves of them, offered because they are the ones people actually want; there are 395 shelves in all and the field…

## `categoryUrls` (type: `array`):

Paste any shelf address from the shop to walk it, including the 380 sub-shelves the dropdown above does not list - from Currypaste and Sushi-Ingwer down to Essstäbchen and Energy Drinks. One link per line. Links given here are walked in addition to the shelf picked above.

## `sortBy` (type: `string`):

The shop's own sort order, applied before rows are counted - it decides which products you get when the maximum stops a run early. Every value here was confirmed to change the returned order on 2026-09-10. The shop's numbering also contains a sixth value that returns the default order unchanged; it is deliberately not offered rather than sold and silently ignored. Leave it on Shop default to get available products first: the shop's own order puts everything it can ship ahead of everything it…

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

Keep only products the shop can ship today. Off by default so a catalogue export is complete, but this is a real filter here rather than a rounding error: 1,628 of the 2,395 products on the four shelves were available on 2026-09-10, so switching it on removes about a third. It also drops the handful of products whose listing tile says nothing either way because their options have to be picked on the product page - the filter promises shippable, so anything unproven goes. Sold-out products are…

## `productUrls` (type: `array`):

Product page addresses, one per line, for detail mode. They all end in .html and sit under the shelf they belong to. Each becomes one deeper row carrying the EAN barcode, the article number, the ingredient list, the country of origin, the allergen note, the full description, the shelf path and the image gallery. A link the shop no longer serves is reported as such on its own row instead of being dropped.

## `maxItems` (type: `integer`):

Stops the run once this many rows exist, so a first run costs what you expect. The shop hands out 24 products per fetch, so a maximum of 25 reads two pages. Raise it to 2500 for the entire shop - the catalogue is 2,220 products, so anything above that changes nothing.

## Actor input object example

```json
{
  "operation": "catalog",
  "searchTerms": [
    "ramen",
    "sojasauce",
    "currypaste"
  ],
  "shelf": "Any",
  "categoryUrls": [
    "https://www.asiafoodland.de/food/gewuerze-pasten/pasten/currypaste/",
    "https://www.asiafoodland.de/sushi-co/sushi-zutaten/"
  ],
  "sortBy": "shopDefault",
  "inStockOnly": false,
  "productUrls": [
    "https://www.asiafoodland.de/food/reis-nudeln/nudeln/reisnudeln/farmer-reisnudeln-s-1mm-reisbandnudeln-400g.html",
    "https://www.asiafoodland.de/food/snacks-suesses/snacks/taro-fisch-snack-bbq-52g.html"
  ],
  "maxItems": 25
}
```

# Actor output Schema

## `asiafoodlandDeProduct` (type: `string`):

Every product this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "catalog",
    "searchTerms": [
        "ramen"
    ],
    "shelf": "Any",
    "categoryUrls": [],
    "sortBy": "shopDefault",
    "inStockOnly": false,
    "productUrls": [],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/asiafoodland-product-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 = {
    "operation": "catalog",
    "searchTerms": ["ramen"],
    "shelf": "Any",
    "categoryUrls": [],
    "sortBy": "shopDefault",
    "inStockOnly": False,
    "productUrls": [],
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/asiafoodland-product-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 '{
  "operation": "catalog",
  "searchTerms": [
    "ramen"
  ],
  "shelf": "Any",
  "categoryUrls": [],
  "sortBy": "shopDefault",
  "inStockOnly": false,
  "productUrls": [],
  "maxItems": 25
}' |
apify call sian.agency/asiafoodland-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/asiafoodland-product-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/RjVfQvtdr4rf1RXSe/builds/nAmbnEaCnF8dEjXf4/openapi.json
