{
  "openapi": "3.0.1",
  "info": {
    "title": "Douglas Germany Scraper - Beauty Products, Prices & Reviews",
    "description": "Scrape Douglas.de beauty and fragrance products by keyword, category, brand, or URL. Extract brands, current and original prices, discounts, unit prices, size variants, stock, images, ratings, reviews, ingredients, and specifications.",
    "version": "0.1",
    "x-build-id": "8bmsUhr02kpyJRCD7"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~douglas-de/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-douglas-de",
        "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~douglas-de/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-douglas-de",
        "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~douglas-de/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-douglas-de",
        "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": "Input mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Search mode = keyword + category + brand + filters. URL mode = paste Douglas product, category, brand or search URLs.",
            "default": "search"
          },
          "queries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Keywords to search, e.g. 'vitamin c serum', 'parfum', 'dior lipstift'. Each query runs as a separate search.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords (alias)",
            "type": "array",
            "description": "Alias of Search keywords; used only when Search keywords is empty.",
            "items": {
              "type": "string"
            }
          },
          "category": {
            "title": "Category",
            "type": "string",
            "description": "A Douglas category code (e.g. '01' Parfum, '03' Make-up, '1205' Gesichtspflege) or a full category URL like https://www.douglas.de/de/c/parfum/01. Leave empty for keyword-only search."
          },
          "brand": {
            "title": "Brand",
            "type": "string",
            "description": "A Douglas brand code (e.g. 'b0690' Dior) or a full brand URL like https://www.douglas.de/de/b/dior/b0690. Optional."
          },
          "gender": {
            "title": "Gender filter",
            "enum": [
              "any",
              "FEMALE",
              "MALE",
              "UNISEX"
            ],
            "type": "string",
            "description": "Restrict to women's, men's or unisex products. Search mode only: this is sent to the store as a search facet, so it has no effect in URL mode, where a pasted URL carries its own facets.",
            "default": "any"
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "relevance",
              "price-asc",
              "price-desc",
              "newest",
              "rating"
            ],
            "type": "string",
            "description": "How to order the results. Applies in search mode and, where the store supports it (price), to pasted category, brand and search URLs. Newest and rating have no store-side sort and keep the store's relevance order.",
            "default": "relevance"
          },
          "sort": {
            "title": "Sort (alias)",
            "enum": [
              "relevance",
              "price_low",
              "price_high",
              "newest",
              "top_rated"
            ],
            "type": "string",
            "description": "Alias of Sort order, used when Sort order is left at relevance. price_low = price-asc, price_high = price-desc, top_rated = rating."
          },
          "promoFlags": {
            "title": "Promotion flags",
            "type": "array",
            "description": "Site promotion facets to apply (e.g. 'travelSize' travel size, 'computedNewFlag' new, 'computedLimited' limited edition). Optional. Search mode only: these are sent to the store as search facets, so they have no effect in URL mode.",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "Douglas URLs",
            "type": "array",
            "description": "Full Douglas URLs: product (https://www.douglas.de/de/p/...), category (https://www.douglas.de/de/c/...), brand (https://www.douglas.de/de/b/...) or search (https://www.douglas.de/de/search?q=...). Any other Douglas page (a content page, a store page, the homepage) is looked up against the store's own category index; if it matches no category it is named in the log and skipped, never swapped for a different department's products.",
            "items": {
              "type": "string"
            },
            "default": [
              "https://www.douglas.de/de/p/5010207032",
              "https://www.douglas.de/de/c/parfum/damenduefte/0101",
              "https://www.douglas.de/de/b/dior/b0690",
              "https://www.douglas.de/de/search?q=hyaluron"
            ]
          },
          "productCodes": {
            "title": "Product codes",
            "type": "array",
            "description": "Douglas product codes (numeric ids such as 5010207032) or product URLs (https://www.douglas.de/de/p/...). URL mode only. Each code is scraped like a pasted product URL and is added to the URLs above. If you set product codes and leave the URLs list at its four example URLs, only the product codes are scraped.",
            "items": {
              "type": "string"
            }
          },
          "priceMin": {
            "title": "Minimum price (EUR)",
            "minimum": 0,
            "type": "number",
            "description": "Only return products at or above this price. Applies in BOTH search mode and URL mode: in search mode it is also sent to the store as a price facet, and in URL mode it filters the products found behind a pasted category, brand or search URL. A pasted product URL is always returned, whatever its price."
          },
          "priceMax": {
            "title": "Maximum price (EUR)",
            "minimum": 0,
            "type": "number",
            "description": "Only return products at or below this price. Applies in BOTH search mode and URL mode: in search mode it is also sent to the store as a price facet, and in URL mode it filters the products found behind a pasted category, brand or search URL. A pasted product URL is always returned, whatever its price."
          },
          "specialsOnly": {
            "title": "Discounted products only",
            "type": "boolean",
            "description": "Keep only products that are currently reduced (have a strike-through original price). Applies in BOTH search mode and URL mode, including the products found behind a pasted category, brand or search URL; a pasted product URL is always returned whether or not it is reduced. Douglas does not run a dedicated sale category; a 'special' here is any product whose original/list price is crossed out.",
            "default": false
          },
          "fetchDetails": {
            "title": "Fetch product details",
            "type": "boolean",
            "description": "Open each product page for the full spec table, ingredients (INCI) and how-to-use text. Off = listing fields only (faster, cheaper).",
            "default": false
          },
          "scrapeMode": {
            "title": "Scrape mode (alias)",
            "enum": [
              "overview",
              "detail"
            ],
            "type": "string",
            "description": "Alias of Fetch product details: detail turns it on, overview leaves it as set."
          },
          "fetchReviews": {
            "title": "Fetch reviews",
            "type": "boolean",
            "description": "Pull the rating histogram, EAN/GTIN and per-review text (author, date, rating, title, body) for each product.",
            "default": false
          },
          "maxReviewsPerProduct": {
            "title": "Max reviews per product",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Cap on reviews returned per product (1-200). Ignored unless 'Fetch reviews' is on.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per search/URL",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum result pages to walk per query/category/URL (0 = unlimited, walk until results are exhausted). One page holds 48 products. Leave at 0 for no limit of your own; the actor still stops after 1000 pages per search or URL.",
            "default": 0
          },
          "maxItems": {
            "title": "Max products total",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Hard cap on the total number of products returned across all queries/URLs.",
            "default": 100
          },
          "maxResults": {
            "title": "Max results (alias)",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Alias of Max products total. Used only while Max products total is left at its default of 100; a Max products total you changed always wins."
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "A Germany exit is required. The preset default is the configuration the store serves; changing it can make a run return no results.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "DE"
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large pull without returning or charging for products that run already collected. Use it after an interrupted run. For recurring monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental mode (recurring monitoring)",
            "type": "boolean",
            "description": "Turn on for scheduled monitoring. The first run returns every matching product as NEW. Later runs compare each product with the last run (price, was price, promo label, availability, variants, brand, images, description and any product-page details) and return only NEW and UPDATED products; an UPDATED row's changedFields names exactly what moved. Reviews, ratings, review counts and the scrape time are never compared, since they change without a real product change. Products you do not receive are not charged as results. State is kept separately for each search/URL/filter setup; use State key to name or share a campaign.",
            "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 derive a key automatically from the search/URL and filter settings."
          },
          "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. These are returned and billed like any other result, so leave it off unless you want the full snapshot every run.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Field names to exclude from UPDATED detection, in addition to the built-in handling (reviews, review summary, rating histogram, rating, rating stars, review count and scrape time never trigger an UPDATED). Use it if another field is noisy in your setup, for example images. A dotted name such as variants.size ignores that key inside every variant while still tracking the rest of each variant.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send scraped results to apps you already use, via MCP connectors. Authorize a connector once under Apify Settings Integrations, then select it here. A condensed human-readable summary per item is sent; the full record stays in the dataset. Leave empty to skip."
          },
          "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
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}