{
  "openapi": "3.0.1",
  "info": {
    "title": "MAOMAO Scraper - Asian Grocery Products & Prices",
    "description": "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.",
    "version": "1.0",
    "x-build-id": "rAkKtsvTdsQQwKymr"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~mao-mao-product-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-mao-mao-product-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/sian.agency~mao-mao-product-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-mao-mao-product-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/sian.agency~mao-mao-product-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-mao-mao-product-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "operation": {
            "title": "🎯 What do you want to scrape?",
            "enum": [
              "search",
              "productDetail"
            ],
            "type": "string",
            "description": "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.",
            "default": "search"
          },
          "searchTerms": {
            "title": "🔑 Search terms",
            "type": "array",
            "description": "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.",
            "default": [
              "ramen"
            ],
            "items": {
              "type": "string"
            }
          },
          "category": {
            "title": "🗂️ Category",
            "enum": [
              "Any",
              "Snacks",
              "Instant Noodles",
              "Saucen, Öle, Essig, Gewürze & Pasten",
              "Drinks",
              "TK",
              "Reis, Nudeln & Mehl",
              "Konserven",
              "Feinkost"
            ],
            "type": "string",
            "description": "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'.",
            "default": "Any"
          },
          "collectionUrls": {
            "title": "🧺 Collection URLs",
            "type": "array",
            "description": "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.",
            "items": {
              "type": "string"
            }
          },
          "inStockOnly": {
            "title": "✅ In stock only",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "maxItems": {
            "title": "🔢 Max products",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "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.",
            "default": 100
          },
          "productUrls": {
            "title": "🔗 Product URLs",
            "type": "array",
            "description": "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.",
            "default": [
              "https://mao-mao.de/products/heng-shun-schwarzer-essig-chinkiang-550-ml"
            ],
            "items": {
              "type": "string"
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}