
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape bol.com (NL & BE) by keyword, search, category or product URL. Get price, list price, discount, EAN, brand, rating, reviews count, seller (bol or partner), delivery promise, specs, images, variants and other sellers' offers.
Scrape products from bol.com, the biggest online shop in the Netherlands and Belgium. Search by keyword or paste search, category, brand and product URLs, and get a clean record per product with price, list price, discount, rating, seller (bol or partner), delivery promise and image. You can also open every product page for EAN, MPN, full specifications, all images, variants, manufacturer details, reviews and other sellers' offers. No login, no browser, and fast: a 20-product search finishes in seconds.
koptelefoon), or paste bol.com URLs: search pages, category pages, brand pages or product pages.| Field | What it does |
|---|---|
searchQueries | Keywords to search on bol.com, one search each. |
startUrls | Search, category, brand or product URLs (NL or BE). Filters and sort in the URL are kept. Bare product ids work too. |
maxItems | Max products per keyword or list URL (0 = all). |
scrapeProductDetails | Open each product page for the full record. |
country | Shop for keyword searches: nl, be or be-fr. |
sort | RELEVANCE, POPULARITY, PRICE_ASC, PRICE_DESC, RATING, RELEASE_DATE, WISHLIST. |
minPrice / maxPrice / minRating / brands | Filters applied by bol.com itself. |
onlySoldByBol / includeSponsored / usePagination | Keep only bol's own offers, skip sponsored products, first page only. |
includeOffers / includeReviews | Add every seller's offer, add the reviews shown on the product page. |
{
"searchQueries": ["koptelefoon"],
"startUrls": ["https://www.bol.com/nl/nl/l/koptelefoons/33078/"],
"maxItems": 20,
"scrapeProductDetails": false,
"sort": "PRICE_ASC",
"minPrice": 20,
"maxPrice": 150,
"brands": ["JBL", "Sony"]
}
One row per product. List records (product pages off) include:
| Field | Example |
|---|---|
product_id, name, url, brand | 9300000151669587, JBL Live 770NC ..., product URL, JBL |
price, list_price, discount_percent, currency | 85, 179.99, 52.8, EUR |
in_stock, availability_note, delivery_date | true, Op voorraad. Voor 23:59 uur besteld, morgen in huis, 2026-10-16 |
seller_name, seller_id, sold_by_bol | bol, 0, true |
rating_value, review_count | 4.6, 112 |
category, breadcrumbs, main_image, images | category path and image URLs |
badges, highlights, quantity_price_tiers, select_deal, sponsored | deal labels, key specs, multi-buy prices, bol Select price, ad flag |
search_query, source_url, page, position, scraped_at | where the product was found |
With Open every product page on, each record adds gtin (EAN), mpn, sku, breadcrumb_urls, images (all), videos, description, description_html, attributes (all specifications), specification_groups, color, size, weight, material, model, manufacturer_name, manufacturer_address, manufacturer_email, warranty, package_quantity, unit_price, estimated_delivery, shipping_cost, seller_rating_value, offers_count, rating_distribution, variants, series, sold_last_month, canonical_url, and optionally offers and reviews.
{
"product_id": "9300000008050912",
"name": "Skullcandy Crusher EVO – Draadloze Koptelefoon Bluetooth – Hoofdtelefoon draadloos – Zwart",
"url": "https://www.bol.com/nl/nl/p/skullcandy-crusher-evo-over-ear-bt-true-black/9300000008050912/",
"brand": "Skullcandy",
"price": 127,
"list_price": 189.99,
"list_price_label": "Adviesprijs",
"discount_percent": 33.2,
"currency": "EUR",
"in_stock": true,
"availability_note": "Op voorraad. Voor 23:59 uur besteld, morgen in huis",
"estimated_delivery": "Op voorraad. Voor 23:59 uur besteld, morgen in huis",
"delivery_date": "2026-10-16",
"seller_name": "bol",
"seller_id": "0",
"sold_by_bol": true,
"rating_value": 4.5,
"review_count": 164,
"gtin": "0810015587249",
"mpn": "S6EVW-N740",
"category": "Koptelefoons",
"breadcrumbs": ["Elektronica", "Audio & Hifi", "Audio voor jou", "Koptelefoons & Accessoires", "Koptelefoons"],
"main_image": "https://media.s-bol.com/P9NZy1A48MB1/xKPO9z/1145x1200.jpg",
"color": "Zwart",
"weight": "374.2 g",
"manufacturer_name": "Skullcandy Inc.",
"offers_count": 2,
"attributes": {"Merk": "Skullcandy", "Model": "Crusher EVO", "EAN": "0810015587249", "Bluetooth versie": "Bluetooth 5.3"},
"variants": [{"product_id": "9300000008050911", "attributes": {"Colour": "Grijs"}, "price": 129.99, "in_stock": true}],
"offers": [
{"seller_name": "bol", "price": 127, "condition": "new", "delivery_date": "2026-10-16"},
{"seller_name": "Example Partner BV", "seller_rating": 9.1, "price": 140, "condition": "new", "delivery_date": "2026-10-19"}
],
"reviews": [
{"rating": 5, "title": "Echt een aanrader", "text": "Sample review text.", "pros": ["Bass", "Accu"], "date": "2025-02-28T14:19:15Z", "author": "Sample reviewer", "verified_purchase": true}
],
"details_loaded": true
}
Pay per product, no start fee:
Example: 1,000 products from a search cost $1.00, or $6.00 with full product pages. Platform usage (compute and residential proxy traffic) is billed separately and is small: in our test runs about $0.01 per 1,000 listing products and about $0.25 per 1,000 full product records. Set a maximum total charge on the run if you want a hard budget; the scraper stops cleanly when it is reached.
Is it legal to scrape bol.com? The scraper reads public product pages only, the same information any visitor sees, without logging in. Check bol.com's terms and the laws in your country for your use case, and don't collect personal data you don't need.
Do I need a bol.com account or a proxy? No account. A residential proxy (Netherlands) is set by default because bol.com blocks datacenter IPs; you don't have to configure anything.
How many products can I get? Category pages can be read to the end (thousands of products). bol.com shows at most 10 pages per search, so for bigger searches the scraper splits the search into price ranges automatically.
Why is a field empty? bol.com doesn't show it for that product (for example no list price, no seller rating for bol's own offers, or no EAN for some digital products). Detail-only fields need Open every product page.
Can I schedule it or use the API? Yes. Save your input as a task, schedule it daily for price monitoring, and fetch results via the API or webhooks.
Does it work for Belgium? Yes: paste bol.com/be URLs or set Shop to Belgium (Dutch or French) for keyword searches.
select_price when bol.com displays them.brands must match bol.com's brand filter on that listing; unknown brands are skipped with a warning.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchQueriesarrayOptionalSearch keywords
Words to search on bol.com, e.g. 'koptelefoon', 'lego', 'airfryer'. Each keyword is one search.
startUrlsarrayOptionalbol.com URLs
Search pages (https://www.bol.com/nl/nl/s/?searchtext=...), category pages (https://www.bol.com/nl/nl/l/koptelefoons/33078/), brand pages and product pages (https://www.bol.com/nl/nl/p/.../9300000008050912/). Filters, sorting and page you set on bol.com are kept. Bare 16-digit product ids work too. NL and BE URLs are supported.
maxItemsintegerOptionaldefault 20Max products per search or URL
Stop each keyword or list URL after this many products. 0 means all products the listing offers. Product URLs are always scraped.
scrapeProductDetailsbooleanOptionaldefault falseOpen every product page (full details)
Off: one fast record per product card (price, list price, discount, rating, seller, delivery, image). On: also opens each product page for EAN, MPN, specifications, all images, variants, seller rating, manufacturer, description and more. Full records are priced higher.
countryenumOptionaldefault "nl"Shop
Which bol.com shop keyword searches use. URLs keep their own shop.
sortenumOptionalSort by
Order of the results for keywords and list URLs. Empty uses bol.com's default order; a sort already in a URL is kept.
minPriceintegerOptionalMinimum price (€)
Only products from this price. Applied by bol.com itself.
maxPriceintegerOptionalMaximum price (€)
Only products up to this price. Applied by bol.com itself.
minRatingintegerOptionalMinimum rating (stars)
Only products rated at least this many stars (1-5).
brandsarrayOptionalBrands
Only these brands, e.g. 'JBL', 'Sony'. Names must match bol.com's brand filter on that listing.
onlySoldByBolbooleanOptionaldefault falseOnly products sold by bol
Skip products whose best offer comes from a partner seller. Skipped products are not charged.
includeSponsoredbooleanOptionaldefault trueInclude sponsored products
bol.com mixes sponsored products into listings. They are flagged with sponsored: true. Turn off to skip them.
usePaginationbooleanOptionaldefault trueFollow next pages
Off: only the first page of each search or list URL.
includeOffersbooleanOptionaldefault falseOther sellers' offers
Adds every seller offering the product (price, condition, delivery, seller rating). Opens one extra page per product and turns on product pages.
includeReviewsbooleanOptionaldefault falseReviews
Adds the reviews shown on the product page (bol.com shows the first few, about 6, with title, text, pros, cons, rating and date). Turns on product pages.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["RESIDENTIA…Proxy
bol.com blocks datacenter IPs, so residential (Netherlands) is the default and recommended setting.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| main_image | any | Image |
| name | any | Title |
| brand | any | Brand |
| price | any | Price (€) |
| list_price | any | List price (€) |
| discount_percent | any | Discount % |
| in_stock | any | In stock |
| rating_value | any | Rating |
| review_count | any | Reviews |
| seller_name | any | Seller |
| sold_by_bol | any | Sold by bol |
| availability_note | any | Delivery |
| gtin | any | EAN |
| category | any | Category |
| sponsored | any | Sponsored |
| url | any | URL |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Product | Charged once for each product saved from a search, category or brand listing. | $0.001 |
| Product detail | Charged once for each full product record saved from its product page (instead of Product). | $0.006 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/bol-scraper').call({
"searchQueries": [
"koptelefoon"
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"RESIDENTIAL"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/bol-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/bol-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Full product data from a bol.com product page.
Product cards from a bol.com category in the Netherlands.
Search results from bol.com Belgium.
Search results with customer reviews.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.