{"description":"Searches OLX.pl, Poland's largest classifieds site, like its search page: title, price in złoty (negotiable, free or swap), previous price, condition, city, region and district, posted and refreshed time, private or business seller, OLX delivery available, image and link. Filters: city with radius, price range, new or used, sort by newest or price. Paid top ads are dropped by default.","effect":"read","id":"olx.pl/search-listings","keywords":["olx","ogłoszenia","sprzedam","kupię","używane","rower","telefon","mieszkanie","second hand","classifieds","poland","used","marketplace","listings"],"output":{"schema":{"properties":{"city":{"description":"The city OLX matched, if one was given","type":["string","null"]},"listings":{"items":{"properties":{"city":{"type":["string","null"]},"condition":{"description":"e.g. 'Używane', 'Nowe', 'Uszkodzone'","type":["string","null"]},"district":{"type":["string","null"]},"id":{"type":"integer"},"image":{"type":["string","null"]},"negotiable":{"type":"boolean"},"olx_delivery":{"description":"Can be bought with OLX delivery (Przesyłka OLX)","type":"boolean"},"posted_at":{"description":"ISO time the listing was created","type":["string","null"]},"previous_price_pln":{"type":["number","null"]},"price_label":{"description":"As OLX shows it, e.g. '200 zł', 'Za darmo', 'Zamienię'","type":["string","null"]},"price_pln":{"type":["number","null"]},"price_type":{"description":"price, arranged (negotiable), free or exchange","type":["string","null"]},"promoted":{"description":"Paid top ad","type":"boolean"},"refreshed_at":{"type":["string","null"]},"region":{"type":["string","null"]},"seller_type":{"enum":["private","business"],"type":"string"},"title":{"type":"string"},"url":{"type":"string"}},"type":"object"},"type":"array"},"page":{"type":"integer"},"query":{"type":"string"},"region":{"type":["string","null"]},"total":{"type":["integer","null"]}},"required":["query","listings"],"type":"object"},"value":"let $keep = params.include_promoted == `true` in {query: params.query, city: steps.place[0].city || `null`, region: steps.place[0].region || `null`, total: steps.search[0].total || `0`, page: params.page || `1`, listings: map(&(let $o = @, $p = (@.params[?key == 'price'] | [0].value) || `{}` in {id: $o.id, title: $o.title, price_pln: $p.value || ($p.type == 'free' && `0`) || `null`, price_label: $p.label || `null`, price_type: $p.type || `null`, negotiable: $p.negotiable == `true`, previous_price_pln: $p.previous_value || `null`, condition: ($o.params[?key == 'state'] | [0].value.label) || `null`, city: $o.location.city.name || `null`, district: $o.location.district.name || `null`, region: $o.location.region.name || `null`, posted_at: $o.created_time || `null`, refreshed_at: $o.last_refresh_time || `null`, seller_type: $o.business == `true` && 'business' || 'private', olx_delivery: $o.delivery.rock.active == `true`, promoted: $o.promotion.top_ad == `true`, image: $o.photos[0].link && replace($o.photos[0].link, '{width}x{height}', '400x300') || `null`, url: $o.url}), steps.search[0].offers || `[]`)[?$keep || !promoted]}"},"params":{"additionalProperties":false,"properties":{"city":{"description":"Polish city or town, e.g. 'Kraków', 'Gdańsk'; the best match from OLX's own place lookup is used","maxLength":60,"minLength":2,"type":"string"},"condition":{"default":"any","enum":["any","new","used"],"type":"string"},"distance_km":{"description":"Radius around the city (only with city)","enum":[0,2,5,10,15,30,50,75,100],"type":"integer"},"include_promoted":{"default":false,"description":"Keep paid top ads (marked promoted); they are shown first regardless of the sort","type":"boolean"},"max_price":{"description":"PLN","minimum":0,"type":"number"},"min_price":{"description":"PLN","minimum":0,"type":"number"},"page":{"default":1,"maximum":25,"minimum":1,"type":"integer"},"query":{"description":"What to look for, e.g. 'rower', 'iphone 13', 'wózek dziecięcy'","maxLength":100,"minLength":2,"type":"string"},"sort":{"default":"relevance","enum":["relevance","newest","price_low","price_high"],"type":"string"}},"required":["query"],"type":"object"},"provenance":{"method":"browser-inspect","notes":"The search page calls GET /api/v1/offers/ (offset, limit 40, query, sort_by created_at:desc / filter_float_price:asc|desc, filter_float_price:from/to, filter_enum_state[0] new|used, city_id, distance). The location box calls /api/v1/geo-encoder/location-autocomplete/?query=…; its first match gives city.id. Paid top ads (promotion.top_ad) come first whatever the sort, so they are dropped by default. metadata.visible_total_count is the count OLX shows (total_elements is capped at 1000). Photo links carry a {width}x{height} placeholder. OLX answers servers 403 (CloudFront) after a couple of requests, so this runs in the user's browser. promotion.top_ad matched metadata.source.promoted (the ad slots 0–2, 13–15, …) exactly in two searches. OLX's search is fuzzy: a query with no real matches still returns loosely related listings (70 for a nonsense query), as the site does.","recorded_at":"2026-11-07T21:56:00+01:00","recorded_by":"C4"},"requires_login":false,"schema":"https://wield.run/schema/recipe/v1.json","site":{"country":"PL","id":"olx.pl","language":"pl","name":"OLX","origin":"https://www.olx.pl","origins":["https://www.olx.pl"]},"steps":[{"description":"Only with a city: OLX's own place lookup (the location box on the site calls it); the first match gives the city id.","expect":{"content_type":"json","status":[200]},"extract":{"json":{"city":"data[0].city.name","city_id":"data[0].city.id","region":"data[0].region.name"}},"foreach":{"as":"c","in":"params.city && [params.city] || `[]`","max":1},"id":"place","request":{"headers":{"Accept":"application/json"},"method":"GET","query":{"query":"{{c}}"},"url":"/api/v1/geo-encoder/location-autocomplete/"}},{"description":"The offers API the search page itself calls. The one-item foreach maps sort, condition, price range and page to OLX's parameters.","expect":{"assert":"body.data != `null`","content_type":"json","status":[200]},"extract":{"json":{"offers":"data","total":"metadata.visible_total_count"}},"foreach":{"as":"f","in":"[{offset: (params.page - `1`) * `40`, sort: (params.sort == 'newest' && 'created_at:desc') || (params.sort == 'price_low' && 'filter_float_price:asc') || (params.sort == 'price_high' && 'filter_float_price:desc') || `null`, state: (params.condition == 'new' && 'new') || (params.condition == 'used' && 'used') || `null`, city_id: steps.place[0].city_id || `null`, distance: steps.place[0].city_id && params.distance_km || `null`}]","max":1},"id":"search","request":{"headers":{"Accept":"application/json"},"method":"GET","query":{"city_id":"{{f.city_id}}","distance":"{{f.distance}}","filter_enum_state[0]":"{{f.state}}","filter_float_price:from":"{{params.min_price}}","filter_float_price:to":"{{params.max_price}}","limit":"40","offset":"{{f.offset}}","query":"{{params.query}}","sort_by":"{{f.sort}}"},"url":"/api/v1/offers/"}}],"task":"Search OLX Poland listings by price, city and condition","tos":{"notes":"OLX's terms forbid automated data collection without consent. The recipe makes the same one or two requests the search page makes, in the user's own browser, one search per call; no messages, no contact details.","reviewed":false},"verify":{"checks":["length(output.listings) > `10`","output.city == 'Kraków'","length(output.listings[?promoted]) == `0`","length(output.listings[?price_pln > `500`]) == `0`","length(output.listings[?starts_with(url, 'https://www.olx.pl/')]) == length(output.listings)","output.total > `100`"],"example_params":{"city":"Kraków","condition":"used","max_price":500,"query":"rower","sort":"price_low"},"max_ms":4000},"version":1}