{
  "openapi": "3.0.1",
  "info": {
    "title": "bol.com Scraper - Products, Prices, Offers, Reviews",
    "description": "Scrape bol.com products: title, price, list price and discount, EAN, brand, images, condition, delivery, full specifications, ratings with distribution, individual reviews, every offer with seller name and rating, and refurbished prices. Search by keyword with filters, or paste product URLs.",
    "version": "1.1",
    "x-build-id": "DAdcEmGPBagEuqVOZ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~bol-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-bol-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~bol-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-bol-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~bol-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-bol-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Choose Search to build queries from keywords and filters, or URL to scrape pasted product or result-page URLs directly.",
            "default": "search"
          },
          "searchTerms": {
            "title": "Search keywords",
            "type": "array",
            "description": "One or more keywords to search for, e.g. \"laptop\", \"koffiezetapparaat\".",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "productIds": {
            "title": "Product IDs, EANs or product URLs",
            "type": "array",
            "description": "Look up specific products directly: bol.com product ids (16 digits, e.g. 9300000230842700), EAN/GTIN barcodes (8, 12, 13 or 14 digits), or product page URLs. Works in either mode and alongside search keywords; each entry returns one product. A bol.com id opens that exact product page (nothing is returned if it no longer exists); EAN/GTIN lookups return the top bol.com search hit for that barcode. A bol.com id or product URL always returns full detail fields; the detail enrichment charge applies to it only when Fetch full product details is on.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "specialsCategory": {
            "title": "Also include a specials category",
            "enum": [
              "",
              "aanbiedingen",
              "outlet"
            ],
            "type": "string",
            "description": "Optional. Add one of bol.com's own promo/discount browse pages as an extra source for this run, alongside your search keywords. Each returned product carries real was-price/discount fields (isOnSpecial, savingsAmount, savingsPercent, promoLabel) straight from bol.com's own listing data. Off by default.",
            "default": ""
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "popularity",
              "price_asc",
              "price_desc",
              "rating",
              "newest"
            ],
            "type": "string",
            "description": "Result ordering. Applies in both Search and URL mode: for a pasted search-result URL, this input's sort is applied when the search is rebuilt, and the pasted URL's own sort order (if any) is not read or preserved.",
            "default": "relevance"
          },
          "minPrice": {
            "title": "Minimum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep products at or above this price."
          },
          "maxPrice": {
            "title": "Maximum price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep products at or below this price."
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Only keep products with an average review rating at or above this value (1-5)."
          },
          "condition": {
            "title": "Condition",
            "enum": [
              "any",
              "new",
              "secondhand",
              "refurbished"
            ],
            "type": "string",
            "description": "Keep only products whose best offer matches this condition.",
            "default": "any"
          },
          "sponsoredOnly": {
            "title": "Sponsored products only",
            "type": "boolean",
            "description": "Keep only sponsored (advertised) products.",
            "default": false
          },
          "includeSponsored": {
            "title": "Include sponsored results",
            "type": "boolean",
            "description": "Keep sponsored (advertised) listings in the results. Turn off to drop them. Ignored when Sponsored only is on.",
            "default": true
          },
          "inStockOnly": {
            "title": "In-stock products only",
            "type": "boolean",
            "description": "Keep only products that have a buyable offer.",
            "default": false
          },
          "urls": {
            "title": "Product or result URLs",
            "type": "array",
            "description": "Paste bol.com product, search-result, category (/l/), brand (/b/), deals or outlet (/ra/) URLs. Belgian search links (/be/nl/s/ and /be/fr/s/) are scraped on the Belgian storefront and records carry country BE; Belgian category, brand and outlet links are skipped. The price, rating, condition, sponsored and in-stock filters still apply. A product link always returns full detail fields; the detail enrichment charge applies to it only when Fetch full product details is on. Left untouched, one example of each shape runs.",
            "default": [
              "https://www.bol.com/nl/nl/s/?searchtext=laptop",
              "https://www.bol.com/nl/nl/p/acer-chromebook-cb314-4h-c4hf-intel-n100-14-full-hd-8-gb-lpddr5-128-gb-emmc/9300000263156289/",
              "https://www.bol.com/nl/nl/l/laptops/4770/",
              "https://www.bol.com/nl/nl/b/acemagic/607284936/",
              "https://www.bol.com/nl/nl/l/alle-artikelen-aanbiedingen/58334/",
              "https://www.bol.com/nl/nl/ra/outlet/392102/"
            ],
            "items": {
              "type": "string"
            }
          },
          "fetchDetails": {
            "title": "Fetch full product details",
            "type": "boolean",
            "description": "Adds the full specifications (incl. EAN), full description, every image, the full review list with rating distribution, seller rating, weight, and refurbished/second-hand offers. Without it, runs already return price, image, rating summary, condition and seller.",
            "default": false
          },
          "maxReviews": {
            "title": "Max reviews per product",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum number of individual reviews captured per product when Fetch full product details is on. Bol.com's product page serves only its first slice of reviews (about 6 per product in testing) and exposes no way to page further, so fewer reviews than the cap may come back.",
            "default": 30
          },
          "maxPages": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "Safety bound on result pages walked per keyword. Leave empty or 0 for unlimited. This does NOT cap the number of products; the run still stops at Max items."
          },
          "totalPages": {
            "title": "Total pages (alias of Max pages)",
            "minimum": 0,
            "type": "integer",
            "description": "Same as Max pages per search, kept for compatibility with other bol.com scrapers. Max pages wins when both are set."
          },
          "maxListings": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of products to return across the whole run. The single finite cap. Set 0 for unlimited.",
            "default": 20
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Keep Apify Proxy enabled with a Netherlands exit for the most complete bol.com results. A selected datacenter group is replaced by residential (billed to your plan), because Bol.com refuses datacenter connections.",
            "default": {
              "useApifyProxy": true
            }
          },
          "residentialCountries": {
            "title": "Preferred exit countries",
            "type": "array",
            "description": "Preferred exit countries. Defaults to NL then BE, DE, FR, GB.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "backupProxyUrl": {
            "title": "Backup proxy URL",
            "type": "string",
            "description": "Optional backup proxy gateway used when full Apify Proxy access is unavailable on your plan."
          },
          "maxResidentialRequests": {
            "title": "Request cap",
            "minimum": 0,
            "type": "integer",
            "description": "Cost guard limiting how many requests the run may make before switching to the backup gateway. 0 = unlimited. Default 5000."
          },
          "trafficBudgetMb": {
            "title": "Traffic budget (MB)",
            "minimum": 0,
            "type": "integer",
            "description": "Soft transfer budget. When exceeded, the actor switches to the backup gateway. 0 = unlimited. Default 1500."
          },
          "preferDatacenter": {
            "title": "Prefer the cheaper connection first",
            "type": "boolean",
            "description": "No effect: Bol.com refuses datacenter connections, so the actor always uses a residential connection. Kept so saved tasks keep working.",
            "default": false
          },
          "autoDowngradeProxy": {
            "title": "Use the cheaper connection when possible",
            "type": "boolean",
            "description": "No effect: Bol.com refuses datacenter connections, so the actor always uses a residential connection. Kept so saved tasks keep working.",
            "default": 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 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. A product is UPDATED when a tracked field changes: price, list price, discount, availability and delivery, condition, title, offers, seller, specifications, description or categories. These never make a product UPDATED (they stay in the output): reviews and every rating or review counter, the rotating image host, URL tracking parameters, and the order of offers. Use \"Ignore fields when detecting changes\" below to exclude more fields. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those products returned (and billed). State is kept separately for each search/URL/specials/detail-mode 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/URL/specials and filter 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 items 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
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Top-level output field names (for example `description` or `delivery`) that must never make a product UPDATED or appear in `changedFields`. They are still returned in the output. Added on top of the built-in exclusions (reviews, rating counters). Applies to the saved state too, so changing this list does not cause a one-time wave of UPDATED rows.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Export to your apps (MCP)",
            "type": "array",
            "description": "Optional. Pick connected apps (Notion, Airtable, Linear, Apify) to also push each scraped product to, in addition to the dataset.",
            "default": []
          },
          "notionParentPageUrl": {
            "title": "Notion parent page URL",
            "type": "string",
            "description": "Optional. When a Notion connector is selected, create one page per product under this parent page."
          },
          "maxNotifyListings": {
            "title": "Max items to export",
            "minimum": 0,
            "type": "integer",
            "description": "Optional cap on how many products are pushed to the selected MCP connectors."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}