# bol.com Scraper - Products, Prices, Offers, Reviews (`abotapi/bol-com-scraper`) Actor

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.

- **URL**: https://apify.com/abotapi/bol-com-scraper.md
- **Developed by:** [AbotAPI](https://apify.com/abotapi) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 product scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## bol.com Scraper

Scrape products from bol.com, the largest online store in the Netherlands and Belgium. Search by keyword with price, rating, condition and sort filters, or paste product and result URLs. Every record carries the title, price, list price and discount, brand, EAN, images, condition, delivery estimate, rating with full review distribution, individual reviews, all offers with seller name and rating, and refurbished and second-hand prices.

### Why This Scraper?

- One product record carries price, list price, discount, currency, brand, category path, condition, delivery, rating summary, image and seller.
- Turn on full details to add the complete specification list (incl. EAN), the full description, every product image, the full review list with star distribution, seller rating, product weight, and refurbished and second-hand offers.
- Search-mode filters for price band, minimum rating, condition, sponsored-only and in-stock-only, plus six sort orders, narrow results before anything is collected.
- URL mode accepts both product pages and result pages.
- One finite cap (Max items) keeps the run bounded; page depth is unlimited by default.
- Optional export of each product to Notion, Airtable, Linear or Apify through MCP connectors, in addition to the dataset.

### Data You Get

> Sample shape - values are illustrative placeholders, not from a live listing.

| Field | Example |
| --- | --- |
| productId | 9300000000000 |
| title | Example 15.6 Inch Laptop - 16GB RAM - 512GB SSD |
| brand | ExampleBrand |
| price | 329.5 |
| list_price | 399 |
| discount_percentage | 17 |
| currency | EUR |
| condition | new |
| ean | 0000000000000 |
| category | Windows laptops |
| categoryHierarchy | ["Computer", "Laptops", "Windows laptops"] |
| rating | 4.3 |
| reviewCount | 15 |
| ratingDistribution | {"fiveStar": 11, "fourStar": 0, "threeStar": 2, "twoStar": 1, "oneStar": 1} |
| image | https://media.example.com/0000/image-550x461.jpg |
| availability | In stock |
| delivery | Delivered by tomorrow |
| seller | {"id": "0000000", "name": "Example Store", "rating": 8.1} |
| weight | 2.2 kg |
| sponsored | false |
| url | https://www.bol.com/nl/nl/p/example-laptop/9300000000000/ |

### How to Use

Search by keyword with a price ceiling:

```json
{
  "mode": "search",
  "searchTerms": ["laptop"],
  "sortBy": "price_asc",
  "maxPrice": 400,
  "maxListings": 50
}
````

Search with full product detail enrichment:

```json
{
  "mode": "search",
  "searchTerms": ["koffiezetapparaat"],
  "fetchDetails": true,
  "maxReviews": 20,
  "minRating": 4,
  "maxListings": 30
}
```

Scrape pasted URLs (product pages and result pages):

```json
{
  "mode": "url",
  "urls": [
    "https://www.bol.com/nl/nl/p/example-laptop/9300000000000/",
    "https://www.bol.com/nl/nl/s/?searchtext=boek"
  ],
  "maxListings": 100
}
```

### Input Parameters

| Parameter | Type | Description |
| --- | --- | --- |
| mode | select | `search` (keyword + filters) or `url` (paste product or result URLs). |
| searchTerms | array | Keywords to search. Search mode only. |
| sortBy | select | Best match, Most popular, Price low to high, Price high to low, Highest rated, or Newest. |
| minPrice | integer | Keep products at or above this price (EUR). |
| maxPrice | integer | Keep products at or below this price (EUR). |
| minRating | integer | Keep products with an average rating at or above this value (1-5). |
| condition | select | Any, New, Second-hand, or Refurbished. |
| sponsoredOnly | boolean | Keep only sponsored (advertised) products. |
| inStockOnly | boolean | Keep only products with a buyable offer. |
| urls | array | Product or result URLs to scrape. URL mode only; filter fields are ignored. |
| fetchDetails | boolean | Adds full specifications, EAN, description, all images, full reviews, seller rating, weight and refurbished offers. |
| maxReviews | integer | Maximum individual reviews captured per product when details are on. |
| maxPages | integer | Safety bound on result pages per keyword. Empty or 0 = unlimited; does not cap product count. |
| maxListings | integer | Maximum products for the whole run. The single finite cap. 0 = unlimited. Default 20. |
| proxy | object | Proxy configuration. Keep Apify Proxy enabled with a Netherlands exit. |
| residentialCountries | array | Preferred exit countries. Defaults to NL then BE, DE, FR, GB. |
| backupProxyUrl | string | Optional backup proxy gateway for plans without full Apify Proxy access. |
| maxResidentialRequests | integer | Cost guard limiting requests per run before switching to the backup gateway. 0 = unlimited. Default 5000. |
| trafficBudgetMb | integer | Soft transfer budget in MB; switches to the backup gateway when exceeded. 0 = unlimited. Default 1500. |
| preferDatacenter | boolean | Cost-saving connection preference. Off by default. |
| autoDowngradeProxy | boolean | Cost-saving connection preference. On by default. |
| mcpConnectors | array | Optional connected apps (Notion, Airtable, Linear, Apify) to also receive each product. |
| notionParentPageUrl | string | When a Notion connector is selected, create one page per product under this parent page. |
| maxNotifyListings | integer | Optional cap on how many products are pushed to the selected connectors. |

#### Export to your apps (MCP connectors)

Optionally pipe results into the apps you already use through Model Context Protocol (MCP) connectors. Authorize a connector once under Apify then Settings then Integrations, select it in `mcpConnectors`, and each scraped product is also sent to that app as a condensed, human-readable summary. The full record always stays in the dataset. Supported connectors: Notion, Linear, Airtable and Apify. Leave `mcpConnectors` empty to write only to the dataset.

### Output Example

> Sample shape - values are illustrative placeholders, not from a live listing.

```json
{
  "productId": "9300000000000",
  "title": "Example 15.6 Inch Laptop - 16GB RAM - 512GB SSD - Windows 11",
  "brand": "ExampleBrand",
  "price": 329.5,
  "list_price": 399,
  "discount_percentage": 17,
  "currency": "EUR",
  "condition": "new",
  "ean": "0000000000000",
  "category": "Windows laptops",
  "categoryHierarchy": ["Computer", "Laptops", "Windows laptops"],
  "rating": 4.3,
  "reviewCount": 15,
  "ratingDistribution": {"fiveStar": 11, "fourStar": 0, "threeStar": 2, "twoStar": 1, "oneStar": 1},
  "reviews": [
    {"rating": 5, "title": "Great value", "text": "Fast and quiet.", "nickname": "Jane Doe", "location": "Amsterdam", "verified": true}
  ],
  "image": "https://media.example.com/0000/image-550x461.jpg",
  "images": ["https://media.example.com/0000/image-550x461.jpg"],
  "availability": "In stock",
  "delivery": "Delivered by tomorrow",
  "offers": [
    {"price": 329.5, "currency": "EUR", "condition": "new", "seller": {"id": "0000000", "name": "Example Store", "rating": 8.1}}
  ],
  "seller": {"id": "0000000", "name": "Example Store", "rating": 8.1, "topSeller": false},
  "specifications": [
    {"group": "General", "name": "Type computer processor", "value": "Example N-series processor"},
    {"group": "General", "name": "EAN", "value": "0000000000000"}
  ],
  "description": "Example laptop for study, work and home use.",
  "weight": "2.2 kg",
  "weightGrams": 2200,
  "sponsored": false,
  "has_refurbished": false,
  "in_stock": true,
  "products_found": 300001,
  "search_query": "laptop",
  "country": "NL",
  "url": "https://www.bol.com/nl/nl/p/example-laptop/9300000000000/",
  "scrapedAt": "2026-01-01T00:00:00+00:00"
}
```

### Plan Requirement

bol.com serves shoppers in the Netherlands and Benelux, so keep Apify Proxy enabled with a Netherlands exit for the most complete results. The `residentialCountries` field lets you set the preferred exit countries (NL then BE, DE, FR, GB by default). If your plan does not include full Apify Proxy access, set a `backupProxyUrl` and the actor uses that gateway instead.

For predictable cost the run honours a per-run request cap (`maxResidentialRequests`) and a soft transfer budget (`trafficBudgetMb`); once either is reached it uses the backup gateway. The `preferDatacenter` and `autoDowngradeProxy` toggles are cost-saving connection preferences.

# Actor input Schema

## `mode` (type: `string`):

Choose Search to build queries from keywords and filters, or URL to scrape pasted product or result-page URLs directly.

## `searchTerms` (type: `array`):

One or more keywords to search for, e.g. "laptop", "koffiezetapparaat".

## `sortBy` (type: `string`):

Result ordering.

## `minPrice` (type: `integer`):

Only keep products at or above this price.

## `maxPrice` (type: `integer`):

Only keep products at or below this price.

## `minRating` (type: `integer`):

Only keep products with an average review rating at or above this value (1-5).

## `condition` (type: `string`):

Keep only products whose best offer matches this condition.

## `sponsoredOnly` (type: `boolean`):

Keep only sponsored (advertised) products.

## `inStockOnly` (type: `boolean`):

Keep only products that have a buyable offer.

## `urls` (type: `array`):

Paste bol.com product URLs or search-result URLs. Filter fields are ignored in this mode.

## `fetchDetails` (type: `boolean`):

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.

## `maxReviews` (type: `integer`):

Maximum number of individual reviews captured per product when Fetch full product details is on.

## `maxPages` (type: `integer`):

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.

## `maxListings` (type: `integer`):

Maximum number of products to return across the whole run. The single finite cap. Set 0 for unlimited.

## `proxy` (type: `object`):

Keep Apify Proxy enabled with a Netherlands exit for the most complete bol.com results.

## `residentialCountries` (type: `array`):

Preferred exit countries. Defaults to NL then BE, DE, FR, GB.

## `backupProxyUrl` (type: `string`):

Optional backup proxy gateway used when full Apify Proxy access is unavailable on your plan.

## `maxResidentialRequests` (type: `integer`):

Cost guard limiting how many requests the run may make before switching to the backup gateway. 0 = unlimited. Default 5000.

## `trafficBudgetMb` (type: `integer`):

Soft transfer budget. When exceeded, the actor switches to the backup gateway. 0 = unlimited. Default 1500.

## `preferDatacenter` (type: `boolean`):

Cost-saving connection preference. Leave off unless you know the cheaper connection works for your pool.

## `autoDowngradeProxy` (type: `boolean`):

Cost-saving connection preference. Leave on to prefer the cheaper connection whenever results remain complete.

## `mcpConnectors` (type: `array`):

Optional. Pick connected apps (Notion, Airtable, Linear, Apify) to also push each scraped product to, in addition to the dataset.

## `notionParentPageUrl` (type: `string`):

Optional. When a Notion connector is selected, create one page per product under this parent page.

## `maxNotifyListings` (type: `integer`):

Optional cap on how many products are pushed to the selected MCP connectors.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "laptop"
  ],
  "sortBy": "relevance",
  "condition": "any",
  "sponsoredOnly": false,
  "inStockOnly": false,
  "urls": [],
  "fetchDetails": false,
  "maxReviews": 30,
  "maxListings": 20,
  "proxy": {
    "useApifyProxy": true
  },
  "residentialCountries": [],
  "preferDatacenter": false,
  "autoDowngradeProxy": true,
  "mcpConnectors": []
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search",
    "searchTerms": [
        "laptop"
    ],
    "urls": [],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/bol-com-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search",
    "searchTerms": ["laptop"],
    "urls": [],
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/bol-com-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "searchTerms": [
    "laptop"
  ],
  "urls": [],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/bol-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=abotapi/bol-com-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "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.0",
        "x-build-id": "bLJe510VFGeCwrsFv"
    },
    "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"
                        }
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "relevance",
                            "popularity",
                            "price_asc",
                            "price_desc",
                            "rating",
                            "newest"
                        ],
                        "type": "string",
                        "description": "Result ordering.",
                        "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
                    },
                    "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 URLs or search-result URLs. Filter fields are ignored in this mode.",
                        "default": [],
                        "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,
                        "type": "integer",
                        "description": "Maximum number of individual reviews captured per product when Fetch full product details is on.",
                        "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."
                    },
                    "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.",
                        "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": "Cost-saving connection preference. Leave off unless you know the cheaper connection works for your pool.",
                        "default": false
                    },
                    "autoDowngradeProxy": {
                        "title": "Use the cheaper connection when possible",
                        "type": "boolean",
                        "description": "Cost-saving connection preference. Leave on to prefer the cheaper connection whenever results remain complete.",
                        "default": true
                    },
                    "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
                                    }
                                }
                            },
                            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
