{
  "openapi": "3.0.1",
  "info": {
    "title": "VidaXL Scraper - Products, Prices, Stock & Change Tracking",
    "description": "Scrape the vidaXL storefronts by keyword or URL across 6 European markets. Every row carries price, currency, brand, category path, EAN and stock state. Detail enrichment adds description, specifications and the full image gallery. Recurring change tracking is first-class.",
    "version": "0.1",
    "x-build-id": "M5106lao2qM66jpOq"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~vidaxl-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-vidaxl-com-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~vidaxl-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-vidaxl-com-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~vidaxl-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-vidaxl-com-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": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "How to start the scrape. 'search' runs store searches. 'url' processes the store URLs you paste: a product URL is fetched as a single product, and a search or category page URL is paged like a search, its own scope deciding what is read. The filters below apply to every walk in both modes; a pasted product URL is the exception and returns that single product in full.",
            "default": "search"
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "One or more things to search the store for, for example 'garden chair', 'greenhouse', 'teak bench'. Each term is scraped independently. Search mode only: in URL mode the scope is read out of each pasted URL instead. Leave this empty and the run browses the whole catalogue of the selected market.",
            "default": [
              "garden chair"
            ],
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "Store URLs",
            "type": "array",
            "description": "Paste product URLs (https://www.vidaxl.de/e/vidaxl-gartenstuhl-holz-grau/8719883557076.html), search URLs (https://www.vidaxl.de/catalogsearch/result?q=gartenstuhl) or category page URLs (https://www.vidaxl.de/g/4299/gartenmobel) from any supported market. A pasted URL decides its own scope and market. A product URL returns that one product in full. The filters below narrow what listing walks read.",
            "default": [
              "https://www.vidaxl.de/e/vidaxl-gartenstuhl-holz-grau/8719883557076.html",
              "https://www.vidaxl.de/catalogsearch/result?q=gartenstuhl",
              "https://www.vidaxl.de/g/4299/gartenmobel"
            ],
            "items": {
              "type": "string"
            }
          },
          "market": {
            "title": "Market",
            "enum": [
              "de",
              "uk",
              "fr",
              "nl",
              "es",
              "it"
            ],
            "type": "string",
            "description": "The storefront search-mode walks read. Each market quotes its own prices and currency. URL mode reads the market out of each pasted URL instead.",
            "default": "de"
          },
          "sortBy": {
            "title": "Sort the store results by",
            "enum": [
              "relevance",
              "topseller",
              "priceasc",
              "pricedesc",
              "newest"
            ],
            "type": "string",
            "description": "The store's own server-side ordering, sent with every page of every walk. This orders the walk itself (and therefore which rows a capped run keeps), not just the output. Applies in BOTH search mode and URL mode listing walks.",
            "default": "relevance"
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "type": "number",
            "description": "Only keep rows whose selling price is at least this amount, in the market currency. The store has no parameter for this, so it is applied to the rows this run reads. Applies in BOTH search mode and URL mode."
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "type": "number",
            "description": "Only keep rows whose selling price is at most this amount, in the market currency. The store has no parameter for this, so it is applied to the rows this run reads. Applies in BOTH search mode and URL mode."
          },
          "onSaleOnly": {
            "title": "Discounted rows only",
            "type": "boolean",
            "description": "Only keep rows the store sells below their original price. Applied to the rows this run reads. Applies in BOTH search mode and URL mode.",
            "default": false
          },
          "fetchDetails": {
            "title": "Fetch product details",
            "type": "boolean",
            "description": "Read each product's page for the description, specification table, full image gallery and live stock/delivery state. Charged once per enriched record (the detail-enrichment event); rows whose page could not be read keep their listing fields and are never charged. Turn it off for a fast price-only pull.",
            "default": true
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "The maximum number of product records this run returns across all searches and URLs. Set to 0 for no limit.",
            "default": 20
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "The maximum number of listing pages read per search or pasted listing URL. Each page holds 20 products. Set to 0 for no page cap; Max items still bounds the run.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy for the run. The default uses the standard pool, which serves every storefront page; Residential is recommended for the most reliable results. When the default pool is refused, the run automatically tries Apify residential, then a backup connection. Free plans refuse every Apify pool at connect time and continue on the backup connection.",
            "default": {
              "useApifyProxy": true
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Continue an interrupted run: paste a run id or dataset id and this run skips every record it already collected. Leave empty for a fresh run. Cannot be combined with Incremental mode when that mode already tracks this search; pick one."
          },
          "incrementalMode": {
            "title": "Incremental mode: only what changed",
            "type": "boolean",
            "description": "Schedule this actor against the same search and collect only what changed: every product is classified NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED against the remembered baseline for this exact search scope. UNCHANGED rows are skipped unless Emit unchanged rows is on.",
            "default": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Name one monitoring campaign so several schedules keep separate baselines. Empty means the baseline is keyed on a hash of this exact search scope."
          },
          "emitUnchanged": {
            "title": "Emit unchanged rows",
            "type": "boolean",
            "description": "In Incremental mode, also return rows classified UNCHANGED (marked as such) instead of suppressing them. Off by default: a scheduled monitor then returns only NEW, UPDATED, REAPPEARED and EXPIRED rows.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired rows",
            "type": "boolean",
            "description": "In Incremental mode, after a complete scan also return rows that disappeared from the store, marked EXPIRED. Only runs after a proven complete scan; capped or interrupted runs never tombstone.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Extra top-level record fields that must never mark a row UPDATED in Incremental mode. The image gallery is ignored by default (its framing rotates without the product changing); name further fields here when a scheduled monitor bills noise as changes.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "MCP connectors",
            "type": "array",
            "description": "Connector ids that receive new records as the run collects them (for example a Notion database). Empty means no export; the dataset always holds every record.",
            "items": {
              "type": "string"
            }
          },
          "notionParentPageUrl": {
            "title": "Notion parent page URL",
            "type": "string",
            "description": "When exporting to Notion, the parent page new database entries are created under. Only used when MCP connectors includes a Notion connector."
          },
          "maxNotifyListings": {
            "title": "Max exported records",
            "minimum": 0,
            "type": "integer",
            "description": "The maximum number of records forwarded to MCP connectors per run. Only used when MCP connectors is non-empty.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}