Sign inTry it

Search OLX Poland listings by price, city and condition.

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.

No reports yetRead-only, no login
Site
OLX, Poland
Version
v1
Runs, last 7 days
No reports yet
sha256
52fa47d3e0ee…

Run it with your agent

after installing Wield

Ask in plain words. Your agent finds this recipe and calls it:

“Search OLX Poland listings by price, city and condition.”

Read-only: it changes nothing on the site. No login needed.

{
  "tool": "run",
  "arguments": {
    "recipe_id": "olx.pl/search-listings",
    "params": {
      "city": "Kraków",
      "condition": "used",
      "max_price": 500,
      "query": "rower",
      "sort": "price_low"
    }
  }
}

Requests

sent from your browser, in order
  1. 1GET/api/v1/geo-encoder/location-autocomplete/?queryOnly with a city: OLX's own place lookup (the location box on the site calls it); the first match gives the city id.repeats, max 1
  2. 2GET/api/v1/offers/?city_id&distance&filter_enum_state[0]&filter_float_price:from&filter_float_price:to&limit&offset&query&sort_byThe offers API the search page itself calls. The one-item foreach maps sort, condition, price range and page to OLX's parameters.repeats, max 1

Parameters

from your agent
citystringPolish city or town, e.g. 'Kraków', 'Gdańsk'; the best match from OLX's own place lookup is used
conditionenum "any" | "new" | "used" = "any"
distance_kmenumRadius around the city (only with city) 0 | 2 | 5 | 10 | 15 | 30 | 50 | 75 | 100
include_promotedbooleanKeep paid top ads (marked promoted); they are shown first regardless of the sort = false
max_pricenumberPLN
min_pricenumberPLN
pageinteger = 1
querystringrequiredWhat to look for, e.g. 'rower', 'iphone 13', 'wózek dziecięcy'
sortenum "relevance" | "newest" | "price_low" | "price_high" = "relevance"

Returns

to your agent
citystringThe city OLX matched, if one was given
listingsobject[]city, condition, district, id, image, negotiable, olx_delivery, posted_at, previous_price_pln, price_label, price_pln, price_type, promoted, refreshed_at, region, seller_type, title, url
pageinteger
querystring
regionstring
totalinteger

Where it can send

  • www.olx.pl

Anything else is blocked by the extension.

Reads from your session

Nothing. Your browser attaches the site's cookies by itself.

Used only in requests to the addresses on the left. Never sent to wield.run or your agent.

Checks

a run passes when
  • 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`

Raw recipe

Served as canonical JSON from /api/v1/recipes/olx.pl/search-listings, so its sha256 matches the ETag and the index.

Check it yourself
curl -s https://wield.run/api/v1/recipes/olx.pl/search-listings | shasum -a 256
# 52fa47d3e0ee18fe555e316f54ac52d29d0e50a168f2f73cd0bf731c953f3fc5
olx.pl/search-listings.json, v1
{
  "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
}