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

Produkte von momogo.de als sauberes JSON: Preise, Grundpreis, EAN, Lagerbestand, Zutaten, Nährwerte, Bewertungen. Ohne Code, ohne Login.

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

## momogo Scraper 🍜 Asian Grocery Products, Prices, EAN & Nutrition

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Google Shopping Price Tracker](https://img.shields.io/badge/Store-Google%20Shopping%20Price%20Tracker-1AE392)](https://apify.com/sian.agency/google-shopping-price-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) [![BAUHAUS Product Scraper](https://img.shields.io/badge/Store-BAUHAUS%20Product%20Scraper-1AE392)](https://apify.com/sian.agency/bauhaus-product-scraper?fpr=sian)

#### 🎉 All 3,202 momogo products in about ninety seconds, with the EAN and the nutrition table on every row

##### For price monitors, sourcing teams and anyone tracking Korean, Japanese and Asian food in Germany

Most Shopify scrapers return nothing for this shop. momogo.de runs a separate front end, so the address they all read answers with a 404 and the run ends empty. This actor uses the route the shop's own website uses. It also picks up what the product records leave out: the German description, the ingredients list and the nutrition table live elsewhere on the shop, and are fetched alongside the catalogue at no extra charge.

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

The **momogo Asian Grocery Scraper** turns the full momogo.de product catalogue — prices, unit prices, EAN, stock, ingredients and nutrition 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:** products from momogo.de as rows. Each one carries the euro price, the crossed-out price and the discount, plus the price per 100 g or 100 ml on the total pack contents. Identity comes next: the EAN, the shop's own SKU, the country of origin and the product type. Then the content the shop writes itself — the German description, the highlight bullets, the full ingredients list and the nutrition table per 100 g. Stock is a flag and a unit count on every row, and sold-out products are returned by default, because the shop keeps them in its catalogue and the difference between two runs is a restock feed. Rows also carry the pack size, the best-before flag, the average rating and review count, every image, and each size variant with its own SKU, price and stock.

**Use something else when:** the shop is not momogo.de. Use [Google Shopping Price Tracker](https://apify.com/sian.agency/google-shopping-price-scraper?fpr=sian) for what every German shop charges for the same article, joined on the product rather than on one retailer. Use [Tesco Product Scraper](https://apify.com/sian.agency/tesco-product-scraper?fpr=sian) for supermarket groceries with prices and unit prices, for a mainstream rather than a speciality assortment. Use [BAUHAUS Product Scraper](https://apify.com/sian.agency/bauhaus-product-scraper?fpr=sian) for German DIY and garden retail, same row shape, different vertical. This actor covers the products momogo.de sells: snacks, drinks, instant food, ingredients, kitchenware, recipe boxes, sets and theme boxes — 3,202 of them on 2026-09-10. It reads what the shop serves a visitor. The shop's recipe pages, blog and ingredient guides are not products and are not part of it, and there is no order, delivery or customer data anywhere in the output.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/momogo-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 data and prices from the German Asian grocer momogo.de using the Apify Actor `sian.agency/momogo-product-scraper`.

Use it when I need: products from momogo.de as rows. Each one carries the euro price, the crossed-out price and the discount, plus the price per 100 g or 100 ml on the total pack contents. Identity comes next: the EAN, the shop's own SKU, the country of origin and the product type. Then the content the shop writes itself — the German description, the highlight bullets, the full ingredients list and the nutrition table per 100 g. Stock is a flag and a unit count on every row, and sold-out products are returned by default, because the shop keeps them in its catalogue and the difference between two runs is a restock feed. Rows also carry the pack size, the best-before flag, the average rating and review count, every image, and each size variant with its own SKU, price and stock.

Don't use it when: the shop is not momogo.de — use google-shopping-price-scraper or tesco-product-scraper or bauhaus-product-scraper instead.

How to call it: leave every field at its default to get the shop's 100 best-selling snacks, or set `category` to `Any` and raise `maxItems` to take the whole 3,202-product catalogue. Narrow with `category` (the shop's own product type), `origin` (its country tag — South Korea, Japan, China, Taiwan, Thailand, Vietnam, Indonesia, India) and `theme` (Sweets, Instant Noodle, Halal, Vegan, Bubble Tea, Mochi, Tteokbokki, Matcha and eighteen more); they combine, and every choice carries the number of products it really returns. `searchTerms` runs the shop's own search index and de-duplicates across terms. `sortBy` decides which products you get when `maxItems` stops the run early — best selling, newest, cheapest, most expensive, name or recently changed. `inStockOnly` and `onSaleOnly` are applied to each product's own data, so nothing is charged for a product they drop. To watch a fixed basket instead of searching, put product addresses in `productUrls` — 40 are looked up in a single request.

Start with this input:
{
  "operation": "search",
  "category": "Instant Food",
  "origin": "South Korea",
  "sortBy": "BEST_SELLING",
  "maxItems": 200
}

Ask me which part of the shop to cover — a category, a cuisine, a diet tag or the whole catalogue — whether sold-out products should be included, and how many products the run should stop at, then run the Actor and summarise the results as a table.
```

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

- *List every Korean instant noodle momogo sells under €3, with the price per 100 g and the EAN.*
- *Take the whole catalogue twice a week and tell me which products changed price or went out of stock.*
- *Give me every Halal-tagged product with its full ingredients list and nutrition per 100 g.*
- *Find the reduced products with the biggest markdown, ranked by discount percentage.*

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

### 📋 Overview

momogo.de is a German-language online Asian grocer. Korean ramyeon and tteokbokki, Japanese snacks and mochi, bubble tea kits, konjac jelly, sauces, matcha, cooking boxes and kitchenware. This actor turns that catalogue into rows.

Counted on 2026-09-10:

| | |
|---|---:|
| Products in the catalogue | **3,202** |
| In stock | **2,074** (64.8%) |
| Carrying an EAN barcode | **97.1%** |
| Carrying a German description | **97.9%** |
| Carrying a nutrition table per 100 g | **92.2%** |
| Carrying a rating and review count | **53.6%** |
| Currently reduced | **368** (11.5%) |
| Requests to take the whole catalogue | **27** |

Origin split by the shop's own country tags: South Korea 1,472 · Japan 925 · China 252 · Taiwan 175 · Thailand 129 · Vietnam 56 · Indonesia 29 · India 28.

Sold-out products stay in the shop's catalogue, so a default run returns the whole assortment rather than only what ships today. Run it twice and the difference between the two exports is your restock feed on one side and your discontinuation feed on the other.

### ✨ Features

- **The whole shop, or a slice of it.** One operation. Take all 3,202 products, or narrow by category, country of origin, theme, diet tag, search term or price.
- **EAN on 97.1% of rows, SKU on 100%.** That is what turns a shop feed into something you can join against Amazon, a supermarket or a distributor price list. No fuzzy name matching.
- **Price per 100 g or 100 ml, computed on the total pack contents.** A 70 g pack and a 400 g jar become directly comparable. See the FAQ for why this can differ from the shop's own label on multipacks.
- **Ingredients and nutrition.** The full German ingredients text on 92.4% of products and calories, fat, saturated fat, carbohydrate, sugar, protein and salt per 100 g on 92.2%.
- **Ratings the shop's own product pages show.** Average score and review count on 53.6% of products.
- **Markdowns, with the number.** The current price, the crossed-out price and the discount as a percentage.
- **Stock you can trust.** Each row carries its own availability and unit count. The shop's own in-stock filter does not work: asking it for in-stock and for sold-out returns the identical set, so this actor reads the product's own flag instead.
- **Filters that were checked, not assumed.** Every category, origin and theme in the dropdowns carries the number of products it really returns, and every sort order was verified to change the result.
- **Nothing charged for what you filtered out.** The In-stock and Reduced switches drop rows before they are billed, and the run log and report both say how many.

### 🎬 Quick Start

1. Open the actor and press **Start**. The defaults return the shop's 100 best-selling snacks.
2. Look at the **Output** tab.
3. Change **Category** to `Any` and **Max products** to `4000` to take the whole catalogue.

No API key, no login, no proxy configuration.

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose what to take

Pick a **Category** (the shop's own product type), a **Country of origin**, or a **Theme or diet** tag. They combine: Snacks alone returns 1,114 products, Snacks from South Korea returns 418, Snacks from Japan returns 414. Set Category to `Any` and leave the rest alone to walk the whole shop.

Prefer to search? Put words in **Search terms**. They run against the shop's own search index, and several terms are combined and de-duplicated so a product is never returned twice.

#### Step 2: Narrow it down, or watch a fixed basket

**In-stock products only** and **Reduced products only** filter the rows the shop returns; anything they drop is never charged. **Order** decides which products you get when **Max products** stops the run early.

To watch a fixed list instead of searching, paste product addresses into **Specific products**. Up to 40 are looked up in a single request, which is what makes daily price monitoring cheap.

#### Step 3: Press Start and export

Results land in the dataset as flat JSON. Export as CSV, JSON, Excel or pull them over the API. An HTML run report with the numbers, the failed items and what the run cost is saved to the key-value store.

### 📥 Input Configuration

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchTerms` | list of words | *(empty)* | Words to look for, run against the shop's own search index. Terms are combined with OR and de-duplicated. Measured: `ramen` 257 products, `mochi` 103, `tteokbokki` 72, `bubble tea` 62. |
| `category` | select | `Snack` | The shop's product type: Snacks (1,114), Drinks (733), Ingredients (688), Instant food (488), Home (52), Recipe boxes (47), Sets (35), Theme boxes (31), or `Any` for all 3,202. |
| `origin` | select | `Any` | The shop's country tag: South Korea (1,472), Japan (925), China (252), Taiwan (175), Thailand (129), Vietnam (56), Indonesia (29), India (28). |
| `theme` | select | `Any` | 24 theme and diet tags with real counts: Sweets (656), Vegetarian (423), Instant Noodle (365), Halal (313), Low Calorie (253), Vegan (163), Sugar Free (145), Gluten Free (110), Mochi (103), Matcha (90), Bubble Tea (62), Kimchi (44) and more. |
| `productUrls` | list of addresses | *(empty)* | Watch named products instead of searching. 40 addresses per request. When set, the search fields are ignored. |
| `inStockOnly` | switch | `false` | Keep only products that can be bought today. Off by default: the sold-out half is real catalogue data. |
| `onSaleOnly` | switch | `false` | Keep only products sold below their normal price. 368 of 3,202 on 2026-09-10. |
| `sortBy` | select | `BEST_SELLING` | Best selling, newest, cheapest, most expensive, name A–Z, recently changed, or the shop's own order. |
| `maxItems` | number | `100` | Stop after this many products. Also your spending ceiling. `4000` takes everything with room to grow. |

**Example: every Korean instant noodle, cheapest first:**

```json
{
  "operation": "search",
  "category": "Instant Food",
  "origin": "South Korea",
  "sortBy": "PRICE_ASC",
  "maxItems": 500
}
```

**Example: the whole catalogue**

```json
{
  "operation": "search",
  "category": "Any",
  "maxItems": 4000
}
```

### 📤 Output

One row per product. Flat JSON, exportable as CSV, JSON, Excel or over the API.

| Field | What it is |
|---|---|
| `productName` | The product name as the shop writes it |
| `priceEur` · `compareAtPriceEur` · `onSale` · `discountPercent` | The current price, the crossed-out price, whether it is reduced and by how much |
| `unitPriceEur` · `unitPriceBasis` | Price per 100 g or 100 ml, on the total contents of the pack |
| `currency` | Always `EUR` |
| `inStock` · `inventoryQuantity` | Whether it can be bought today, and how many units are left |
| `category` | The shop's product type |
| `originCountry` · `originCountries` | The shop's country tag. 119 of 3,202 products carry more than one (the multi-cuisine boxes), so both the primary and the full list are returned |
| `brandName` | The vendor the shop credits |
| `sku` · `barcode` | The shop's own article number and the EAN |
| `netContent` · `netContentUnit` · `packQuantity` · `packsPerItem` | Total contents in g or ml, and how the pack is made up |
| `weightKg` | Shipping weight |
| `descriptionText` · `keyPoints` | The German product description and its highlight bullets |
| `ingredientsText` | The full ingredients list |
| `nutritionPer100g` | Calories, fat, saturated fat, carbohydrate, sugar, protein and salt |
| `bestBeforeDate` | The best-before flag where the shop publishes one |
| `ratingAverage` · `reviewCount` | The score and the number of reviews on the shop's product page |
| `themeTags` | Every tag the shop attaches to the product |
| `imageUrl` · `imageUrls` | The main image and the full set |
| `variantCount` · `variants` | Size variants, each with its own SKU, EAN, price and stock |
| `productUrl` · `productSlug` · `productId` | Where the product lives and how to identify it |
| `shopUpdatedAt` | When the shop last changed the product, which is what change detection keys on |

**A real row:**

```json
{
  "productName": "ECA Gochugaru 100g - Rote Chiliflocken",
  "priceEur": 4.94,
  "compareAtPriceEur": 5.49,
  "onSale": true,
  "discountPercent": 10,
  "unitPriceEur": 4.94,
  "unitPriceBasis": "per 100 g",
  "inStock": true,
  "inventoryQuantity": 7358,
  "category": "Ingredient",
  "originCountry": "South Korea",
  "sku": "IG-0001-1",
  "barcode": "X001M8XOHN",
  "netContent": 100,
  "netContentUnit": "g",
  "ingredientsText": "rote Chili",
  "nutritionPer100g": { "calories": "1594KJ/378Kcal", "fat": "10", "carbohydrate": "57", "protein": "15", "salt": "0" },
  "bestBeforeDate": "2028-02-28",
  "ratingAverage": 4.4,
  "reviewCount": 9,
  "productUrl": "https://www.momogo.de/produkt/gochugaru"
}
```

### 💼 Use Cases & Examples

#### 1. Price and Markdown Monitoring

Take a category or a fixed basket on a schedule and watch what moves: the current price against the crossed-out one, the discount as a percentage, and the price per 100 g that makes a 70 g pack comparable with a 400 g jar. 368 of 3,202 products carried a markdown on 2026-09-10.

#### 2. Assortment and Sourcing Research

Map what a German Asian grocer actually stocks, by product type, by country of origin and by theme. 1,472 products are Korean, 925 Japanese, 252 Chinese; 313 are tagged Halal, 163 Vegan and 110 Gluten Free.

#### 3. Competitive Price Benchmarking on EAN

97.1% of products carry an EAN and 100% a SKU. The same Samyang Buldak pack sold by momogo, by Amazon and by a supermarket can be joined on the barcode rather than on a fuzzy product-name match.

#### 4. Product Feed with Ingredients and Nutrition

German names and descriptions, highlight bullets, the full ingredients list, the nutrition table per 100 g, pack size, net content, images, weights, prices and stock. Enough to load straight into a comparison site, a dropshipping catalogue or a food-labelling database.

#### 5. Stock, Restock and Discontinuation Tracking

Run it daily and the difference between two exports is your restock feed on one side and your discontinuation feed on the other. 1,128 products were sold out on 2026-09-10.

#### 6. Diet and Allergen Research

Halal, Vegan, Vegetarian, Gluten Free, Sugar Free and Low Calorie are the shop's own tags, and every row carries the ingredients text behind them. Useful for anyone auditing a speciality assortment against a dietary standard.

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('sian.agency/momogo-product-scraper').call({
  operation: 'search',
  category: 'Instant Food',
  origin: 'South Korea',
  sortBy: 'BEST_SELLING',
  maxItems: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const p of items) {
  console.log(p.productName, p.priceEur, p.unitPriceEur, p.barcode);
}
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("sian.agency/momogo-product-scraper").call(run_input={
    "operation": "search",
    "theme": "Halal",
    "category": "Any",
    "maxItems": 500,
})

for p in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(p["productName"], p["priceEur"], p.get("barcode"))
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~momogo-product-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "operation": "search",
    "category": "Snack",
    "origin": "Japan",
    "sortBy": "BEST_SELLING",
    "maxItems": 100
  }'
```

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

Run it on a schedule and push the rows straight into your own stack:

- **N8N.** An HTTP Request node against `run-sync-get-dataset-items`, then a Compare Datasets node against yesterday's export to emit only the price changes.
- **Zapier.** Schedule → Apify (Run Actor) → Google Sheets, appending the reduced products every morning.
- **Make.** Apify → Iterator → Airtable, keeping a live product feed with images and EANs.

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

Free Apify accounts get a capped run of up to 25 products, so you can see the row shape before spending anything. A run that matches nothing is never charged.

#### PAID Tier (Production Ready)

Unlimited rows, charged per product returned. The whole 3,202-product catalogue walks in about 27 requests and ninety seconds, so a full nightly export is one short run.

Nothing is charged for a product your own In-stock or Reduced switches drop, for an address the shop no longer publishes, or for a search that matched nothing. The run report itemises exactly what the run cost.

### ❓ Frequently Asked Questions

**How many products are there?**

3,202 on 2026-09-10, of which 2,074 (64.8%) were in stock. The shop keeps sold-out products in its catalogue, which is why a default run returns all of them.

**Do I need an API key or a login?**

No. Pick a category and press Start.

**Why do so many other Shopify scrapers return nothing for this shop?**

Because they all read the same address, `/products.json`, and on momogo.de that address returns 404. The shop runs a separate front end, so the usual route simply is not there. This actor uses the route the shop's own website uses.

**Is there a separate operation, or a surcharge, for the descriptions and nutrition?**

No. The German description, the highlight bullets, the ingredients, the nutrition table, the pack size, the rating and the review count arrive on every row at no extra charge. They are fetched 500 products at a time alongside the catalogue, so charging a second event for them would be charging twice for the same row.

**The price per 100 g does not match what the shop's page shows. Which is right?**

Both are arithmetic on the same numbers, on a different basis, and they only differ on multipacks, 273 of 3,202 products. The shop divides the price by the size of ONE pack and ignores how many packs are in the box, which is why its own page prints €383 per 100 g for a 30 × 3 g ginseng tea that costs €11.49. This actor divides by the total contents (90 g), giving €12.77, because that is the number a price comparison needs. Every row also carries `packQuantity`, `packsPerItem` and `netContent`, so the shop's own label can be reproduced exactly if you want it.

**Are prices in euros and do they include VAT?**

Prices are in euros exactly as the shop publishes them, which is the gross price a German shopper pays: 7% VAT on most food, 19% on the rest.

**Can I get one row per pack size?**

Rows are one per product, which is what you are charged for. 378 of 3,202 products have variants, and every variant travels inside the row with its own SKU, EAN, price and stock, so a product sold in three sizes is one row and one charge rather than three.

**Why is there no in-stock filter on the shop's side?**

There is one, but it does not work: asking the shop for in-stock products and for sold-out products returns the identical 2,080 products, neither of which is the real answer. So this actor reads each product's own stock flag instead, which is accurate, and applies the switch itself.

**I filtered to Japan but some rows say South Korea. Why?**

Because 119 of 3,202 products carry more than one country tag — the multi-cuisine boxes are tagged for every cuisine they draw on. The filter matched the tag you asked for; `originCountry` reports the first in the shop's own order, and `originCountries` lists all of them, so you can see exactly which tags a row really has.

**Why is "oldest first" not an ordering option?**

Because it returns the shop's own order byte for byte, so it would be the same choice under two names. Every order that IS offered was verified to change the result.

### 🐛 Troubleshooting

**My run returned no rows.**

Probably nothing is wrong. The filters combine, so a narrow combination can genuinely have no members. Snacks alone returns 1,114, Snacks from South Korea 418, and Snacks from India none at all. The dataset carries a row explaining which combination came back empty, and you were not charged for it. Widen one field at a time.

**A product I asked for came back as "no longer in the shop".**

The shop has removed it. Drop the address from Specific products, or search the shop instead to see what replaced it.

**A row has no description, ingredients or nutrition.**

Those come from the shop's own product pages and are not filled in for every product: 97.9% carry a description, 92.4% ingredients and 92.2% nutrition. The rest are genuinely blank on the shop's own site.

**A row has no rating.**

53.6% of products have at least one review. The rest have none, and an empty rating is left empty rather than shown as zero.

**The run stopped before Max products.**

Either the filters ran out of matching products, or a free Apify account hit the 25-row cap. The run log says which.

**The shop is rate-limiting or timing out.**

Lower Max products, or space the runs further apart on a schedule. Every request already retries five times with a growing delay.

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

Yes. This actor reads only what momogo.de publishes to any visitor. It collects no personal data, no customer data and no order data; every field is a product attribute the shop shows on its own pages.

Web scraping of publicly available information is legal in the EU and the US. Prices, images, descriptions, ingredients and nutrition are the shop's own content: you may analyse them, but republishing them wholesale may need the shop's permission. If you plan to redistribute the data, take your own legal advice.

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

### 🤝 Support

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

- 🐛 [Report an issue](https://apify.com/sian.agency/momogo-product-scraper/issues)
- ⭐ [Leave a 5-star review](https://apify.com/sian.agency/momogo-product-scraper/reviews)
- 🛒 [More SIÁN Agency actors](https://apify.com/sian.agency?fpr=sian)

# Actor input Schema

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

One operation. Catalogue Search walks the shop and returns many products per call, with search terms, category, country of origin, theme and price all applied by the shop itself. Every row already carries the German description, the ingredients list, the nutrition table, the pack size, the rating and the review count - those are fetched in bulk alongside the catalogue, not charged separately.

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

Words to look for. The shop matches them against the product name, the brand and its own product keywords. Terms are combined with OR, and each one is run separately then de-duplicated. Measured on 2026-09-10: 'ramen' matched 257 products, 'mochi' 103, 'tteokbokki' 72, 'bubble tea' 62. Leave this empty to take everything in the chosen category, origin and theme.

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

The shop's own top-level product type. Counts in brackets are what each one held on 2026-09-10, sold-out products included. Snacks is the default because it is the largest and the most representative slice of the shop; pick Any to walk all 3,202. Category combines with origin, theme and search terms - Snacks alone returned 1,114, Snacks from South Korea 418, Snacks from Japan 414.

## `origin` (type: `string`):

Take one cuisine's whole range. This is the shop's own country tag, not a guess from the product name, and it covers 3,050 of the 3,202 products. Counts are what each origin held on 2026-09-10. Singapore (13), Malaysia (7) and Hong Kong (1) are left out because a choice that returns almost nothing is worse than no choice - reach those by typing the country into Search terms.

## `theme` (type: `string`):

The shop's own theme and diet tags, with the count each held on 2026-09-10. These are the tags that describe the product, not the packaging - the shop also tags things like 'Plastic bag' and 'Paper box' internally and those are deliberately not offered. Themes below 40 products are left out. The shop's landing pages under /collection/ are built from exactly these tags, so picking Bubble tea here returns the same 62 products as the shop's own Bubble Tea page.

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

Paste product page addresses copied from the shop, for example https://www.momogo.de/produkt/3-15-pm-brown-sugar-bubble-tea-3er-pack. Only those products come back, each one looked up by name in a single request. A bare product slug works too. When this is set, the search, category, origin and theme fields are ignored. An address the shop no longer publishes comes back as 'no longer in the shop', not as an error.

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

Off by default, because this shop keeps sold-out products in its catalogue and the sold-out half is real data: it is what the shop used to sell and what it is about to restock. Measured on 2026-09-10: 2,074 of 3,202 products (64.8%) were in stock. Switch this on for a feed you can put in front of a shopper. Note the shop's own in-stock filter is broken - asking it for in-stock and for sold-out returns the identical 2,080 products - so this switch reads each product's own stock flag instead,…

## `onSaleOnly` (type: `boolean`):

Return only products the shop currently sells below their normal price. Measured on 2026-09-10: 368 of 3,202 products (11.5%) carried a crossed-out price. Every row carries both the current price and the crossed-out one plus the discount as a percentage, so the size of each markdown is visible whether or not this is switched on.

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

The order the shop serves products in, which decides which ones you get when Max products stops the run early. All seven were checked against real payloads on 2026-09-10 and all seven change the result: cheapest-first and most-expensive-first came back strictly monotonic over 20 rows, and the other five each returned a different set of products from the default. One order the shop offers is deliberately missing - 'oldest first' returns the shop's own order byte for byte, so it would be the…

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

Stop after this many products. The run ends as soon as the number is reached, so this is also your spending ceiling. For scale: the whole shop was 3,202 products on 2026-09-10 and 4000 takes all of it with room for the shop to grow. The largest category, Snacks, held 1,114; the largest origin, South Korea, held 1,472.

## Actor input object example

```json
{
  "operation": "search",
  "searchTerms": [
    "ramyeon",
    "mochi"
  ],
  "category": "Snack",
  "origin": "Any",
  "theme": "Any",
  "productUrls": [
    "https://www.momogo.de/produkt/3-15-pm-brown-sugar-bubble-tea-3er-pack"
  ],
  "inStockOnly": false,
  "onSaleOnly": false,
  "sortBy": "BEST_SELLING",
  "maxItems": 100
}
```

# Actor output Schema

## `momogoMomogoDeProducts` (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": [],
    "category": "Snack",
    "origin": "Any",
    "theme": "Any",
    "inStockOnly": false,
    "onSaleOnly": false,
    "sortBy": "BEST_SELLING",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/momogo-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": [],
    "category": "Snack",
    "origin": "Any",
    "theme": "Any",
    "inStockOnly": False,
    "onSaleOnly": False,
    "sortBy": "BEST_SELLING",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/momogo-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": [],
  "category": "Snack",
  "origin": "Any",
  "theme": "Any",
  "inStockOnly": false,
  "onSaleOnly": false,
  "sortBy": "BEST_SELLING",
  "maxItems": 100
}' |
apify call sian.agency/momogo-product-scraper --silent --output-dataset

```

## MCP server setup

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