{
  "openapi": "3.0.1",
  "info": {
    "title": "ROSSMANN.de Scraper - Prices, Reviews & Specials",
    "description": "Scrape ROSSMANN (rossmann.de) drugstore products: current + original strike-through price with discount, per-unit pricing (per 100ml/kg/piece), brand, stock and promo badges, plus full reviews with rating breakdown. Search by keyword, category or Angebote/online-only specials, or paste links.",
    "version": "1.0",
    "x-build-id": "qAZxPfonqIsf0nGSE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~rossmann-de-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-rossmann-de-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/abotapi~rossmann-de-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-rossmann-de-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/abotapi~rossmann-de-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-rossmann-de-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "'search' finds products by keyword, category, and/or the site's own Angebote/online-only specials, with real site filters. 'url' scrapes any product, search-result, category, or specials-listing page URL you paste, walking pagination forward automatically.",
            "default": "search"
          },
          "searchTerm": {
            "title": "Search keyword",
            "type": "string",
            "description": "Free-text keyword, e.g. 'shampoo' or 'zahnpasta'. Combine with Category below to narrow a keyword search, or leave empty and set only Category or Specials category to browse a whole listing."
          },
          "category": {
            "title": "Category (code, name or URL)",
            "type": "string",
            "description": "A ROSSMANN category: the code from a category page URL (olcat...), the category page URL itself, or the category name as shown in the site navigation (e.g. 'Pflege & Duft'). Narrows a keyword search, or browses the whole category when Search keyword is left empty. A name that is not found in the navigation stops the run with a clear error."
          },
          "specialsCategory": {
            "title": "Specials category",
            "enum": [
              "",
              "angebote",
              "online-only"
            ],
            "type": "string",
            "description": "Browse the site's own promotional listings instead of a keyword/category search: 'Angebote' (current weekly deals) or the online-only campaign. Leave as 'None' for a regular keyword/category search.",
            "default": ""
          },
          "brands": {
            "title": "Brands",
            "uniqueItems": true,
            "type": "array",
            "description": "Only return products from these brands, e.g. 'Nivea', 'Balea', 'Isana'. Match the exact brand name as shown on the site. Leave empty for all brands.",
            "items": {
              "type": "string"
            }
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Only return products rated at or above this many stars, 1-5."
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "RELEVANCE",
              "PRICE_ASC",
              "PRICE_DESC",
              "NEWEST",
              "RATING"
            ],
            "type": "string",
            "description": "Order of the returned results.",
            "default": "RELEVANCE"
          },
          "urls": {
            "title": "URLs to scrape",
            "uniqueItems": true,
            "type": "array",
            "description": "Paste ROSSMANN links: product pages (.../p/<ean>), keyword or EAN search pages (/de/search?text=...), category pages (.../c/<code>), or specials listings (/de/angebote/m/<slug>). Pagination continues forward from any pageIndex already in the URL. Brand index pages (/de/marken/c/brands) are not supported and are skipped with a warning. Filter fields above are ignored in this mode. If you leave this list untouched, URL mode scrapes the 11 built-in example links (one per URL shape); clear it and add your own links to scrape only those.",
            "default": [
              "https://www.rossmann.de/de/search?text=nivea%20duschgel",
              "https://www.rossmann.de/de/search?text=nivea%20duschgel&pageIndex=1",
              "https://www.rossmann.de/de/search?text=nivea&sort=sale_price%20asc",
              "https://www.rossmann.de/de/search?text=4006000317779",
              "https://www.rossmann.de/de/pflege-und-duft/c/olcat1_2325036",
              "https://www.rossmann.de/de/pflege-und-duft/c/olcat1_2325036?pageIndex=1",
              "https://www.rossmann.de/de/angebote/m/angebote",
              "https://www.rossmann.de/de/angebote/m/angebote?pageIndex=1",
              "https://www.rossmann.de/de/angebote/m/neu-im-sortiment",
              "https://www.rossmann.de/de/angebote",
              "https://www.rossmann.de/de/pflege-und-duft-nivea-duschgel-vanilla-pecan-praline/p/4006000317779"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch full product detail",
            "type": "boolean",
            "description": "Adds the full breadcrumb category path, description, ingredients, legal/warning notes, media gallery, sibling variants (colours and similar, when the product has any), and article number from the product detail page. Current price, was-price/discount, unit price and rating are already included without this toggle.",
            "default": false
          },
          "fetchReviews": {
            "title": "Fetch reviews",
            "type": "boolean",
            "description": "Fetch each product's reviews, up to Max reviews per product (default 20, at most 1000): overall rating, review count, a full 1-5 rating breakdown, and per-review author/date/rating/title/body. Products with no reviews simply return an empty list.",
            "default": true
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on reviews fetched per product when 'Fetch reviews' is on. 0 = up to 1000 reviews per product; larger values are also limited to 1000.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many result pages per search/category/specials/URL entry. Leave empty for no page limit -- the run stops at Max products total."
          },
          "maxItems": {
            "title": "Max products total",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on total products returned across every search/category/specials/URL entry. 0 = unlimited (still bounded by Max pages per search).",
            "default": 20
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "The default connection works on every Apify plan, including the free tier. A residential connection is optional and only needed for very large or sustained runs.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large crawl of products without returning or charging for products already collected there. Use this after an interrupted run, or when continuing a product catalogue pull in another run. For recurring daily/weekly monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. UPDATED means a product's data moved: price, original price, discount, promotion, unit price, stock status, name, brand, images, descriptions, badges or other product fields (Change scope \"priceAndStock\" narrows this to price and stock only). Ratings, review counts and reviews never make a product UPDATED; they stay in the output. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those products returned (and billed). State is kept separately for each search/category/specials/URL and detail/review setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/category/specials/URL and detail/review settings -- different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged products (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired products (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search -- not when Max products capped it or when Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "changeScope": {
            "title": "Change scope (incremental mode only)",
            "enum": [
              "all",
              "priceAndStock"
            ],
            "type": "string",
            "description": "Which changes make a product UPDATED. \"all\" (default): any change to price, original price, discount, unit price, stock status, name, brand, images, descriptions, badges and other product data. \"priceAndStock\": only price, original price, discount, promotion, unit price and stock/availability changes (and variant stock/price); descriptions, images, badges and labels never create an UPDATED row. Ratings and review counts never decide UPDATED in either scope; they stay in the output. Switching scope under an automatic state key starts a fresh baseline; set a State key to keep one.",
            "default": "all"
          },
          "compactUpdates": {
            "title": "Compact UPDATED rows (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. When on, UPDATED and EXPIRED rows contain only identifiers, the current price and stock status and the old/new values of what moved (priceChanges, variantChanges). NEW rows stay full. Reviews and detail data are not repeated on compact rows and are not charged for them.",
            "default": false
          },
          "expireAfterMissedScans": {
            "title": "Expire after N missed scans (incremental mode only)",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "With \"Emit expired\" on, a product is marked EXPIRED only after it was missing from this many CONSECUTIVE complete scans (default 1). EXPIRED means the product was no longer found in the search results; without opening each product it cannot tell a listing change from a delisting, so use the stock status field for availability.",
            "default": 1
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Field names that never make a product UPDATED or appear in changedFields (they stay in the output). Use a dotted path to ignore a key inside a nested list, e.g. variants.label. Ratings, review counts and reviews are already ignored. Leave empty to compare everything.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          },
          "searchQuery": {
            "title": "Search query (alias)",
            "type": "string",
            "description": "Alias of Search term, for users migrating from other ROSSMANN scrapers. Used only when Search term is empty."
          },
          "categoryUrl": {
            "title": "Category URL (alias)",
            "type": "string",
            "description": "Alias of Category: a category page link or code. Used only when Category is empty."
          },
          "maxResults": {
            "title": "Max results (alias)",
            "minimum": 0,
            "type": "integer",
            "description": "Alias of Max products total. Used only when that field is not sent."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration (alias)",
            "type": "object",
            "description": "Alias of Proxy configuration."
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Only 'de' (rossmann.de) is supported; other values stop the run with a clear error.",
            "default": "de"
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}