{
  "openapi": "3.0.1",
  "info": {
    "title": "asia4friends Scraper - Asian Grocery Prices & Stock",
    "description": "Export the asia4friends catalogue: prices, per-kilo prices, EAN barcodes, stock counts, ingredients, nutrition and origin for 1,343 Asian grocery products sold in Germany.",
    "version": "1.0",
    "x-build-id": "UE7IfmbDaTKEb7pSE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~asia4friends-product-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-asia4friends-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~asia4friends-product-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-asia4friends-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~asia4friends-product-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-asia4friends-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": "🎛️ Operation",
            "enum": [
              "catalog",
              "productDetail"
            ],
            "type": "string",
            "description": "Catalogue searches the shop for your keywords, or walks the departments you name, and returns one row per product with price, EAN barcode, brand, article number, image and in-stock state. Product detail takes product page links and returns one deeper row each. That row adds the published price per kilo, the live stock count, pack content and the delivery window, plus the food label: ingredients, nutrition, country of origin, distributor, best-before date, the description and customer reviews.",
            "default": "catalog"
          },
          "searchTerms": {
            "title": "🔍 Search terms",
            "type": "array",
            "description": "German search words, one per line. The shop is German, so German words find the most: kimchi returned 26 products, sauce returned over 250, and ramen, sojasauce, kokosmilch, mochi, reispapier, curry and gochujang all return their own shelves. Each term is searched separately and every product it returns becomes a row. Clear this field AND leave the department links empty to export the whole shop instead - all 1,343 products. Ignored in product detail mode.",
            "default": [
              "kimchi"
            ],
            "items": {
              "type": "string"
            }
          },
          "categoryUrls": {
            "title": "📂 Department links",
            "type": "array",
            "description": "Optional. Paste department links such as https://asia4friends.de/saucen or https://asia4friends.de/frisch-kuehlware to take whole shelves instead of searching. Sub-shelves work too and resolve under either address, so /gemuese and /konserviert/gemuese return the same 97 products. One caution: themenwelten is a cuisine cross-cut over the same catalogue, not a tenth department, so taking it alongside the others returns about 600 products you already have and charges for them twice.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "↕️ Sort listings by",
            "enum": [
              "shopDefault",
              "priceDesc",
              "nameAsc",
              "nameDesc"
            ],
            "type": "string",
            "description": "The order the shop returns products in, which decides what you get when the maximum cuts the run short. Every option here was checked against real listings before it was offered. Cheapest first is deliberately absent: the shop accepts a value for it and then does not honour it, and an option that silently does nothing is worse than no option. Applies to search terms and department links alike; ignored in product detail mode.",
            "default": "shopDefault"
          },
          "inStockOnly": {
            "title": "✅ In-stock products only",
            "type": "boolean",
            "description": "Off by default, on purpose. 1,173 of the 1,343 products were in stock when this was built and 170 were not. Hiding the sold-out ones would drop about one product in eight from a live grocery catalogue, and that is data most people asked for: a sold-out line is exactly what an assortment or availability report is looking for. Switch this on when you only want what can be ordered today. Skipped products are never charged.",
            "default": false
          },
          "productUrls": {
            "title": "🔗 Product page links",
            "type": "array",
            "description": "Product page links to read in detail. Required when the operation is product detail, ignored otherwise. Each link returns one row carrying the published price per kilo, the live stock count and its unit, pack content and the delivery window. It also carries ingredients, the full nutrition table, country of origin, distributor, best-before date, the description, every gallery image and the reviews. Catalogue rows carry the product link, so a catalogue run feeds this field directly.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "🔢 Maximum products",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Upper bound on the products a run returns, and therefore on what it can charge. The whole shop is 1,343 products, so raise this to 1500 for a complete export and clear both the search terms and the department links. Reached, the run stops and reports the cap in the run report.",
            "default": 25
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}