{"description":"Lists Pyszne.pl restaurants (and shops) that deliver to, or offer pickup near, an address: rating, delivery time, delivery fee, minimum order, free-delivery threshold, cuisines, deals and menu link. Filters by cuisine, name and open-now. Paid sponsored placements are removed by default, so the order is Pyszne.pl's organic ranking.","effect":"read","id":"pyszne.pl/search-restaurants","keywords":["pyszne","jedzenie na dowóz","zamów jedzenie","dostawa","odbiór","restauracja","pizza","sushi","kebab","takeaway","food delivery","order food","restaurants near me","just eat","poland"],"output":{"schema":{"properties":{"address":{"description":"Address actually used (first autocomplete match)","type":"string"},"area":{"type":["string","null"]},"postal_code":{"type":["string","null"]},"restaurants":{"items":{"properties":{"address":{"type":"string"},"cuisines":{"items":{"type":"string"},"type":"array"},"deals":{"items":{"type":"string"},"type":"array"},"delivery_fee_pln":{"description":"Fee at the minimum order value","type":["number","null"]},"distance_m":{"type":["integer","null"]},"eta_min_from":{"type":["integer","null"]},"eta_min_to":{"type":["integer","null"]},"free_delivery_from_pln":{"description":"Order value from which delivery is free, if any","type":["number","null"]},"id":{"type":"string"},"min_order_pln":{"type":["number","null"]},"name":{"type":"string"},"new":{"type":"boolean"},"open_now":{"type":"boolean"},"rating":{"description":"0-5 stars; 0 when unrated","type":["number","null"]},"rating_count":{"type":["integer","null"]},"sponsored":{"type":"boolean"},"url":{"format":"uri","type":"string"}},"type":"object"},"type":"array"},"total":{"description":"Matching restaurants before limit","type":"integer"}},"required":["address","area","total","restaurants"],"type":"object"},"value":"let $s = steps.restaurants, $c = lower(params.cuisine || ''), $n = lower(params.name || ''), $open = params.open_now, $svc = params.service, $inc = params.include_sponsored in let $m = $s.all[?(!$open || (($svc == 'delivery' && open_delivery) || ($svc == 'collection' && open_collection))) && !offline && ($c == '' || length(cuisines[?contains(lower(@), $c)]) > `0` || length(cuisine_keys[?contains(@, $c)]) > `0`) && ($n == '' || contains(lower(name), $n)) && ($inc || !contains($s.sponsored_ids, id))] in let $o = (params.sort == 'rating' && reverse(sort_by($m, &(((rating || `0`) * (rating_count || `0`) + `80`) / ((rating_count || `0`) + `20`))))) || (params.sort == 'distance' && sort_by($m, &distance_m || `999999`)) || $m in {address: steps.address.label, area: $s.area, postal_code: $s.postal_code, total: length($m), restaurants: ((params.limit == `5` && $o[:5]) || (params.limit == `10` && $o[:10]) || (params.limit == `50` && $o[:50]) || $o[:25])[].let $f = (let $id2 = id in $s.fees[?restaurantId == $id2] | [0]) in {id: id, name: name, url: url, cuisines: cuisines, rating: rating, rating_count: rating_count, open_now: $svc == 'delivery' && open_delivery || ($svc == 'collection' && open_collection), eta_min_from: eta_min_from, eta_min_to: eta_min_to, distance_m: distance_m, delivery_fee_pln: $f.bands[0].fee != `null` && $f.bands[0].fee / `100` || `null`, min_order_pln: $f.minimumOrderValue != `null` && $f.minimumOrderValue / `100` || `null`, free_delivery_from_pln: ($f.bands[?fee == `0`] | [0].minimumAmount) != `null` && ($f.bands[?fee == `0`] | [0].minimumAmount) / `100` || `null`, address: address, deals: deals, new: new, sponsored: contains($s.sponsored_ids, id)}}"},"params":{"additionalProperties":false,"properties":{"address":{"description":"Delivery address, postcode or city, e.g. 'Marszałkowska 10, Warszawa' or '00-508 Warszawa'","maxLength":120,"minLength":3,"type":"string"},"cuisine":{"description":"Cuisine filter, matched against Pyszne's cuisine names, e.g. 'sushi', 'pizza', 'kebab', 'burgery'","maxLength":40,"type":"string"},"include_sponsored":{"default":false,"description":"Keep paid sponsored placements (marked sponsored: true)","type":"boolean"},"limit":{"default":25,"description":"Maximum restaurants returned (5, 10, 25 or 50)","enum":[5,10,25,50],"type":"integer"},"name":{"description":"Only restaurants whose name contains this text","maxLength":60,"type":"string"},"open_now":{"default":true,"description":"Only restaurants open now for the chosen service","type":"boolean"},"service":{"default":"delivery","description":"delivery or collection (pickup)","enum":["delivery","collection"],"type":"string"},"sort":{"default":"default","description":"default = Pyszne.pl's organic ranking; rating = best rated first, weighted by number of reviews; distance = closest first","enum":["default","rating","distance"],"type":"string"}},"required":["address"],"type":"object"},"provenance":{"method":"browser-inspect","notes":"A clone of lieferando.de/search-restaurants (same Just Eat Takeaway platform; country code pl in the paths). rest.api.eu-central-1.production.jet-external.com is Just Eat Takeaway.com's own API (the parent of Pyszne.pl), which the site calls cross-origin for address lookup and restaurant lists; no cookies, tokens or custom headers beyond x-jet-application. The discovery response now marks paid placements in promotedPlacement.restaurants (defaultPromoted), no longer in sponsored.all.lists; both shapes are read. Fees are in the smallest currency unit (PLN). Menu links follow the site's URL scheme (https://www.pyszne.pl/menu/<uniqueName>); pyszne.pl's own pages answer servers with a Cloudflare challenge, so the link pattern was not fetched from a server. v2 (2026-11-08 08:34): verify only (the example now lists restaurants whether or not they are open (open_now false): the daily server check runs at 05:00, when no sushi or pizza place near the example address is open, and failed with 0 restaurants); requests and output unchanged.","recorded_at":"2026-11-07T22:14:00+01:00","recorded_by":"C4"},"requires_login":false,"schema":"https://wield.run/schema/recipe/v1.json","site":{"country":"PL","id":"pyszne.pl","language":"pl","name":"Pyszne.pl","origin":"https://www.pyszne.pl","origins":["https://rest.api.eu-central-1.production.jet-external.com"]},"steps":[{"description":"Free text to a Google place id. Without a session param the API mints one and returns it.","expect":{"assert":"length(body.data) > `0`","content_type":"json","status":[200]},"extract":{"json":{"label":"data[0].description","place_id":"data[0].id","session":"session"}},"id":"address","request":{"credentials":"omit","headers":{"Accept":"application/json","x-jet-application":"OneWeb"},"method":"GET","query":{"input":"{{params.address}}","limit":"5","type":"any"},"url":"https://rest.api.eu-central-1.production.jet-external.com/autocomplete/addresses/pl"}},{"expect":{"assert":"length(body.features[0].geometry.coordinates) == `2`","content_type":"json","status":[200]},"extract":{"json":{"lat":"features[0].geometry.coordinates[1]","lng":"features[0].geometry.coordinates[0]"}},"id":"geocode","request":{"credentials":"omit","headers":{"Accept":"application/json","x-jet-application":"OneWeb"},"method":"GET","query":{"session":"{{steps.address.session}}"},"url":"https://rest.api.eu-central-1.production.jet-external.com/autocomplete/addresses/pl/{{steps.address.place_id | urlencode}}"}},{"description":"Discovery API v3 (the version the site uses): all restaurants for the point in one ~3 MB response, fees and sponsored placements in top-level maps.","expect":{"assert":"body.restaurants != null","content_type":"json","status":[200]},"extract":{"json":{"all":"sort_by(restaurants[?isTestRestaurant != `true`], &defaultDisplayRank)[].{id: id, name: name, url: join('', ['https://www.pyszne.pl/menu/', uniqueName]), cuisines: keys(from_items(zip(cuisines[].name, cuisines[].name))), cuisine_keys: cuisines[].uniqueName, rating: rating.starRating, rating_count: rating.count, open_delivery: isOpenNowForDelivery, open_collection: isOpenNowForCollection, offline: isTemporarilyOffline, eta_min_from: deliveryEtaMinutes.rangeLower, eta_min_to: deliveryEtaMinutes.rangeUpper, distance_m: driveDistanceMeters, address: join(', ', [address.firstLine || '', join(' ', [address.postalCode || '', address.city || ''])]), deals: keys(from_items(zip(deals[?trim(description) != ''].trim(description), deals[?trim(description) != ''].trim(description)))), new: isNew}","area":"metaData.area","fees":"values(deliveryFees.restaurants || `{}`)","postal_code":"metaData.postalCode","sponsored_ids":"values(promotedPlacement.restaurants || `{}`)[?defaultPromoted].restaurantId || keys(sponsored.all.lists || `{}`)"}},"id":"restaurants","request":{"credentials":"omit","headers":{"Accept":"application/json;v=3","x-jet-application":"OneWeb"},"method":"GET","query":{"latitude":"{{steps.geocode.lat}}","longitude":"{{steps.geocode.lng}}","ratingsOutOfFive":"true","serviceType":"{{params.service}}","vertical":"all"},"url":"https://rest.api.eu-central-1.production.jet-external.com/discovery/pl/restaurants/enriched"}}],"task":"Find restaurants that deliver to a Polish address (Pyszne.pl)","tos":{"notes":"Pyszne.pl's terms (Just Eat Takeaway) prohibit scraping and automated systematic retrieval. One user-initiated search at a time from the user's own browser (3 requests). The address lookup is billed to Just Eat Takeaway by Google, so do not use it for bulk geocoding. Ordering stays on pyszne.pl.","reviewed":false},"verify":{"checks":["length(output.restaurants) > `0`","output.total >= length(output.restaurants)","contains(output.address, 'Warszawa')","length(output.restaurants[?sponsored]) == `0`","length(output.restaurants[?open_now == `true` || open_now == `false`]) == length(output.restaurants)","starts_with(output.restaurants[0].url, 'https://www.pyszne.pl/menu/')","output.restaurants[0].min_order_pln != `null`"],"example_params":{"address":"Marszałkowska 10, Warszawa","cuisine":"pizza","limit":10,"open_now":false},"max_ms":8000},"version":2}