{
  "openapi": "3.0.1",
  "info": {
    "title": "OLX Property Scraper - Real Estate Listings & Prices",
    "description": "Scrape OLX real estate listings in seven countries: asking price, floor area, rooms, GPS, photos, the full description and the seller record. Poland, Portugal, Romania, Bulgaria, Ukraine, Kazakhstan and Uzbekistan, with a private-owner filter.",
    "version": "1.0",
    "x-build-id": "RHbf1r1jZsdsDdkre"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~olx-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-olx-property-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/sian.agency~olx-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-olx-property-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/sian.agency~olx-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-olx-property-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "operation": {
            "title": "🎯 What do you want to scrape?",
            "enum": [
              "search",
              "detail"
            ],
            "type": "string",
            "description": "Pick one per run. Property Listing returns listing rows for a country, property type and location; Listing Detail takes OLX listing URLs or offer IDs and returns the same full record for each.",
            "default": "search"
          },
          "country": {
            "title": "🌍 OLX country site",
            "enum": [
              "pl",
              "pt",
              "ro",
              "bg",
              "ua",
              "kz",
              "uz"
            ],
            "type": "string",
            "description": "Which OLX country site to search. Each country is a separate marketplace with its own listings, currency and language, so pick one per run and run again for the next. Poland, Portugal and Romania each carry over 150,000 live property ads.",
            "default": "pl"
          },
          "propertyType": {
            "title": "🏠 Property type",
            "enum": [
              "all",
              "apartments-sale",
              "apartments-rent",
              "houses-sale",
              "houses-rent",
              "land",
              "commercial",
              "garages",
              "rooms"
            ],
            "type": "string",
            "description": "Which slice of the country's property section to take. Every option was checked against the live market in all seven countries. Two of them do not split the same way: Portugal groups apartments and houses without a sale-versus-rent split, and Bulgaria has no separate rooms section. Where that happens the nearest parent section is searched and the run log says so.",
            "default": "apartments-sale"
          },
          "query": {
            "title": "🔑 Keyword",
            "type": "string",
            "description": "Optional free-text keyword, matched the way OLX's own search box matches it, in the site's language. Leave it empty to take the whole property type for the location.",
            "default": ""
          },
          "city": {
            "title": "🏙️ City",
            "type": "string",
            "description": "City name in the country's own language and spelling — Warszawa, Kraków, Porto, București, София, Київ, Алматы. The name is resolved to OLX's own location at run time, so accents and case do not matter. A few names sit at region level on their own site (Lisboa is a region on olx.pt, not a city); those search the whole region and the run log says so. Leave it empty to search the whole country.",
            "default": ""
          },
          "region": {
            "title": "🗺️ Region or province",
            "type": "string",
            "description": "Region, province or oblast name — Mazowieckie, Lisboa, Cluj, Одеська. Use it on its own to cover a whole region, or together with a city to disambiguate a name that exists twice.",
            "default": ""
          },
          "minPrice": {
            "title": "💵 Min price",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest asking price to include, in the country's own currency (PLN, EUR, BGN, UAH, KZT, UZS). 0 means no lower bound.",
            "default": 0
          },
          "maxPrice": {
            "title": "💰 Max price",
            "minimum": 0,
            "type": "integer",
            "description": "Highest asking price to include, in the country's own currency. 0 means no upper bound. For rentals this is the monthly rent, not the sale price.",
            "default": 0
          },
          "minArea": {
            "title": "📐 Min area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Smallest floor area in square metres. 0 means no lower bound. Land listings measure plot area with the same filter.",
            "default": 0
          },
          "maxArea": {
            "title": "📏 Max area (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Largest floor area in square metres. 0 means no upper bound.",
            "default": 0
          },
          "sellerType": {
            "title": "🧑‍💼 Listed by",
            "enum": [
              "all",
              "private",
              "business"
            ],
            "type": "string",
            "description": "Private owners are the for-sale-by-owner side of OLX and the reason most people scrape it; agencies and developers are the competitive-intelligence side. Poland alone showed 98,171 private and 58,782 business property ads when this was measured.",
            "default": "all"
          },
          "sellerId": {
            "title": "🆔 Seller ID",
            "type": "string",
            "description": "Return every property ad from one OLX seller. Take the numeric id from the sellerId column of an earlier run, or from an OLX profile URL. It combines with the filters above, so you can also take just one agency's rentals in one city.",
            "default": ""
          },
          "sortBy": {
            "title": "↕️ Sort by",
            "enum": [
              "created_at:desc",
              "relevance:desc",
              "filter_float_price:asc",
              "filter_float_price:desc"
            ],
            "type": "string",
            "description": "Newest first is what you want on a schedule — the top of the feed is everything posted since your last run. Cheapest or most expensive first is how you take the tails of a market without paging through the middle.",
            "default": "created_at:desc"
          },
          "maxResults": {
            "title": "🔢 Max listings",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Stop after this many listings. Rows arrive in pages of about 65, so the run finishes the page that crosses your limit and then stops. OLX itself caps any single search near 1,050 rows — to go wider, add a city, a price band or another property type.",
            "default": 100
          },
          "searchUrls": {
            "title": "🌐 OLX search URLs",
            "type": "array",
            "description": "Paste OLX search addresses instead of filling the fields above. Build the search on the site with whatever filters you like — rooms, floor, furnished, building year, heating — and paste the address bar. Filters this form does not expose still apply, because the address is read the way OLX reads it.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "listingUrls": {
            "title": "🔗 Listing URLs or offer IDs",
            "type": "array",
            "description": "Used by the Listing Detail operation: OLX listing addresses such as https://www.olx.pl/d/oferta/...-ID1c1Lqa.html, or bare numeric offer IDs. This is how you refresh price and status on a list you already hold.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}