{"description":"Searches 2ememain.be (Belgian second-hand classifieds, the Dutch side of 2dehands) like its search page: title, price in euros, link, and whether the listing is paid-promoted ('Annonce au top' or 'Pub au top'). First page of results (about 30 listings). Promoted listings are kept and flagged, not dropped, because most of a page can be promoted. Returns an empty list when nothing matches.","effect":"read","id":"2ememain.be/search-listings","keywords":["2ememain","2dehands","tweedehands","tweedehandsmarkt","advertenties","kleinanzeigen","classifieds","belgie","belgique","occasion","annonces","marketplace"],"output":{"schema":{"properties":{"listings":{"items":{"properties":{"price_eur":{"description":"Asking price in euros; null for 'Gratis' or bid-only listings","type":["number","null"]},"promoted":{"description":"True when the listing carries a paid promotion label","type":"boolean"},"title":{"type":"string"},"url":{"type":"string"}},"required":["title","url"],"type":"object"},"type":"array"},"query":{"type":"string"}},"required":["query","listings"],"type":"object"},"value":"{query: params.query, listings: steps.search.listings[?title != `null` && href != `null`].{title: title, price_eur: (price && to_number(replace(replace(replace(replace(price, '€', ''), ' ', ''), '.', ''), ',', '.'))) || `null`, promoted: contains(promo || '', 'au top'), url: join('', ['https://www.2ememain.be', href])}}"},"params":{"additionalProperties":false,"properties":{"query":{"description":"Search term, e.g. 'fiets', 'bank', 'smartphone'","maxLength":100,"minLength":2,"type":"string"}},"required":["query"],"type":"object"},"provenance":{"method":"har","notes":"GET /q/<term>/?trackSearch=1: the HTML contains the first page of listing cards (li.hz-Listing). Title from the bold title span, URL from the card link href (relative /v/... joined to the origin), price from the h5 price text such as '€ 20,00'. The page also embeds the same listings in __NEXT_DATA__; the HTML selectors were used because the embedded data has no URL field. Hashed CSS-module classes were avoided, and the paid-promotion labels ('Annonce au top', 'Pub au top') set the promoted flag. Cards without a link are dropped.","recorded_at":"2026-11-08T15:23:25.000Z","recorded_by":"wield-forge (claude-haiku agent)"},"requires_login":false,"schema":"https://wield.run/schema/recipe/v1.json","site":{"country":"BE","id":"2ememain.be","language":"nl","name":"2ememain","origin":"https://www.2ememain.be","origins":["https://www.2ememain.be"]},"steps":[{"description":"Server-rendered search page /q/<term>/ (read-only GET). Each listing is li.hz-Listing with a link to the listing page.","expect":{"content_type":"html","status":[200]},"extract":{"html_items":{"listings":{"fields":{"href":{"attr":"href","selector":"a.hz-Link--block"},"price":{"selector":"a.hz-Link--block h5"},"promo":{"selector":"[class*='hz-Listing-priority']"},"title":{"selector":"a.hz-Link--block .hz-Text--bodyBaseStrong"}},"max":60,"selector":"li.hz-Listing"}}},"id":"search","request":{"headers":{"Accept":"text/html"},"method":"GET","query":{"trackSearch":"1"},"url":"/q/{{params.query | urlencode}}/"}}],"task":"Search 2ememain classifieds","tos":{"notes":"Not reviewed. One search page per call, the same page a visitor loads. The site's terms on automated access were not checked.","reviewed":false},"verify":{"checks":["length(output.listings) > `0`","length(output.listings[?starts_with(url, 'https://www.2ememain.be/v/')]) == length(output.listings)","length(output.listings[?title != `null`]) == length(output.listings)","length(output.listings[?promoted]) <= length(output.listings)"],"example_params":{"query":"vélo"},"max_ms":8000},"version":1}