# MAM Shop Scraper - Asian Grocery Products & Prices (`sian.agency/mam-shop-product-scraper`) Actor

Produkte von mam-shop.de als sauberes JSON: Preise, Marken, Regale, Lagerbestand, Varianten und EAN-Codes. Ohne Code, ohne Login.

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

## MAM Shop 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)

#### 🎉 A whole MAM shelf in one call: prices, brands, stock, variants and EAN codes

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

***

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

The **MAM Shop Scraper** turns the public MAM storefront at mam-shop.de, the online shop of Modern Asia Market, the German-Austrian Asian grocery chain, 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 shelf, stock read per variant, article number, shipping weight, the German product copy and every published photo. Product Detail adds the EAN barcode, which the catalogue page never carries and which lets a row be matched to the same article at another retailer.

**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: what MAM publishes at mam-shop.de. The Austrian storefront at mam-shop.at is a separate catalogue and its addresses are rejected rather than read against the German shop. 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/mam-shop-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 MAM sells at mam-shop.de and what it costs using the Apify Actor `sian.agency/mam-shop-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 shelf, stock read per variant, article number, shipping weight, the German product copy and every published photo. Product Detail adds the EAN barcode, which the catalogue page never carries and which lets a row be matched to the same article at another retailer.

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 read the shop. `category` picks one of the shop's own shelves (instant noodles, snacks, drinks, sauces, mochis, tea and more), and that shelf has its own page, so it is one call instead of twenty. `Any` reads the full product feed instead, which also holds discontinued articles. `searchTerms` is a list of words matched against the product name, brand, shelf tags and the German description, combined with OR, and an empty list returns everything in the chosen scope. `collectionUrls` points the run at any other shop page, including brand and seasonal shelves. `inStockOnly` is on by default and drops articles where every variant is sold out. Worth leaving on, because only 781 of the 4,812 products in the feed have stock. `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.

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

Ask me what I am looking for, which shelf it sits on, 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:**

- *List every Samyang Buldak product MAM has in stock, with price and pack size.*
- *Pull the whole drinks shelf and tell me which items are discounted right now.*
- *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/mam-shop-product-scraper.md](https://apify.com/sian.agency/mam-shop-product-scraper.md).

### 📋 Overview

**MAM (Modern Asia Market) is a German-Austrian Asian grocery chain** with stores in Vienna, Hamburg and Oberhausen and an online shop at mam-shop.de. The product feed held 4,812 articles across 968 brands when it was counted on 2026-09-10. This actor reads the storefront and hands you the catalogue as clean JSON.

**Why people use it:**

- ✅ **Shelves, not a raw dump**: pick one of the shop's own shelves and get what it actually sells today. Every shelf sampled was 99–100% in stock
- ⚡ **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. Only 781 of the 4,812 articles in the full feed had stock, so the in-stock filter is on by default and you do not pay for rows nobody can buy
- 💰 **$0.90 per 1,000 products**: below every German grocery scraper we measured, which sit between $2.00 and $5.00
- 💎 **EAN barcodes**: the field that lets a row be matched to the same article at Amazon, Rewe or your own catalogue. The shop's own SKU cannot do it, because all 4,750 are internal 21xxxxxxxxxxx codes
- ✨ **Sale detection that means something**: 2,305 variants carry a crossed-out price but only 1,277 are genuinely above today's price. Only those are reported as a discount

***

### ✨ Features

- 🗂️ **Shelf picker**: 16 of the shop's own shelves, from instant noodles and chips to mochis, tea, soju and sauces. Each has its own page, so a shelf is one call rather than twenty
- 🔍 **Keyword search**: terms match the product name, brand, shelf tags and the German description, combined with OR
- 🧺 **Shelf addresses**: paste any of the shop's 121 collection pages, including brand shelves like Samyang Buldak and Nongshim, and seasonal ones
- ✅ **In-stock filter**: on by default. Switch it off to get the archive of discontinued articles as well
- 📦 **Full variant detail**: every size and flavour with its own SKU, price, weight and stock, inside the product row
- 📇 **EAN barcodes**: Product Detail adds the barcode the catalogue never carries
- 🖼️ **Product images**: every photo the shop publishes, at full resolution
- 📝 **German product copy**: descriptions, ingredients, nutrition and preparation notes as plain text
- 📄 **Run report**: an HTML summary in your key-value store showing what came back and what to fix

***

### 🎬 Quick Start

Pick a shelf or a search term, press Start. Results land in your dataset as JSON, CSV or Excel. A first run with the defaults returns about a hundred in-stock products.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~mam-shop-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 read a shelf or filter the shop. Switch to **Product Detail** when you have specific product addresses and want EAN codes.

#### Step 2: Narrow it down

Pick a shelf, add search terms, or paste shelf 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, shelf, 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 everything in the chosen scope. |
| `category` | string | No | One of the shop's 16 shelf handles, or `Any` for the full feed. |
| `collectionUrls` | array | No | Shelf addresses to read instead of the shelf picker. |
| `inStockOnly` | boolean | No | Skip articles where every variant is sold out. Defaults to `true`. |
| `maxItems` | integer | No | Stop after this many products. Defaults to 100. |
| `productUrls` | array | No | Product addresses for the `productDetail` operation. |

**Example: one shelf, keyword-filtered**

```json
{
  "operation": "search",
  "searchTerms": ["ramen"],
  "category": "instant-noodles",
  "inStockOnly": true,
  "maxItems": 100
}
```

**Example: everything in stock**

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

**Example: product detail with EAN codes**

```json
{
  "operation": "productDetail",
  "productUrls": [
    "https://mam-shop.de/products/samyang-buldak-hot-chicken-ramen-5x140g",
    "https://mam-shop.de/products/hikari-miso-instant-miso-miso-soup-3-servings-60g"
  ]
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **20+ 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 Nongshim to the shop's own Modern Asia Market label |
| `shelf` | string | The shop's own shelf name, in German where the shop uses German |
| `sku` | string | The shop's internal article number. Not the EAN. |
| `barcode` | string | EAN or GTIN. Product Detail only, and not every article has one. |
| `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 |
| `tags` | array | The shop's own shelf tags for this product |
| `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": 11237582602582,
  "productName": "SAMYANG Buldak Hot Chicken Ramen 5x140G",
  "handle": "samyang-buldak-hot-chicken-ramen-5x140g",
  "productUrl": "https://mam-shop.de/products/samyang-buldak-hot-chicken-ramen-5x140g",
  "brand": "SAMYANG",
  "shelf": "Instant Noodles",
  "price": 9.99,
  "compareAtPrice": null,
  "onSale": false,
  "currency": "EUR",
  "inStock": true,
  "sku": "2100000035359",
  "weightGrams": 700,
  "variantCount": 1,
  "imageUrl": "https://cdn.shopify.com/s/files/1/0880/0652/5270/files/8801073140578_1.webp",
  "imageCount": 1,
  "tags": ["Instant Noodles", "Ramen & Instantnudeln", "backinstock"],
  "descriptionText": "SAMYANG Buldak Hot Chicken Ramen 5x140G sind extrem scharfe Instant-Nudeln aus Südkorea...",
  "shop": "MAM"
}
```

***

### 💼 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, one run per shelf
**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:** Up to 4,812 articles across 968 brands, with the discontinued ones flagged rather than hidden
**Use:** Rank brands by shelf presence, find the gaps in your own range, shortlist suppliers

#### 3. Cross-Retailer Price Comparison

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

**Input:** Product Detail with the product addresses you care about
**Output:** The EAN barcode for each one, alongside price, weight and pack size
**Use:** Join on the EAN, compare like for like, 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. Korean and Japanese Food Trend Tracking

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

**Input:** Shelf addresses for the Buldak, Nongshim, bestseller and top-deal 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 shelf, one run per shelf
**Output:** Shelf-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/mam-shop-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/mam-shop-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~mam-shop-product-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "productDetail", "productUrls": ["https://mam-shop.de/products/samyang-buldak-hot-chicken-ramen-5x140g"]}'
```

#### 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: a whole shelf, or the whole feed
- No delays between pages
- Pay per product returned: a shelf 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/mam-shop-product-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How many products are there?**
A: 4,812 in the shop's product feed on 2026-09-10, across 968 brands and 121 shelves. Only 781 of them had a variant in stock. The feed keeps discontinued articles; the shelves do not.

**Q: Do I need an API key or a shop login?**
A: No. Pick a shelf or paste a search term and press Start.

**Q: Why does "Any" return so many sold-out products?**
A: Because "Any" reads the full product feed, which still lists articles the shop has stopped selling. That is why **In stock only** is on by default. Picking a shelf avoids the problem entirely: every shelf we sampled was 99–100% in stock.

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

**Q: Why is the SKU not the EAN?**
A: Because the shop uses its own numbering. All 4,750 SKUs in the feed start 21 and are internal article numbers. The real barcode only appears on the product page, which is what Product Detail reads.

**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: What about mam-shop.at?**
A: That is the chain's Austrian storefront, a separate catalogue with its own prices. Addresses from it are rejected rather than read against the German shop, so a run never silently mixes the two.

**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 the shop measured 1.001 variants per product, so this almost never differs.

**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".
- Set the shelf back to **Any**, which searches the full feed.
- Switch off **In stock only**. The full feed is mostly discontinued articles, and they are hidden by default.

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

- The shop has taken that article down. Two of every thirty feed addresses we sampled were already gone, and both were sold out. Run Catalogue Search on the shelf to find what replaced it.
- Check you pasted a product address, not a shelf 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/).

MAM, Modern Asia Market and mam-shop.de are trademarks of their respective owner. This actor is not affiliated with, endorsed by, or sponsored by Modern Asia Market.

***

### 🤝 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 addresses and returns one row each, with the EAN barcode 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, shelf 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 everything in the chosen shelf, newest products first. Measured on 2026-09-10: 'ramen' matched 770 products, 180 of them in stock.

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

Take one shelf of the shop instead of the whole feed. These are the shop's own shelves, in its own German wording, and the counts in brackets were measured on 2026-09-10. Two things worth knowing. A shelf is what the shop sells today; every shelf sampled was 99-100% in stock. 'Any' reads the full product feed instead, which also holds discontinued articles: 4,812 products of which only 781 had stock. A shelf is also far cheaper, because one call covers it. Search terms still apply on top.

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

Paste shelf addresses copied from the shop, for example https://mam-shop.de/collections/samyang-buldak-ramen-noodles. Only those shelves are read, which is much faster than walking the whole feed and reaches the 121 shelves the Shelf list does not name: brand pages, seasonal shelves, bundles. Leave it empty to use the Shelf setting instead. Search terms still apply on top.

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

Skip products where every variant is sold out. On by default, because the shop's full product feed keeps discontinued articles: 4,812 products were in it on 2026-09-10 and only 781 had stock. Switch it off to get the archive as well. That is useful for tracking what a shop used to carry, though most of those rows cannot be bought.

## `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 feed is about 4,812 products and about 781 of them are in stock; set 5000 to be sure of taking all of them even as the shop grows.

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

Product page addresses copied from the shop, for example https://mam-shop.de/products/samyang-buldak-hot-chicken-ramen-5x140g. Each one returns a single row carrying the EAN barcode, which no catalogue search row has. A bare product handle works too. Addresses of discontinued articles can come back as 'no longer in the shop'. Two of thirty sampled did.

## Actor input object example

```json
{
  "operation": "search",
  "searchTerms": [
    "ramen",
    "kimchi"
  ],
  "category": "Any",
  "collectionUrls": [
    "https://mam-shop.de/collections/samyang-buldak-ramen-noodles"
  ],
  "inStockOnly": true,
  "maxItems": 100,
  "productUrls": [
    "https://mam-shop.de/products/samyang-buldak-hot-chicken-ramen-5x140g"
  ]
}
```

# Actor output Schema

## `mamModernAsiaMarketMamShopDeProducts` (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": true,
    "maxItems": 100,
    "productUrls": [
        "https://mam-shop.de/products/samyang-buldak-hot-chicken-ramen-5x140g"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/mam-shop-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": True,
    "maxItems": 100,
    "productUrls": ["https://mam-shop.de/products/samyang-buldak-hot-chicken-ramen-5x140g"],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/mam-shop-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": true,
  "maxItems": 100,
  "productUrls": [
    "https://mam-shop.de/products/samyang-buldak-hot-chicken-ramen-5x140g"
  ]
}' |
apify call sian.agency/mam-shop-product-scraper --silent --output-dataset

```

## MCP server setup

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