{
  "openapi": "3.0.1",
  "info": {
    "title": "Halo Oglasi Scraper - Serbia Property Listings",
    "description": "Scrape halooglasi.com property listings across Serbia: asking price and price per m2, area, rooms, floor, heating, condition, street, geo coordinates, seller type and agency. Halo Oglasi nekretnine data in JSON, CSV or Excel.",
    "version": "1.0",
    "x-build-id": "OevI4iOQRDJgxDSLp"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sian.agency~halooglasi-property-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sian.agency-halooglasi-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~halooglasi-property-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sian.agency-halooglasi-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~halooglasi-property-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sian.agency-halooglasi-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 to collect",
            "enum": [
              "search",
              "detail"
            ],
            "type": "string",
            "description": "One per run. Property Search walks halooglasi.com result pages and returns a complete record per listing straight from the card. Property Detail opens the listings you list under Listing URLs and adds coordinates, heating, condition, the amenity list, every photo, the full seller description and the advertising agency.",
            "default": "search"
          },
          "category": {
            "title": "🏠 Property category",
            "enum": [
              "prodaja-stanova",
              "izdavanje-stanova",
              "prodaja-kuca",
              "izdavanje-kuca",
              "prodaja-zemljista",
              "prodaja-lokala",
              "izdavanje-lokala",
              "izdavanje-soba",
              "izdavanje-garaza",
              "prodaja-poslovnih-zgrada",
              "prodaja-ugostiteljskih-objekata"
            ],
            "type": "string",
            "description": "The portal's own property section. Sale categories start with prodaja, rental categories with izdavanje — the counts shown are the live nationwide totals on 2026-09-10. Applies to Property Search; Property Detail follows whatever each URL points at.",
            "default": "prodaja-stanova"
          },
          "city": {
            "title": "📍 City or municipality",
            "enum": [
              "any",
              "beograd",
              "novi-sad",
              "nis",
              "kragujevac",
              "ada",
              "aleksandrovac",
              "aleksinac",
              "alibunar",
              "apatin",
              "arandjelovac",
              "arilje",
              "babusnica",
              "bajina-basta",
              "batocina",
              "bac",
              "backa-palanka",
              "backa-topola",
              "backi-petrovac",
              "bela-crkva",
              "bela-palanka",
              "beocin",
              "becej",
              "blace",
              "bogatic",
              "bojnik",
              "boljevac",
              "bor",
              "bosilegrad",
              "brus",
              "bujanovac",
              "crna-trava",
              "despotovac",
              "decani",
              "dimitrovgrad",
              "doljevac",
              "dragas",
              "gadzin-han",
              "glogovac",
              "gnjilane",
              "golubac",
              "gornji-milanovac",
              "indjija",
              "irig",
              "istok",
              "ivanjica",
              "jagodina",
              "kanjiza",
              "kacanik",
              "kikinda",
              "kladovo",
              "klina",
              "knic",
              "knjazevac",
              "koceljeva",
              "kopaonik",
              "kosjeric",
              "kosovo-polje",
              "kosovska-kamenica",
              "kosovska-mitrovica",
              "kovacica",
              "kovin",
              "kraljevo",
              "krupanj",
              "krusevac",
              "kula",
              "kursumlija",
              "kucevo",
              "lajkovac",
              "lapovo",
              "lebane",
              "leposavic",
              "leskovac",
              "lipljan",
              "ljig",
              "ljubovija",
              "loznica",
              "lucani",
              "majdanpek",
              "mali-idjos",
              "mali-zvornik",
              "malisevo",
              "malo-crnice",
              "medvedja",
              "merosina",
              "mionica",
              "negotin",
              "nova-crnja",
              "nova-varos",
              "novi-becej",
              "novi-knezevac",
              "novi-pazar",
              "novo-brdo",
              "obilic",
              "odzaci",
              "opovo",
              "orahovac",
              "osecina",
              "pancevo",
              "paracin",
              "petrovac-na-mlavi",
              "pec",
              "pecinci",
              "pirot",
              "plandiste",
              "podujevo",
              "pozarevac",
              "pozega",
              "presevo",
              "priboj",
              "prijepolje",
              "prizren",
              "pristina",
              "prokuplje",
              "raca",
              "raska",
              "razanj",
              "rekovac",
              "ruma",
              "senta",
              "secanj",
              "sjenica",
              "smederevo",
              "smederevska-palanka",
              "sokobanja",
              "sombor",
              "srbica",
              "srbobran",
              "sremska-mitrovica",
              "sremski-karlovci",
              "stara-pazova",
              "subotica",
              "surdulica",
              "suva-reka",
              "svilajnac",
              "svrljig",
              "tara",
              "temerin",
              "titel",
              "topola",
              "trgoviste",
              "trstenik",
              "tutin",
              "ub",
              "urosevac",
              "uzice",
              "valjevo",
              "varvarin",
              "velika-plana",
              "veliko-gradiste",
              "vitina",
              "vladimirci",
              "vladicin-han",
              "vlasotince",
              "vranje",
              "vranjska-banja",
              "vrbas",
              "vrnjacka-banja",
              "vrsac",
              "vucitrn",
              "zajecar",
              "zlatibor",
              "zrenjanin",
              "zubin-potok",
              "zvecan",
              "cicevac",
              "cuprija",
              "cajetina",
              "cacak",
              "coka",
              "djakovica",
              "sabac",
              "sid",
              "stimlje",
              "strpce",
              "zabalj",
              "zabari",
              "zagubica",
              "zitiste",
              "zitoradja"
            ],
            "type": "string",
            "description": "The portal's own location tree: 179 Serbian cities and municipalities, largest first. Beograd, Novi Sad, Niš and Kragujevac carry most of the stock. Choose All Serbia to walk the nationwide result set instead. Neighbourhood and street-level slices are not in this list — paste the portal's own search address into Search URLs for those.",
            "default": "beograd"
          },
          "searchUrls": {
            "title": "🔗 Search URLs",
            "type": "array",
            "description": "Optional. Paste halooglasi.com search addresses verbatim, one object per row, e.g. {\"url\": \"https://www.halooglasi.com/nekretnine/prodaja-stanova/beograd?cena_d_from=80000&cena_d_to=150000\"}. Every filter already in the address is honoured exactly as the portal built it, which is how neighbourhood, street and map slices are reached. When this is filled the category and city choices above are ignored.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxResults": {
            "title": "📦 Max listings",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Stop after this many listings (search) or this many detail rows. One row per listing; duplicates across pages are removed before the count. FREE accounts are capped lower — see the run log.",
            "default": 100
          },
          "minPrice": {
            "title": "💰 Price from",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum asking price (sale categories, EUR) or monthly rent (rental categories, EUR). Passed to the portal's own price filter, so the result count shrinks before anything is charged."
          },
          "maxPrice": {
            "title": "💰 Price up to",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum asking price or monthly rent in EUR. The portal quotes every property price in euros, including rentals."
          },
          "minArea": {
            "title": "📐 Area from (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum floor area in m². For land categories the portal measures in ari (1 ar = 100 m²) and this filter follows its own unit."
          },
          "maxArea": {
            "title": "📐 Area up to (m²)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum floor area in m²."
          },
          "minRooms": {
            "title": "🛏️ Rooms from",
            "enum": [
              "any",
              "0.5",
              "1.0",
              "1.5",
              "2.0",
              "2.5",
              "3.0",
              "3.5",
              "4.0",
              "4.5",
              "5.0",
              "5+"
            ],
            "type": "string",
            "description": "Smallest layout to include, in the portal's own Serbian ladder — a garsonjera counts as 0.5 and a jednoiposoban as 1.5. Applies to residential categories.",
            "default": "any"
          },
          "maxRooms": {
            "title": "🛏️ Rooms up to",
            "enum": [
              "any",
              "0.5",
              "1.0",
              "1.5",
              "2.0",
              "2.5",
              "3.0",
              "3.5",
              "4.0",
              "4.5",
              "5.0",
              "5+"
            ],
            "type": "string",
            "description": "Largest layout to include.",
            "default": "any"
          },
          "sellerType": {
            "title": "🧑‍💼 Who is selling",
            "enum": [
              "any",
              "owner",
              "agency",
              "developer"
            ],
            "type": "string",
            "description": "The portal's own seller segment. Owner-listed stock is where fee-free deals sit; developer-listed stock is the new-build pipeline. Every returned row repeats this in its own sellerType field, so the filter is checkable against the data.",
            "default": "any"
          },
          "buildingType": {
            "title": "🏗️ Build",
            "enum": [
              "any",
              "old",
              "new"
            ],
            "type": "string",
            "description": "Existing stock or new construction, as the portal classifies it.",
            "default": "any"
          },
          "condition": {
            "title": "🛠️ Condition",
            "enum": [
              "any",
              "original",
              "renovated",
              "lux",
              "needs-work"
            ],
            "type": "string",
            "description": "The portal's four condition bands. Needs-renovation stock is the value-add filter; lux is the premium band.",
            "default": "any"
          },
          "heating": {
            "title": "🔥 Heating",
            "enum": [
              "any",
              "central",
              "electric",
              "storage-heater",
              "gas",
              "underfloor",
              "tiled-stove",
              "heat-pump"
            ],
            "type": "string",
            "description": "Heating system. In Serbian stock this is a price driver in its own right — district heating (CG) and gas carry a premium over storage heaters.",
            "default": "any"
          },
          "postedWithinHours": {
            "title": "🕒 Posted within",
            "enum": [
              "any",
              "24",
              "72",
              "168"
            ],
            "type": "string",
            "description": "Only adverts published inside this window. This is what turns a scheduled run into a new-listing feed: run it daily at 24 hours and you pay only for what appeared since yesterday.",
            "default": "any"
          },
          "listingUrls": {
            "title": "🔗 Listing URLs",
            "type": "array",
            "description": "For Property Detail: halooglasi.com listing addresses, one object per row, e.g. {\"url\": \"https://www.halooglasi.com/nekretnine/prodaja-stanova/blok-21-novi-beograd/5425647093652\"}. The platform validates each row as a URL, so paste the full address rather than the advert number. FREE runs read up to 5.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}