{"description":"Searches Motonet, the Finnish vehicle and tools retailer, like its search page: product name, brand, category, price in euros and product link. First page of results (up to 30 products).","effect":"read","id":"motonet.fi/search-products","keywords":["motonet","motonet.fi","tuotteet","haku","työkalut","moottoripyörä","autotarvikkeet","suomi","finland","tools","products","power tools","shop","porakone"],"output":{"schema":{"properties":{"products":{"items":{"properties":{"brand":{"type":["string","null"]},"category":{"type":["string","null"]},"name":{"type":"string"},"price_eur":{"description":"Price in euros, null when not shown","type":["number","null"]},"url":{"type":"string"}},"required":["name","url"],"type":"object"},"type":"array"},"query":{"type":"string"}},"required":["query","products"],"type":"object"},"value":"let $pairs = zip(steps.search.cards, steps.search.products)[?split(@[0].href, '=')[1] == @[1].id && @[0].name != `null`] in {query: params.query, products: $pairs[*].{name: [0].name, brand: [1].brand || `null`, category: [1].categoryName || `null`, price_eur: ([1].price && to_number(replace([1].price, ',', '.'))) || `null`, url: join('', ['https://www.motonet.fi', [0].href])}}"},"params":{"additionalProperties":false,"properties":{"query":{"description":"Product term, e.g. 'porakone', 'kuulokkeet', 'nurmikkotraktori'","maxLength":100,"minLength":2,"type":"string"}},"required":["query"],"type":"object"},"provenance":{"method":"har","notes":"GET /haku?q=<query> returns 200 HTML. The product data (id, name, price such as '99,90', brand, categoryName) is in script#__NEXT_DATA__ under the productSearch query. The HTML cards (article.complex-link-card) give the product link href /tuote/...?product=<id>; prices are not in the cards because they load client-side. The two lists are paired on the product id from the link. No cross-site hosts are called.","recorded_at":"2026-11-08T16:30:00.000Z","recorded_by":"wield-forge (claude-haiku agent)"},"requires_login":false,"schema":"https://wield.run/schema/recipe/v1.json","site":{"country":"FI","id":"motonet.fi","language":"fi","name":"Motonet","origin":"https://www.motonet.fi","origins":["https://www.motonet.fi"]},"steps":[{"description":"Search results page /haku?q=...; read-only GET. The product list is in script#__NEXT_DATA__ (the productSearch query); the link cards in the HTML give the product URLs. The two lists are paired by product id in output.","expect":{"content_type":"html","status":[200]},"extract":{"embedded_json":{"required":true,"selector":"script#__NEXT_DATA__","vars":{"products":"props.pageProps.dehydratedState.queries[?queryKey[0] == 'productSearch'] | [0].state.data.products"}},"html_items":{"cards":{"fields":{"href":{"attr":"href","selector":"a.complex-link-card__link"},"name":{"selector":"a.complex-link-card__link"}},"max":60,"selector":"article.complex-link-card"}}},"id":"search","request":{"headers":{"Accept":"text/html"},"method":"GET","query":{"q":"{{params.query}}"},"url":"/haku"}}],"task":"Search products on Motonet","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.products) > `0`","length(output.products[?price_eur != `null`]) > `0`","length(output.products[?starts_with(url, 'https://www.motonet.fi/tuote/')]) == length(output.products)"],"example_params":{"query":"porakone"},"max_ms":5000},"version":1}