# MAOMAO Scraper - Asian Grocery Products & Prices (`sian.agency/mao-mao-product-scraper`) Actor

Scrape the MAOMAO (mao-mao.de) catalogue: Asian grocery products with prices, EAN codes, brands, stock status and unit prices. Clean JSON, no code needed.

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

## Pricing

from $10.00 / 1,000 catalogue searches

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

## MAOMAO Scraper 🍜 Asian Grocery Products, Prices & EAN Codes

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

#### 🎉 The whole MAOMAO catalogue in about 25 seconds — 2,728 products, prices, brands, stock and EAN codes

##### Built for price monitors, sourcing teams and anyone tracking what Germany actually buys from Asia

***

### 🔎 What is the MAOMAO Scraper — and when should you use it?

The **MAOMAO Scraper** turns the public MAOMAO storefront at mao-mao.de, one of Germany's larger online Asian grocers, 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: name, euro price, the crossed-out was-price where a real discount exists, brand, the shop's own category, stock read per variant, article number, shipping weight, the German product copy and every published photo. Product Detail adds two fields the catalogue page never carries. One is the EAN barcode, which lets a row be matched to the same article at another retailer. The other is the price per litre or kilo that German price labelling requires.

**Use something else when:** you want a different retailer. Use [Tesco Product Scraper](https://apify.com/sian.agency/tesco-product-scraper?fpr=sian) for UK grocery shelves, with the same price-and-stock row shape. Use [Kleinanzeigen Scraper](https://apify.com/sian.agency/kleinanzeigen-scraper?fpr=sian) for Germany's biggest classifieds site, for second-hand prices on the same goods. Use [Douglas Product Scraper](https://apify.com/sian.agency/douglas-product-scraper?fpr=sian) for the German beauty catalogue, prices and stock included. This actor covers one shop and nothing else: the 2,728 products MAOMAO publishes at mao-mao.de. It reads the storefront a visitor sees. Order history, customer reviews and anything behind a login are not published by the shop and are not part of it.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/mao-mao-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 to track what MAOMAO sells at mao-mao.de and what it costs using the Apify Actor `sian.agency/mao-mao-product-scraper`.

Use it when I need: German Asian-grocery products as rows: name, euro price, the crossed-out was-price where a real discount exists, brand, the shop's own category, stock read per variant, article number, shipping weight, the German product copy and every published photo. Product Detail adds two fields the catalogue page never carries. One is the EAN barcode, which lets a row be matched to the same article at another retailer. The other is the price per litre or kilo that German price labelling requires.

Don't use it when: you want a different retailer — use tesco-product-scraper or kleinanzeigen-scraper or douglas-product-scraper instead.

How to call it: leave `operation` on `search` to walk the shop. `searchTerms` is a list of words matched against the product name, brand, category, tags and the German description, combined with OR, and an empty list returns the whole catalogue. `category` narrows the run to one of the shop's own shelves — snacks, instant noodles, sauces, drinks, frozen, rice and flour, canned goods or deli — and `Any` leaves it off. `collectionUrls` points the run at specific collection pages instead of the whole shop, which is much faster. `inStockOnly` drops products where every variant is sold out, worth knowing because more than half the catalogue is sold out at any moment. `maxItems` caps the run and therefore the spend. Switch `operation` to `productDetail` and pass product addresses in `productUrls` to get one row each with the EAN barcode and the unit price.

Start with this input:
{
  "operation": "search",
  "searchTerms": [
    "ramen"
  ],
  "category": "Instant Noodles",
  "inStockOnly": true,
  "maxItems": 100
}

Ask me what I am looking for, whether sold-out products should be included, and how many products I want back, then run the Actor and summarise the results as a table.
```

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

- *Find every Samyang product MAOMAO has in stock and tell me which ones are discounted right now.*
- *Pull the whole drinks shelf and rank it by price per litre.*
- *Get the EAN codes for these twelve product links so I can match them against my own catalogue.*

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

### 📋 Overview

**MAOMAO is one of Germany's larger online Asian grocers.** 2,728 products, 547 brands, more than 138,000 orders shipped. This actor reads the whole storefront and hands you the catalogue as clean JSON.

**Why people use it:**

- ✅ **The complete shop, not a sample**: all 2,728 products in eleven calls, about 25 seconds end to end
- ⚡ **Fast because it stays out of the browser**: no page rendering, no waiting on scripts. Roughly a second per 250 products
- 🎯 **Stock you can trust**: availability is read per variant rather than guessed from a page. 1,531 of 2,728 products were sold out when we last counted
- 💰 **$0.90 per 1,000 products**: below every German grocery scraper we measured, which sit between $2.00 and $5.00
- 💎 **EAN barcodes and unit prices**: the two fields that let you match a row to the same article at another retailer, then compare per litre instead of per pack
- ✨ **Sale detection that means something**: the crossed-out price is only reported when it is genuinely higher than today's price, so your discount alerts stay honest

***

### ✨ Features

- 🔍 **Keyword search across the whole shop**: terms match the product name, brand, category, tags and the German description
- 🗂️ **Category filter**: pick one of the shop's own shelves. Snacks, instant noodles, sauces, drinks, frozen, rice and flour, canned goods, deli.
- 🧺 **Collection targeting**: paste collection addresses to read only those pages instead of walking the catalogue
- ✅ **In-stock filter**: drop everything that is sold out, so you only pay for products people can actually buy
- 📦 **Full variant detail**: every size and flavour with its own SKU, price, weight and stock, inside the product row
- 📇 **EAN barcodes**: the join key for matching MAOMAO prices against Amazon, Rewe or your own catalogue
- ⚖️ **Unit prices**: price per litre or per kilo, the way German price labelling requires
- 🖼️ **Product images**: every photo the shop publishes, at full resolution
- 📝 **German product copy**: descriptions, storage notes and preparation instructions as plain text
- 📄 **Run report**: an HTML summary in your key-value store showing what came back and what to fix

***

### 🎬 Quick Start

Pick an operation, give it a search term or a product address, press Start. Results land in your dataset as JSON, CSV or Excel. A first run with the defaults returns about a hundred products and takes under half a minute.

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

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose what to scrape

Leave the operation on **Catalogue Search** to browse or filter the shop. Switch to **Product Detail** when you have specific product addresses and want EAN codes.

#### Step 2: Narrow it down

Add search terms, pick a category, or paste collection addresses. Set **Max products** to cap both the run and your spend.

#### Step 3: Press Start and export

Download the dataset as JSON, CSV or Excel, or pull it straight from the API.

**That's it! In under a minute, you'll have:**

- Every matching product with its current euro price
- Brand, category, SKU and per-variant stock
- An HTML run report showing exactly what came back

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | string | No | `search` or `productDetail`. Defaults to `search`. |
| `searchTerms` | array | No | Words to look for. Empty returns the whole shop. |
| `category` | string | No | One of the shop's shelves, or `Any`. |
| `collectionUrls` | array | No | Collection addresses to read instead of the whole shop. |
| `inStockOnly` | boolean | No | Skip products where every variant is sold out. |
| `maxItems` | integer | No | Stop after this many products. Defaults to 100. |
| `productUrls` | array | No | Product addresses for the `productDetail` operation. |

**Example — search one shelf:**

```json
{
  "operation": "search",
  "searchTerms": ["ramen"],
  "category": "Instant Noodles",
  "inStockOnly": true,
  "maxItems": 100
}
```

**Example — the whole shop:**

```json
{
  "operation": "search",
  "searchTerms": [],
  "category": "Any",
  "maxItems": 5000
}
```

**Example — product detail with EAN codes:**

```json
{
  "operation": "productDetail",
  "productUrls": [
    "https://mao-mao.de/products/heng-shun-schwarzer-essig-chinkiang-550-ml",
    "https://mao-mao.de/products/lotte-milchis-fot-getrank-250ml"
  ]
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **25+ fields** including:

| Field | Type | Description |
|-------|------|-------------|
| `productName` | string | Product name as the shop writes it |
| `price` | number | Current price in euros |
| `compareAtPrice` | number | The crossed-out was-price, only when it is genuinely higher |
| `onSale` | boolean | True when a real was-price exists |
| `inStock` | boolean | True when at least one variant can be bought |
| `brand` | string | Manufacturer, from Samyang and Nong Shim to the shop's own MAOMAO label |
| `category` | string | The shop's own shelf name, in German |
| `sku` | string | The shop's article number |
| `barcode` | string | EAN or GTIN. Product Detail only, and not every product has one. |
| `unitPriceText` | string | Price per litre or kilo, for example `€7.98 / l`. Product Detail only. |
| `weightGrams` | integer | Shipping weight |
| `variantCount` | integer | How many sizes or flavours this product has |
| `variants` | array | Each variant with its own SKU, price, stock and weight |
| `imageUrl` | string | First product photo |
| `images` | array | Every photo the shop publishes |
| `descriptionText` | string | The German product copy as plain text |
| `productUrl` | string | Link back to the product page |
| `productId` | integer | The shop's own product ID |

**Example:**

```json
{
  "productId": 8195808723212,
  "productName": "HENG SHUN schwarzer Essig (Chinkiang) 550ml",
  "handle": "heng-shun-schwarzer-essig-chinkiang-550-ml",
  "productUrl": "https://mao-mao.de/products/heng-shun-schwarzer-essig-chinkiang-550-ml",
  "brand": "Heng Shun",
  "category": "Saucen, Öle, Essig, Gewürze & Pasten",
  "price": 4.39,
  "compareAtPrice": null,
  "onSale": false,
  "currency": "EUR",
  "inStock": true,
  "sku": "1001512",
  "barcode": "6902007505264",
  "unitPriceText": "€7.98 / l",
  "weightGrams": 780,
  "variantCount": 1,
  "imageUrl": "https://cdn.shopify.com/s/files/1/0609/7610/3610/files/HENG-SHUN-schwarzer-Essig.jpg",
  "imageCount": 1,
  "tags": ["Glas"],
  "descriptionText": "Chinkiang-Essig ist ein traditioneller chinesischer Essig...",
  "shop": "MAOMAO"
}
```

***

### 💼 Use Cases & Examples

#### 1. Price and Stock Monitoring

**A price analyst watches a competing grocer daily to catch discounts and restocks the day they happen.**

**Input:** Run Catalogue Search on a schedule with `maxItems: 5000`
**Output:** Every product with today's price, the was-price where a real discount exists, and per-variant stock
**Use:** Alert on any product whose `onSale` flips to true, or whose `inStock` returns after a gap

#### 2. Assortment and Sourcing Research

**A buyer at a European food importer maps what actually sells in the German Asian-grocery market.**

**Input:** Catalogue Search with no terms and `category: "Any"`
**Output:** 2,728 products across 20 shop categories and 547 brands
**Use:** Rank brands by shelf presence, find the gaps in your own range, shortlist suppliers

#### 3. Cross-Retailer Price Comparison

**A comparison site matches MAOMAO against Amazon and Rewe on the same physical article.**

**Input:** Product Detail with the product addresses you care about
**Output:** EAN barcode plus price per litre or per kilo for each one
**Use:** Join on the EAN, compare on unit price rather than pack size, publish an honest table

#### 4. Product Feed for a Shop or Marketplace

**A dropshipper needs names, images, weights and German copy to build listings.**

**Input:** Catalogue Search with `inStockOnly: true`
**Output:** Names, descriptions, images, SKUs, weights and prices as clean JSON
**Use:** Load straight into Shopify, WooCommerce or a marketplace listing tool

#### 5. Food Trend Tracking

**A trend researcher tracks which Korean and Japanese products reach German shelves first.**

**Input:** Collection addresses for the shop's bestseller and new-arrival pages
**Output:** What the shop is pushing right now, with prices and stock
**Use:** Spot a product going viral weeks before supermarkets pick it up

#### 6. Competitive Range Analysis for Retailers

**An Asian supermarket chain benchmarks its own range against a large online rival.**

**Input:** Catalogue Search by category, one run per shelf
**Output:** Category-level product counts, price distributions and brand mix
**Use:** Find the shelves where your range is thin and your prices are off

***

### 🔗 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/mao-mao-product-scraper').call({
  operation: 'search',
  searchTerms: ['ramen'],
  category: 'Instant Noodles',
  inStockOnly: true,
  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/mao-mao-product-scraper').call(
    run_input={
        'operation': 'search',
        'searchTerms': ['ramen'],
        'category': 'Instant Noodles',
        'inStockOnly': True,
        'maxItems': 100,
    }
)

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

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~mao-mao-product-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "productDetail", "productUrls": ["https://mao-mao.de/products/heng-shun-schwarzer-essig-chinkiang-550-ml"]}'
```

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

1. **Trigger**: a daily schedule, or a webhook from your own system
2. **HTTP Request**: call the actor API with your input
3. **Process**: compare today's prices against yesterday's rows
4. **Action**: write to a sheet, post to Slack, or update your catalogue

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 products** per run, with every field the paid tier returns
- No credit card required
- Enough to check the fields, the German copy and the export format

#### PAID Tier (Production Ready)

- **Unlimited** products per run — the whole 2,728-product shop in one go
- No delays between pages
- Pay per product returned: a search that matches nothing costs you nothing

💰 **$0.90 per 1,000 products** on Catalogue Search. The German grocery scrapers we measured charge $2.00 to $5.00 per 1,000. Product Detail is $2.50 per 1,000 rows, because each lookup is its own call.

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

***

### ❓ Frequently Asked Questions

**Q: How many products are there?**
A: 2,728 when we last counted, across 20 shop categories and 547 brands. About 1,216 had at least one variant in stock.

**Q: Do I need an API key or a shop login?**
A: No. Paste a search term or a product address and press Start.

**Q: Which fields need Product Detail rather than Catalogue Search?**
A: The EAN barcode and the unit price. Everything else — price, brand, category, images, stock, SKU, weight, description — comes straight from a search row.

**Q: Are sold-out products included?**
A: Yes by default, with `inStock` set to false, because a sold-out product still tells you what the shop carries. Switch on **In stock only** to drop them.

**Q: Are prices in euros and do they include VAT?**
A: Prices are in euros exactly as the shop publishes them, which is the gross price a German shopper pays.

**Q: Why do some rows have a category like "Pfand" or "NOTONSALE"?**
A: Those are the shop's own internal category names, reported unchanged rather than guessed at. "Pfand" is a deposit item and "TK" means frozen. The category dropdown offers only the real product shelves.

**Q: Can I get one row per size instead of one per product?**
A: Rows are one per product, which is what you are charged for. Every variant travels inside the row's `variants` list with its own SKU, price and stock, and 248 of every 250 products have only one variant anyway.

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

***

### 🐛 Troubleshooting

**A search returns nothing**

- The shop is German. "nudeln" finds more than "instant noodles".
- Widen the category to **Any**.
- Switch off **In stock only**. More than half the catalogue is sold out at any moment.

**A product address returns "no longer in the shop"**

- The shop has dropped that handle. Run Catalogue Search for the product name to find what replaced it.
- Check you pasted a product address, not a collection address.

**I only got 25 rows**

- That is the free-tier cap. Add credits or a payment method in Apify Console to lift it.

**The run stopped before Max products**

- The shop has fewer matching products than your cap. Check the run report — it says how many were scanned.

**The shop is temporarily unavailable**

- Every request already retries five times with backoff. Wait a few minutes and run it again.

***

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

MAOMAO and mao-mao.de are trademarks of their respective owner. This actor is not affiliated with, endorsed by, or sponsored by MAOMAO.

***

### 🤝 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`):

Pick one per run. Catalogue Search walks the shop and returns many products per call. Product Detail takes product URLs and returns one row each, with the EAN barcode and the price-per-litre/kilo that the catalogue listing does not carry.

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

Words to look for. A product is returned when a term appears in its name, brand, category, tags or description — so 'ramen' also catches 'Shin Ramyun'. Terms are combined with OR: 'ramen' plus 'kimchi' returns both. Leave this empty and the run returns the whole catalogue, newest products first.

## `category` (type: `string`):

Narrow the run to one shelf of the shop. These are the shop's own categories, in its own German wording, so what you pick is what the storefront shows. Any category leaves the filter off. Combine it with search terms to get, say, only the drinks that mention 'tea'.

## `collectionUrls` (type: `array`):

Paste collection page addresses copied from the shop, for example https://mao-mao.de/collections/bestseller. Only those collections are read, which is much faster than walking the whole shop. Leave it empty to search everything. Search terms and the category filter still apply on top.

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

Skip products where every variant is sold out. Worth knowing before you switch it on: 1,531 of the 2,728 products carried the shop's sold-out tag when the catalogue was last counted, so this roughly halves the rows you get back — and the rows you pay for.

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

Stop after this many products. The run ends as soon as the number is reached, so it is also your spending ceiling. The whole shop is about 2,728 products; set 5000 to be sure of getting all of them even as the shop grows.

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

Product page addresses copied from the shop, for example https://mao-mao.de/products/heng-shun-schwarzer-essig-chinkiang-550-ml. Each one returns a single row carrying the EAN barcode and the price per litre or kilo, neither of which appears in a catalogue search row. A bare product handle works too.

## Actor input object example

```json
{
  "operation": "search",
  "searchTerms": [
    "ramen",
    "kimchi"
  ],
  "category": "Any",
  "collectionUrls": [
    "https://mao-mao.de/collections/asiatische-nudeln"
  ],
  "inStockOnly": false,
  "maxItems": 100,
  "productUrls": [
    "https://mao-mao.de/products/heng-shun-schwarzer-essig-chinkiang-550-ml"
  ]
}
```

# Actor output Schema

## `maomaoMaoMaoDeProducts` (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": "search",
    "searchTerms": [
        "ramen"
    ],
    "category": "Any",
    "inStockOnly": false,
    "maxItems": 100,
    "productUrls": [
        "https://mao-mao.de/products/heng-shun-schwarzer-essig-chinkiang-550-ml"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/mao-mao-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": "search",
    "searchTerms": ["ramen"],
    "category": "Any",
    "inStockOnly": False,
    "maxItems": 100,
    "productUrls": ["https://mao-mao.de/products/heng-shun-schwarzer-essig-chinkiang-550-ml"],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/mao-mao-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": "search",
  "searchTerms": [
    "ramen"
  ],
  "category": "Any",
  "inStockOnly": false,
  "maxItems": 100,
  "productUrls": [
    "https://mao-mao.de/products/heng-shun-schwarzer-essig-chinkiang-550-ml"
  ]
}' |
apify call sian.agency/mao-mao-product-scraper --silent --output-dataset

```

## MCP server setup

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