{
  "openapi": "3.0.1",
  "info": {
    "title": "bol.com Scraper — Seller Leads (VAT, KvK, Email) & Products",
    "description": "Scrape bol.com (NL + BE) seller leads and products, pure HTTP. Each seller: legal company name, VAT number (NL and BE), KvK / KBO number, registered address and seller score, plus an optional verified email. Search, category, seller or product URLs. JSON/CSV.",
    "version": "0.0",
    "x-build-id": "hpegOSTV3bcvTn9Uz"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~bol-com-seller-leads-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-bol-com-seller-leads-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/memo23~bol-com-seller-leads-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-bol-com-seller-leads-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/memo23~bol-com-seller-leads-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-bol-com-seller-leads-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": {
          "searchQueries": {
            "title": "🔍 Search queries",
            "type": "array",
            "description": "Keywords to search on bol.com. Each keyword runs its own crawl. bol.com shows at most 10 pages (~240 products) per search, so for bigger coverage use category URLs.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "📎 Start URLs (optional)",
            "type": "array",
            "description": "Direct bol.com URLs, mixed freely: category (bol.com/nl/nl/l/…), search (…/s/?searchtext=…), seller profile (…/v/…), seller storefront with all its products (…/w/…) or product (…/p/… or its price overview …/prijsoverzicht/…). Netherlands (/nl/nl/) and Belgium (/be/nl/, /be/fr/) both work. Category URLs go up to 500 pages (~12,000 products). A page=N parameter is respected as the start page. Paste the URLs directly; lists loaded from a file or link aren't supported.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "outputMode": {
            "title": "What to output",
            "enum": [
              "sellers",
              "products",
              "both"
            ],
            "type": "string",
            "description": "Seller leads: one row per seller company (deduplicated by VAT, since one company often runs a separate NL and BE shop). Products: one row per product, with its seller's company, VAT and contact attached. Both: product rows and seller rows in one dataset (tell them apart by rowType).",
            "default": "sellers"
          },
          "store": {
            "title": "Store for search queries",
            "enum": [
              "nl",
              "be",
              "both"
            ],
            "type": "string",
            "description": "Which bol.com store the search queries run on. Start URLs always use the store in their own URL.",
            "default": "nl"
          },
          "maxItemsPerQuery": {
            "title": "Max products per query / URL",
            "minimum": 1,
            "type": "integer",
            "description": "How many products to scan per search query or listing URL. Every product names the shops selling it, so more products means more seller leads.",
            "default": 100
          },
          "maxSellers": {
            "title": "Max seller leads",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum seller rows in the output (0 = every seller found). Only the first N companies are output and, with Find seller emails on, searched for an email; the crawl stops once it has found enough shops. Doesn't limit product rows: in Products or Both mode, each product row's buy-box company is searched too. On Apify's Free plan a run returns up to 100 rows.",
            "default": 0
          },
          "allSellersPerProduct": {
            "title": "Collect every seller of each product",
            "type": "boolean",
            "description": "Listing pages show the buy-box seller and the cheapest seller of each product. Turn this on to also open every product's price overview and collect ALL shops offering it. More leads, but one or two extra requests per product (slower).",
            "default": false
          },
          "enrichEmails": {
            "title": "Find seller emails",
            "type": "boolean",
            "description": "bol.com shows no seller email, only a contact form. With this on, the actor looks for each company's own website and reads the email and phone from its contact or terms pages. An email is delivered only when that site also shows the company's KvK / VAT number or legal name (see the README for the few exceptions). Coverage is partial: in testing, roughly 40–50% of seller companies. Billing: $0.05 per company that gets an email and $0.03 per company that gets a phone. The free steps come first (a site linked on the seller's bol.com page, or a shop named after its webshop like \"Haarshop.nl\"). When they give no verified email, an AI web search looks for the company's site: $0.10 per company searched, whether it finds an email or not. At most 300 searches per run; set a max cost per run to cap it. In Products or Both mode, each product row's buy-box seller is covered too, whatever maxSellers is. With this off, no email or phone is delivered or charged. Paid Apify plans only; on the Free plan this setting is ignored.",
            "default": false
          },
          "sortBy": {
            "title": "Sort results by",
            "enum": [
              "relevance",
              "popularity",
              "price-asc",
              "price-desc",
              "rating",
              "newest"
            ],
            "type": "string",
            "description": "Order of search, category and seller-storefront results. A start URL that already has its own sort keeps it.",
            "default": "relevance"
          },
          "minPrice": {
            "title": "Min price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Only products at or above this price. A start URL that already has a price filter keeps it."
          },
          "maxPrice": {
            "title": "Max price (EUR)",
            "minimum": 0,
            "type": "integer",
            "description": "Only products at or below this price. A start URL that already has a price filter keeps it."
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many pages to fetch in parallel (1–50; 3 on the Free plan).",
            "default": 10
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}