2dehands & 2ememain – Belgium Classifieds & Seller Reviews
Pricing
from $1.25 / 1,000 results
2dehands & 2ememain – Belgium Classifieds & Seller Reviews
Scrape classifieds from 2dehands.be and 2ememain.be by keyword, filters, or URLs. Returns title, price, location, images, seller details, category, and full tag-based seller reviews. Supports sort, category, price filters, listing URLs, and search URLs.
Pricing
from $1.25 / 1,000 results
Rating
3.0
(2)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
3
Monthly active users
1.6 hours
Issues response
2 days ago
Last modified
Categories
Share
2dehands & 2ememain Scraper
Scrape structured listing data from 2dehands.be and 2ememain.be - Belgium's two largest general classifieds marketplaces (cars, electronics, furniture, bikes, fashion, and more). Both sites share one catalogue, so a single actor covers both.
Returns normalized listing records: item id + canonical URL, title, description, price and price type, full location (city, country, coordinates), images, seller, category, listing flags, plus - when details are on - view/favorite counts, seller profile, item attributes, shipping, bidding, and the seller's full tag-based reviews.
Why use this actor
- Resale & pricing analysts - track asking prices, price types, and category supply across Belgium over time.
- Marketplace intelligence - benchmark seller activity, verification, and buyer feedback for competitor or vendor research.
- Data teams - feed structured records into dashboards, warehouses, alerts, or matching engines.
- Lead generation - surface active sellers and dealers with contact context for prospect research.
Input parameters
Provide a keyword + filters (search mode) or paste listing/search URLs (url mode).
| Parameter | Type | Description | Default |
|---|---|---|---|
mode | string | search (keyword + filters) or url (paste listing/search links). | search |
queries | string[] | Search keywords (one per line), e.g. bmw, iphone, fiets. Each runs a separate search. | - |
domain | string | 2dehands.be (Dutch) or 2ememain.be (French). Same catalogue. | 2dehands.be |
minPrice | integer | Keep only listings priced at or above this amount (EUR). 0 = keep all. | 0 |
maxPrice | integer | Keep only listings priced at or below this amount (EUR). 0 = no upper bound. | 0 |
sort | string | optimized | date_desc | date_asc | price_asc | price_desc. | optimized |
categoryId | integer | Restrict to a top-level category by numeric id. 0 = all categories. | 0 |
startUrls | string[] | Search/category pages (e.g. https://www.2dehands.be/q/bmw/) or single listing pages (a /v/ link fetches just that item). | - |
fetchDetails | boolean | Open each listing page for view/favorite counts, full category, seller profile, item attributes, shipping, bidding, and reviews. Billed as a detail-enrichment surcharge. | false |
includeReviews | boolean | When details are on, capture the seller's tag-based reviews and rating summary. | true |
maxReviews | integer | Cap on individual reviews captured per listing's seller. | 20 |
maxItems | integer | The run cap - global max listings returned (0 = unlimited, clamped to 1000). | 20 |
maxPages | integer | Per-search page limit (30 listings/page). Defaults to no practical limit (stops at maxItems). | 200 |
proxy | object | Proxy settings. Residential country BE is recommended. | Residential BE |
resumeFromRunId | string | Continue one specific previous run/dataset: listings already saved there are loaded before scraping starts and skipped, so this run only appends new listings. For recurring monitoring of the same search, use incrementalMode instead — see "Resume & recurring updates" below. | (empty) |
incrementalMode | boolean | Recurring monitoring of this same search. First run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED by default. See "Resume & recurring updates" below. | false |
stateKey | string | Optional name for a monitoring campaign, so its incremental state stays stable or is deliberately shared. Auto-derived from your search/filter settings when left empty. | (empty) |
emitUnchanged | boolean | Incremental mode only. Also return listings unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have. | false |
emitExpired | boolean | Incremental mode only. Also return listings from a previous run no longer found, marked EXPIRED, once a run has fully scanned the search (not capped, not a resume). Adds and bills extra synthetic rows. | false |
One cap rule
maxItems is the single cap. maxPages defaults high and stops at maxItems. Set maxPages only when you want a hard per-search page limit.
Price filter
minPrice / maxPrice are applied to each listing's price so the result is always exact. Note that some listings use non-fixed price types (see below) with a zero price; those are excluded whenever a price bound is set.
Output
Each record carries a stable type + itemId + url envelope. Core and extended fields:
- Core:
itemId,title,url,description,categorySpecificDescription,thinContent,sourceSite,seedValue,scrapedAt - Incremental mode only:
changeType(NEW/UPDATED/UNCHANGED/REAPPEARED/EXPIRED),changedFields,firstSeenAt,lastSeenAt— see "Resume & recurring updates" below - Price:
price,priceCents,priceType(e.g.FIXED,RESERVED,MIN_BID,FAST_BID,ON_REQUEST,FREE,EXCHANGE,SEE_DESCRIPTION) - Location:
city,countryName,countryAbbreviation,latitude,longitude,distanceMeters - Media:
imageUrl,imageUrls[],pictures[](raw, with all size variants),date - Seller (card):
sellerId,sellerName,sellerVerified,sellerInformation(raw) - Flags:
categoryId,priorityProduct,videoOnVip,urgencyFeatureActive,napAvailable,reserved,traits[],verticals[],extendedAttributes[]
When fetchDetails is on, each record is also enriched with:
- Listing detail:
viewCount,favoritedCount,detailImageUrls[],categoryName,categoryFullName,categoryParentName,attributes[](plus flattenedattr_<key>),carDetails(for vehicles),shippingDeliveryType,biddingEnabled,bidCount,adType,buyItNowEnabled,isReserved,highlights[] - Seller profile:
sellerType(consumer/dealer),sellerActiveYears,sellerProfileUrl,sellerContactOptions[],sellerPaymentMethod,sellerSmbVerified,sellerHasPhone,sellerResponseRate,sellerResponseSpeed,sellerResponseLabel - Reviews:
sellerRating,sellerReviewCount,sellerReviewSystem,sellerReviewsSummary(average score, rating distribution, positive/negative characteristic tags), andreviews[]
Reviews are tag-based (captured in full)
Seller feedback on these sites is structured, not free-text prose. Each review carries a 1-5 score, the transacted item's title and category, the reviewer's name, the date, the review direction (buyer-to-seller or seller-to-buyer), and a set of positive/negative characteristic tags (short phrases). Every one of those fields is captured. Each reviews[] element looks like:
{"reviewId": "r-000","author": "sample_buyer","date": "2025-05-01T10:00:00Z","score": 5,"direction": "B2S","reviewedItemTitle": "Sample bicycle","reviewedItemCategory": "Bikes","isSeller": true,"feedbackTags": [{ "text": "Fast handling", "isPositive": true },{ "text": "Friendly contact", "isPositive": true }]}
Example inputs
Keyword search:
{"mode": "search","queries": ["bmw"],"domain": "2dehands.be","sort": "price_asc","minPrice": 2000,"maxItems": 50}
Listings with full detail + reviews:
{"mode": "search","queries": ["iphone"],"fetchDetails": true,"includeReviews": true,"maxReviews": 30,"maxItems": 25}
Paste URLs:
{"mode": "url","startUrls": ["https://www.2dehands.be/q/fiets/","https://www.2ememain.be/q/velo/"],"maxItems": 40}
Resume & recurring updates
| Situation | Use |
|---|---|
| A crawl stopped and should continue | resumeFromRunId |
| Run the same search on a schedule and receive only changes | incrementalMode |
| Keep separate recurring campaigns for similar searches | distinct stateKey values |
Resume (resumeFromRunId) continues one specific interrupted or previous large crawl: paste a run ID or dataset ID and this run skips listings already collected there, returning only the remaining new listings.
Incremental mode (incrementalMode) is for a schedule (for example, daily): the actor remembers the previous run of the same search by itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED listings by default — duplicates and unchanged listings are suppressed (and not charged). Turn on emitUnchanged or emitExpired only when you also want those rows returned (and billed for). State is isolated per mode/query/domain/category/price-filter/URL/fetchDetails combination automatically; set stateKey to name or deliberately share a monitoring campaign.
{ "mode": "search", "queries": ["fiets"], "domain": "2dehands.be", "incrementalMode": true }
EXPIRED rows are only produced once a run has genuinely scanned every page of every search with no cap hit and no resumeFromRunId — a capped or resumed run leaves previously-tracked listings' state untouched rather than guessing they disappeared.
Send results into your apps (MCP connectors)
Optionally pipe a condensed summary of each result into the apps you already use via Model Context Protocol (MCP) connectors - Notion, Linear, Airtable, or Apify. Select connectors in the input; the full record always stays in the dataset. For the Notion connector, provide a parent page. Connections go through the Apify MCP Proxy, so the actor never sees your third-party credentials.
Pricing
Pay-per-event: a Results event per dataset row, plus a small detail-enrichment event per listing enriched (only when fetchDetails is on). An Apify Actor Start event covers compute.
Connection guidance
Apify Residential proxy set to country BE gives the highest reliability, since both sites are Belgian. Some datacenter exit IPs may be geo-restricted; if a run returns no results, switch the proxy to Residential country BE or re-run for a fresh exit IP. If you are on the Apify Free plan, residential proxy access is not included - upgrade or paste your own residential proxy URLs in the proxy field.
Compliance & ethics
This actor collects publicly available classifieds information from 2dehands.be and 2ememain.be for legitimate research purposes (pricing research, marketplace monitoring, competitive analysis). Users are responsible for ensuring their collection, storage, and use complies with applicable laws, regulations, and platform terms. This section is informational, not legal advice.