# asia4friends Scraper - Asian Grocery Prices & Stock (`sian.agency/asia4friends-product-scraper`) Actor

Export the asia4friends catalogue: prices, per-kilo prices, EAN barcodes, stock counts, ingredients, nutrition and origin for 1,343 Asian grocery products sold in Germany.

- **URL**: https://apify.com/sian.agency/asia4friends-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

## asia4friends Scraper — Asian Grocery Prices, EAN Codes & Stock 🥢

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Tesco Product Scraper](https://img.shields.io/badge/Store-Tesco%20Product%20Scraper-00539F)](https://apify.com/sian.agency/tesco-product-scraper?fpr=sian) [![BAUHAUS Product Scraper](https://img.shields.io/badge/Store-BAUHAUS%20Product%20Scraper-DA251D)](https://apify.com/sian.agency/bauhaus-product-scraper?fpr=sian) [![Kleinanzeigen Scraper](https://img.shields.io/badge/Store-Kleinanzeigen%20Scraper-1D8043)](https://apify.com/sian.agency/kleinanzeigen-scraper?fpr=sian)

#### 🎉 The whole asia4friends catalogue — 1,343 products in 19 requests, with the EAN barcode on 85% of them

##### Built for price analysts, food importers and anyone who needs Asian grocery data from the German market

***

### 🔎 What is the asia4friends Asian Grocery Scraper — and when should you use it?

The **asia4friends Asian Grocery Scraper** turns the public asia4friends.de catalogue — Asian groceries sold in Germany 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:** Asian grocery products as rows: the euro price, the EAN barcode, the brand, the shop's article number, the image and whether it is in stock. All of that comes off the listing, so a whole shelf costs one request. Switch to detail mode and each row goes deeper. It then carries the published price per kilo or litre, the live stock count and the unit it is counted in, pack content and the delivery window. The food label comes with it: the full ingredient list, all eight nutrition values, the country of origin, the EU distributor and the best-before date, plus the product description and the customer reviews.

**Use something else when:** the products are not Asian groceries sold in Germany. Use [Tesco Product Scraper](https://apify.com/sian.agency/tesco-product-scraper?fpr=sian) for mainstream supermarket groceries, with the same price and per-unit price row shape. Use [BAUHAUS Product Scraper](https://apify.com/sian.agency/bauhaus-product-scraper?fpr=sian) for German DIY, garden and interiors, priced and in stock. Use [Kleinanzeigen Scraper](https://apify.com/sian.agency/kleinanzeigen-scraper?fpr=sian) for Germany's biggest classifieds, for second-hand prices across every category. This actor covers one shop: the 1,343 products asia4friends.de publishes to shoppers, across its nine departments plus the handful of frozen lines that sit outside them. It reads what the shop serves a visitor. It does not compare prices across shops, it does not keep price history unless you schedule it and keep the datasets, and shipping costs and invoice terms are shop policy rather than product data, so they are not published per product and are not returned.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/asia4friends-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 prices, EAN barcodes and stock for Asian groceries sold in Germany using the Apify Actor `sian.agency/asia4friends-product-scraper`.

Use it when I need: Asian grocery products as rows: the euro price, the EAN barcode, the brand, the shop's article number, the image and whether it is in stock. All of that comes off the listing, so a whole shelf costs one request. Switch to detail mode and each row goes deeper. It then carries the published price per kilo or litre, the live stock count and the unit it is counted in, pack content and the delivery window. The food label comes with it: the full ingredient list, all eight nutrition values, the country of origin, the EU distributor and the best-before date, plus the product description and the customer reviews.

Don't use it when: the products are not Asian groceries sold in Germany — use tesco-product-scraper or bauhaus-product-scraper or kleinanzeigen-scraper instead.

How to call it: leave `operation` on `catalog` and give `searchTerms` German words — `kimchi`, `ramen`, `sojasauce`, `kokosmilch`, `mochi`, `reispapier`, `curry` — one per line, and every product each term returns becomes a row. Instead of searching you can paste whole shelves into `categoryUrls`, for example https://asia4friends.de/saucen or https://asia4friends.de/frisch-kuehlware. Clear BOTH fields to export the entire shop, which is 1,343 products; raise `maxItems` to 1500 first, or the default cap of 25 stops it early. `sortBy` decides what you get when that cap bites — `priceDesc` for the most expensive first, `nameAsc` or `nameDesc` alphabetically, `shopDefault` for the shop's own order. `inStockOnly` drops sold-out lines, and anything it drops is never saved and never billed. For the deep fields — price per kilo, live stock count, ingredients, nutrition, country of origin, best-before — set `operation` to `productDetail` and pass product links in `productUrls`; catalogue rows carry the exact link in `productUrl`, so a catalogue run feeds a detail run directly.

Start with this input:
{
  "operation": "catalog",
  "searchTerms": [
    "kimchi"
  ],
  "sortBy": "shopDefault",
  "maxItems": 50
}

Ask me which products or departments to cover, whether sold-out lines should be kept or dropped, and whether the per-kilo price, ingredients and nutrition are worth a detail run on top of the catalogue, then run the Actor and summarise the results as a table.
```

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

- *Export every sauce and paste asia4friends sells with its price and EAN barcode, and rank the brands by how many lines each has on the shelf.*
- *Pull the whole asia4friends catalogue and list everything that is out of stock right now, cheapest shelf first.*
- *Take the ten kimchi products, open each one for its price per kilo and ingredient list, and tell me which is the best value per kilo.*

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

### 📋 Overview

**Asian groceries are a blind spot in retail data.** The big grocery scrapers cover Rewe, Lidl and Tesco; nobody covers the shops where people actually buy gochujang, mochi and fish sauce. This one reads asia4friends.de — a German shop with 1,343 Asian grocery lines — and hands you every product as a row you can sort, join and chart.

**What you get:**

- ✅ **The barcode, on the listing**: 85% of products publish their EAN, so rows join against a wholesaler list or a marketplace feed with no fuzzy name matching
- ⚡ **A whole shelf per request**: the listing returns 100 products at once, so the full catalogue is 19 requests rather than 1,343
- 🎯 **The published price per kilo**: German grocery law requires it, and the shop's own figure is returned rather than arithmetic that could be wrong about pack weight
- 💰 **Charged per product returned**: nothing for a search that matched nothing, nothing for a sold-out line the filter dropped, nothing for a link that could not be read
- 💎 **Food data a price feed never has**: ingredients, all eight nutrition values, country of origin, EU distributor and best-before date
- ✨ **Products with no department**: seven frozen lines sit outside the shop's own menu, and a whole-shop run still finds them

***

### ✨ Features

- 🛒 **Catalogue mode**: search the shop or take whole departments, one row per product
- 🔬 **Detail mode**: per-kilo price, live stock count, ingredients, nutrition, origin, reviews
- 🏷️ **EAN barcodes**: on the listing itself, no detail call needed
- 📦 **Real availability**: every listing row states in stock or sold out
- 🔢 **Live stock counts**: detail rows carry a number and its unit — "40 Glas", not a green dot
- ✅ **In-stock filter**: drop sold-out lines, and never pay for the ones dropped
- ↕️ **Verified sorting**: every sort option was checked against real listings before it was offered
- 🧊 **Complete exports**: a whole-shop run reaches the products the shop's own menu cannot
- 🚫 **No double-charging**: the same product on three shelves is one row, charged once
- 📄 **Run report**: an HTML summary with the numbers, the failures and what they cost

***

### 🎬 Quick Start

Pick an operation, name what to read, press Start. A bare run searches the shop for kimchi and returns 25 products, so you can see the row shape before committing to anything larger.

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

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose what to read

Type German search words into **Search terms**, or paste department links into **Department links**. Clear both to export the whole shop.

#### Step 2: Set the ceiling

**Maximum products** caps what the run returns and therefore what it can charge. Raise it to 1500 for a complete catalogue export.

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

Export as CSV, JSON or Excel, or pull it over the API.

**That's it. In a couple of minutes you'll have:**

- Every matching product with its price, barcode, brand and stock state
- A run report showing what succeeded, what did not and what it cost
- Product links you can feed straight back in for the deep fields

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | string | No | `catalog` (default) or `productDetail` |
| `searchTerms` | array | No | German search words, one per line |
| `categoryUrls` | array | No | Department links to take whole shelves |
| `sortBy` | string | No | `shopDefault`, `priceDesc`, `nameAsc`, `nameDesc` |
| `inStockOnly` | boolean | No | Drop sold-out products (off by default) |
| `productUrls` | array | For detail | Product page links to read in depth |
| `maxItems` | integer | No | Row cap for the run (default 25, max 5000) |

**Search a few shelves:**

```json
{
  "operation": "catalog",
  "searchTerms": ["kimchi", "ramen", "sojasauce"],
  "maxItems": 200
}
```

**Export the whole shop:**

```json
{
  "operation": "catalog",
  "searchTerms": [],
  "categoryUrls": [],
  "maxItems": 1500
}
```

**Go deep on specific products:**

```json
{
  "operation": "productDetail",
  "productUrls": [
    "https://asia4friends.de/kimchi-wang-410g",
    "https://asia4friends.de/mochi-eis-matcha-sukimo-140g"
  ]
}
```

***

### 📤 Output

Every row is flat JSON, exportable as CSV, JSON, Excel or over the API.

| Field | Type | Description |
|-------|------|-------------|
| `productName` | string | Product name as the shop publishes it, in German |
| `ean` | string | EAN barcode — present on about 85% of products |
| `sku` | string | The shop's own article number |
| `brand` | string | Brand name |
| `price` | number | Current price in EUR |
| `priceIsPublished` | boolean | `false` when the shop publishes no price for a variant parent |
| `unitPrice` | number | Published price per kilo or litre (detail mode) |
| `unitPriceBasis` | string | What the per-unit price is measured against, e.g. `1 kg` |
| `availability` | string | `InStock` or `OutOfStock` |
| `stockCount` | integer | Units the shop shows in stock (detail mode) |
| `ingredients` | string | Full ingredient list (detail mode) |
| `nutrition` | array | Eight nutrition values per 100 g (detail mode) |
| `originCountry` | string | Country of origin (detail mode) |
| `bestBefore` | string | Best-before date (detail mode) |
| `categoryPath` | string | Department path, e.g. `Konserviert > Gemüse` |
| `productUrl` | string | Link to the product page |

**Example row (catalogue mode):**

```json
{
  "sku": "SC055",
  "ean": "8715035590304",
  "productName": "Ramen Suppenbasis Shoyu Kikkoman 250ml",
  "productUrl": "https://asia4friends.de/ramen-suppenbasis-shoyu-kikkoman-250ml",
  "brand": "Kikkoman",
  "price": 4.39,
  "priceIsPublished": true,
  "currency": "EUR",
  "availability": "InStock",
  "inStock": true,
  "categoryPath": "Saucen",
  "operation": "catalog",
  "scrapedAt": "2026-09-10T08:00:00.000Z"
}
```

***

### 💼 Use Cases & Examples

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

**Price analysts tracking a category the mainstream grocery scrapers do not cover.**

**Input:** department links, or nothing at all for the whole shop
**Output:** every product with its price, per-kilo price and stock state
**Use:** a scheduled weekly run turns into a price history for a category with no public index.

#### 2. Product matching on EAN barcodes

**Marketplace sellers joining a shop catalogue against their own.**

**Input:** search terms for the lines you carry
**Output:** rows carrying the EAN, brand and article number
**Use:** match on the barcode instead of the product name, and find where the same article sells for more.

#### 3. Food data, ingredients and nutrition

**Dietary apps and food importers who need the label, not the price tag.**

**Input:** product links in detail mode
**Output:** ingredients, eight nutrition values, origin, distributor, best-before
**Use:** build a food database for a category most nutrition APIs never covered.

#### 4. Assortment and availability monitoring

**Category managers watching what sells out and what comes back.**

**Input:** department links on a schedule
**Output:** in-stock state on every row, live unit counts on detail rows
**Use:** spot the lines that go out of stock every month and the ones that never move.

#### 5. Import and sourcing research

**Buyers deciding whether a line is worth importing.**

**Input:** a whole-shop export
**Output:** brand, article number, EAN, pack content, country of origin
**Use:** size a supplier's German shelf presence before opening a conversation.

#### 6. Cuisine and category research

**Researchers sizing a cuisine rather than a shelf.**

**Input:** the cuisine cross-cut department link
**Output:** every product the shop files under Korean, Thai, Vietnamese or Japanese
**Use:** compare how much shelf each cuisine gets in the German market.

***

### 🔗 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/asia4friends-product-scraper').call({
  operation: 'catalog',
  searchTerms: ['kimchi', 'ramen'],
  maxItems: 200,
});

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/asia4friends-product-scraper').call(
    run_input={'operation': 'catalog', 'searchTerms': ['kimchi'], 'maxItems': 200}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['productName'], item.get('ean'), item.get('price'))
```

#### cURL

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

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

1. **Trigger**: a weekly schedule
2. **HTTP Request**: start the actor and wait for the dataset
3. **Process**: compare this week's prices against last week's
4. **Action**: write the changes to a sheet, or alert on anything that moved more than 5%

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 products** per run, every field included
- No credit card required
- Enough to see the row shape and check the fields you need are there

#### PAID Tier (Production Ready)

- **Unlimited** products per run — a full catalogue export is 1,343
- Charged per product actually returned

💰 **You pay for rows, not requests.** A search that matched nothing, a department with no products, a sold-out line the in-stock filter dropped and a link that could not be read all cost nothing.

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

***

### ❓ Frequently Asked Questions

**Q: How many products are there?**
A: 1,343 across nine departments, plus seven frozen lines that sit in no department at all. Clear both input fields and raise the maximum to 1500 for a complete export — the whole-shop run finds those seven too.

**Q: What is the difference between catalogue mode and detail mode?**
A: Catalogue mode is broad and cheap: price, EAN, brand, article number, image and in-stock state, a hundred products per request. Detail mode is deep: per-kilo price, live stock count, pack content, delivery window, ingredients, nutrition, origin, distributor, best-before, description and reviews.

**Q: Do I get EAN barcodes?**
A: Yes, on about 85% of products, and they come off the listing, so you never pay for a detail call to get one. The rest carry the shop's article number instead.

**Q: Why is the price empty on a few products?**
A: The shop publishes 0.00 for products sold only in variants, where the price depends on the size you pick. Those rows carry an empty price and a flag saying so. A zero would make every price report built on the data wrong.

**Q: Is the data in German?**
A: Yes. Names, descriptions, ingredient lists, nutrition labels and department names come from the German shop exactly as published, and prices are in EUR. Nothing is translated.

**Q: Why can I not sort cheapest first?**
A: Because the shop does not honour it. It accepts the value and returns its own order anyway, so the option would charge you for a run that quietly ignored it. Most expensive first, A-Z and Z-A were each checked against real listings.

**Q: Can I follow one department only?**
A: Yes. Paste department links and only those shelves are read. One caution: themenwelten is a cuisine cross-cut over the same catalogue rather than a tenth department, so taking it alongside the others returns about 600 products you already have.

**Q: Are there hidden costs?**
A: No. A small run-start fee plus one event per product row. No proxy bill, no key to buy, no per-request surcharge.

***

### 🐛 Troubleshooting

**A search returned nothing**

- The shop is German and searches German words. Try kimchi, ramen, sojasauce, kokosmilch, mochi, reispapier or curry.
- Or paste a department link instead of searching.

**A department link returned nothing**

- Open it in a browser first. A page holding only sub-shelves and no products of its own returns nothing — pick the shelf itself.

**A product link was rejected**

- Use a product page link, not a department link. Catalogue rows carry the exact link in `productUrl`.

**The run stopped early**

- **Maximum products** is 25 by default. Raise it. On the free tier, 25 is also the ceiling.

**I got the same products twice**

- You probably included themenwelten alongside the other departments. It is a cuisine cross-cut, not a tenth shelf.

***

### ⚖️ 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/).

asia4friends is a trademark of its owner. This tool is not affiliated with, endorsed by or sponsored by asia4friends, 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 departments you name, and returns one row per product with price, EAN barcode, brand, article number, image and in-stock state. Product detail takes product page links and returns one deeper row each. That row adds the published price per kilo, the live stock count, pack content and the delivery window, plus the food label: ingredients, nutrition, country of origin, distributor, best-before date, the description and customer reviews.

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

German search words, one per line. The shop is German, so German words find the most: kimchi returned 26 products, sauce returned over 250, and ramen, sojasauce, kokosmilch, mochi, reispapier, curry and gochujang all return their own shelves. Each term is searched separately and every product it returns becomes a row. Clear this field AND leave the department links empty to export the whole shop instead - all 1,343 products. Ignored in product detail mode.

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

Optional. Paste department links such as https://asia4friends.de/saucen or https://asia4friends.de/frisch-kuehlware to take whole shelves instead of searching. Sub-shelves work too and resolve under either address, so /gemuese and /konserviert/gemuese return the same 97 products. One caution: themenwelten is a cuisine cross-cut over the same catalogue, not a tenth department, so taking it alongside the others returns about 600 products you already have and charges for them twice.

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

The order the shop returns products in, which decides what you get when the maximum cuts the run short. Every option here was checked against real listings before it was offered. Cheapest first is deliberately absent: the shop accepts a value for it and then does not honour it, and an option that silently does nothing is worse than no option. Applies to search terms and department links alike; ignored in product detail mode.

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

Off by default, on purpose. 1,173 of the 1,343 products were in stock when this was built and 170 were not. Hiding the sold-out ones would drop about one product in eight from a live grocery catalogue, and that is data most people asked for: a sold-out line is exactly what an assortment or availability report is looking for. Switch this on when you only want what can be ordered today. Skipped products are never charged.

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

Product page links to read in detail. Required when the operation is product detail, ignored otherwise. Each link returns one row carrying the published price per kilo, the live stock count and its unit, pack content and the delivery window. It also carries ingredients, the full nutrition table, country of origin, distributor, best-before date, the description, every gallery image and the reviews. Catalogue rows carry the product link, so a catalogue run feeds this field directly.

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

Upper bound on the products a run returns, and therefore on what it can charge. The whole shop is 1,343 products, so raise this to 1500 for a complete export and clear both the search terms and the department links. Reached, the run stops and reports the cap in the run report.

## Actor input object example

```json
{
  "operation": "catalog",
  "searchTerms": [
    "kimchi",
    "ramen",
    "sojasauce"
  ],
  "categoryUrls": [
    "https://asia4friends.de/saucen",
    "https://asia4friends.de/frisch-kuehlware"
  ],
  "sortBy": "shopDefault",
  "inStockOnly": false,
  "productUrls": [
    "https://asia4friends.de/kimchi-wang-410g",
    "https://asia4friends.de/mochi-eis-matcha-sukimo-140g"
  ],
  "maxItems": 25
}
```

# Actor output Schema

## `asia4friendsDeProduct` (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": [
        "kimchi"
    ],
    "categoryUrls": [],
    "sortBy": "shopDefault",
    "inStockOnly": false,
    "productUrls": [
        "https://asia4friends.de/kimchi-wang-410g"
    ],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/asia4friends-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": ["kimchi"],
    "categoryUrls": [],
    "sortBy": "shopDefault",
    "inStockOnly": False,
    "productUrls": ["https://asia4friends.de/kimchi-wang-410g"],
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/asia4friends-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": [
    "kimchi"
  ],
  "categoryUrls": [],
  "sortBy": "shopDefault",
  "inStockOnly": false,
  "productUrls": [
    "https://asia4friends.de/kimchi-wang-410g"
  ],
  "maxItems": 25
}' |
apify call sian.agency/asia4friends-product-scraper --silent --output-dataset

```

## MCP server setup

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