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

Scrape marktplaats.nl, 2dehands.be and 2ememain.be listings by URL, keyword or category: price, price type, description, attributes, location with coordinates, images, seller, and optional full details (views, bids, specifications).
Scrape listings from Marktplaats.nl, the biggest classifieds site in the Netherlands, and its Belgian sister sites 2dehands.be and 2ememain.be. Paste a search or category URL, type keywords, or browse a whole category, and get clean rows with price and price type, description, attributes, location with coordinates, images and seller. Switch on listing details for the full description, every specification, views, bids, seller type and shipping options. No login, no browser.
| Field | Description |
|---|---|
startUrls | Search, category or listing URLs from any of the three sites. |
searchQueries | Keywords, one per line. Uses the filters below. |
maxItems | Maximum number of listings in total (default 20). |
includeDetails | Open every listing page for full details (off by default). |
site, category | Site and main category for keyword searches (a category alone browses it). |
minPrice, maxPrice, postcode, distanceKm | Price range in euros and radius search. |
condition, delivery, offeredSince, searchInDescription, sortBy | More keyword filters. |
{
"startUrls": [{ "url": "https://www.marktplaats.nl/l/fietsen-en-brommers/fietsen-heren-sportfietsen-en-toerfietsen/f/gazelle/3494/" }],
"searchQueries": ["bakfiets"],
"site": "marktplaats.nl",
"maxPrice": 1500,
"postcode": "3511AA",
"distanceKm": 25,
"maxItems": 100,
"includeDetails": true
}
| Field | Description |
|---|---|
itemId, url, site, title, description | Listing ID, link, site, title and description |
price, priceCents, priceType | Price in euros and its type (fixed, bidding, free, see description, ...) |
date, postedDate, postedAt | Date as shown, as YYYY-MM-DD, and the exact time (details) |
city, country, latitude, longitude, distanceKm | Location |
sellerName, sellerId, sellerVerified, sellerType, sellerActiveYears, sellerProfileUrl | Seller |
category, subcategory, categoryId | Category |
condition, delivery, brand, model, year, mileageKm, fuel, transmission | Key facts |
attributes, specifications | Every attribute (by key) and every specification on the listing page (by label) |
viewCount, favoritedCount, bidCount, highestBid, buyItNow, shippingOptions | Listing statistics and shipping (details) |
imageUrl, imageCount, images | Images |
isReserved, isTopAd, priorityProduct | Reserved flag and paid placement |
Example with listing details (seller shortened):
{
"itemId": "m2453937297",
"url": "https://www.marktplaats.nl/v/fietsen-en-brommers/fietsen-heren-sportfietsen-en-toerfietsen/m2453937297-gazelle-ultimate-c8-hmb-h53",
"site": "marktplaats.nl",
"title": "Gazelle Ultimate C8+ HMB H53",
"description": "- Zeer goed onderhouden Gazelle Ultimate C8+\n- Heren 53\n- Bosch Active Line Plus - 50 Nm\n- Bosch accu 500 Wh",
"price": 1100,
"priceType": "bidding",
"postedDate": "2026-10-15",
"postedAt": "2026-10-15T10:23:22Z",
"city": "Deventer",
"country": "Nederland",
"sellerName": "Jan",
"sellerType": "private",
"sellerActiveYears": 20,
"category": "Fietsen en Brommers",
"subcategory": "Fietsen | Heren | Sportfietsen en Toerfietsen",
"condition": "Zo goed als nieuw",
"specifications": { "Conditie": "Zo goed als nieuw", "Merk": "Gazelle", "Wielgrootte": "28 inch" },
"viewCount": 74,
"favoritedCount": 1,
"bidCount": 0,
"imageCount": 16
}
result-item event), with or without listing details.Example: 1,000 listings ≈ $2.50 in listing events plus about a cent of usage.
Is it legal to scrape Marktplaats? The scraper only reads public listings that anyone can see without an account. You are responsible for how you use the data, including personal data such as seller names (GDPR).
Do I need an account or a proxy? No. Datacenter proxies are used by default, and the scraper switches to residential proxies in the site's country by itself if it gets blocked.
How many listings can I get? The sites let you page through up to 5,000 listings per search. For more, split the search by category, price range or postcode; the run status tells you when a search hit that limit. Sorting by relevance reshuffles results between pages, so deep relevance searches return fewer unique listings (about 2,700 in our test) than newest-first (5,000).
Why is a field empty? Sellers fill in different attributes. Some fields (exact posting time, views, bids, seller type, subcategory name, full description) need Listing details.
Can I get phone numbers? No. Phone numbers are not collected; you get the seller name, ID and profile link.
Can I schedule it or use the API? Yes. Schedule runs sorted by newest to monitor new listings, and start runs or read results through the API.
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.
startUrlsarrayOptionalMarktplaats / 2dehands / 2ememain URLs
Search, category or listing URLs from marktplaats.nl, 2dehands.be or 2ememain.be. Filters in the URL (category, subcategory, brand and other attribute filters, price, postcode and distance, sort) are kept, and pages are followed automatically.
searchQueriesarrayOptionalSearch keywords
One keyword per line, e.g. 'iphone 15', 'bakfiets', 'golf 7'. The filters below apply to these keyword searches.
maxItemsintegerOptionaldefault 20Max listings
Maximum number of listings saved in this run, across all URLs and keywords. The site lets you page through up to 5,000 listings per search.
includeDetailsbooleanOptionaldefault falseListing details
Also open every listing page for the full description, all specifications, exact posting time, views, favorites, seller type and years active, bids and shipping options. Slower and uses more proxy traffic (about 30 to 90 KB per listing).
Applied to the search keywords. For URLs, set the filters on the site and paste the URL.
siteenumOptionaldefault "marktplaats.nl"Site
Which site the keyword searches run on. URLs always use their own site.
categoryenumOptionalCategory
Limit keyword searches to one main category. With no keywords, the whole category is browsed.
minPriceintegerOptionalMin price (€)
Lowest asking price in euros.
maxPriceintegerOptionalMax price (€)
Highest asking price in euros.
postcodestringOptionalPostcode
Search around a Dutch or Belgian postcode, e.g. '1012AB' or '9000'.
distanceKmintegerOptionalDistance (km)
Radius around the postcode in km. Needs a postcode.
conditionarrayOptionalCondition
Only listings in these conditions. Empty = all.
deliveryenumOptionalDelivery
Only listings offering pick-up, or shipping.
offeredSinceenumOptionalPosted since
Only recent listings.
searchInDescriptionbooleanOptionalSearch in description too
Match the keywords against titles and descriptions.
sortByenumOptionalSort by
Order of keyword search results. Default: newest first, which also gives the most unique listings on deep searches.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Datacenter proxies work for these sites. If they get blocked the scraper switches to residential proxies in the site's country automatically.
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 |
|---|---|---|
| itemId | string | null | Listing ID |
| url | string | null | Listing URL |
| site | string | null | Site (marktplaats.nl, 2dehands.be, 2ememain.be) |
| title | string | null | Title |
| description | string | null | Description (snippet; full text with Listing details) |
| price | number | null | Price in euros |
| priceCents | number | null | Price in cents |
| priceType | string | null | fixed, bidding, free, see_description, ... |
| priceTypeOriginal | string | null | Price type as the site names it |
| currency | string | null | Currency |
| date | string | null | Date as shown (Vandaag, 14 okt, ...) |
| postedDate | string | null | Posting date (YYYY-MM-DD) |
| postedAt | string | null | Exact posting time (ISO 8601, with Listing details) |
| city | string | null | City |
| country | string | null | Country |
| latitude | number | null | Latitude |
| longitude | number | null | Longitude |
| distanceKm | number | null | Distance from the postcode (km) |
| sellerName | string | null | Seller name |
| sellerId | string | null | Seller ID |
| sellerVerified | boolean | null | Seller is verified |
| sellerHasWebsite | boolean | null | Seller shows a website (usually a business) |
| sellerType | string | null | private or business (with Listing details) |
| sellerActiveYears | number | null | Years the seller has been active (with Listing details) |
| sellerProfileUrl | string | null | Seller profile URL (with Listing details) |
| categoryId | number | null | Category ID |
| category | string | null | Main category |
| categoryKey | string | null | Main category slug |
| subcategory | string | null | Subcategory (with Listing details) |
| subcategoryKey | string | null | Subcategory slug |
| condition | string | null | Condition |
| delivery | string | null | Pick-up / shipping |
| brand | string | null | Brand |
| model | string | null | Model |
| year | number | null | Construction year (vehicles) |
| mileageKm | number | null | Mileage in km (vehicles) |
| fuel | string | null | Fuel (vehicles) |
| transmission | string | null | Transmission (vehicles) |
| attributes | object | null | All attributes from the search data, by key |
| specifications | object | null | All specifications from the listing page, by label (with Listing details) |
| viewCount | number | null | Views (with Listing details) |
| favoritedCount | number | null | Times saved as favorite (with Listing details) |
| bidCount | number | null | Number of bids (with Listing details) |
| highestBid | number | null | Highest bid in euros (with Listing details) |
| buyItNow | boolean | null | Direct Kopen available (with Listing details) |
| shippable | boolean | null | Can be shipped (with Listing details) |
| shippingOptions | array | null | Shipping options and prices (with Listing details) |
| imageUrl | string | null | First image |
| imageCount | number | null | Number of images |
| images | array | null | Image URLs |
| isReserved | boolean | null | Reserved |
| isTopAd | boolean | null | Paid top placement |
| priorityProduct | string | null | Paid placement type |
| traits | array | null | Listing traits |
| searchSource | string | null | The URL or keyword the listing came from |
| scrapedAt | string | null | Scraped at (UTC) |
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 |
|---|---|---|
| Listing | One listing saved to the dataset. | $0.0025 |
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/marktplaats-scraper').call({
"startUrls": [
{
"url": "https://www.marktplaats.nl/q/gazelle/"
}
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// 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/marktplaats-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/marktplaats-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.
Keyword search with full listing details.
Listings from 2dehands and filtered Marktplaats category URLs.
Keyword search on the Belgian site with details.
Keyword search with a price range sorted by price.
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.