# Halo Oglasi Scraper - Serbia Property Listings (`sian.agency/halooglasi-property-scraper`) Actor

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.

- **URL**: https://apify.com/sian.agency/halooglasi-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.76 / 1,000 property searches

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Halo Oglasi Scraper – Serbia Property Listings & Prices 🚀

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![4zida](https://img.shields.io/badge/Store-4zida%20Scraper-C6363C)](https://apify.com/sian.agency/4zida-property-scraper?fpr=sian) [![Imovirtual](https://img.shields.io/badge/Store-Imovirtual%20Scraper-1AE392)](https://apify.com/sian.agency/imovirtual-property-scraper?fpr=sian) [![Sreality](https://img.shields.io/badge/Store-Sreality%20Scraper-0C4076)](https://apify.com/sian.agency/sreality-property-scraper?fpr=sian)

#### 🎉 20 complete adverts per request — sale AND rent, from Serbia's biggest classifieds portal

##### Built for valuation analysts, brokerage scouts and prop-tech teams working the Serbian market

***

### 🔎 What is the Halo Oglasi Scraper — and when should you use it?

The **Halo Oglasi Scraper** turns halooglasi.com property adverts from any of 179 Serbian cities, across eleven property categories into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** Serbian property adverts as rows: asking price or monthly rent in euros, price per m2, area, room count, floor, seller segment, publish date, and the full city, municipality, neighbourhood and street chain. The advert id is stable, so scheduled runs deduplicate cleanly. Switch to Property Detail and each row also carries latitude and longitude, heating, build type, condition, monthly utility cost, the amenity list and every photo. Detail rows add the advert's own view counter, the portal's neighbourhood price-per-m2 benchmark, and the advertising agency with its profile and register number. The portal's own filters are inputs too, so price band, area band, room ladder, seller segment, build type, condition, heating and a posted-within window all apply before anything is charged.

**Use something else when:** the advert is on the other Serbian property portal, or you need a market outside Serbia. Use [4zida Scraper](https://apify.com/sian.agency/4zida-property-scraper?fpr=sian) for 4zida.rs, Serbia's dedicated property portal. It is the larger corpus, but a different one: two markets enumerated completely on both sites measured only 50.8% to 61.7% overlap. Use [Imovirtual Scraper](https://apify.com/sian.agency/imovirtual-property-scraper?fpr=sian) for the Portuguese market, listings and the agents behind them. This actor reads the public property vertical of halooglasi.com and nothing else: apartments, houses, land, retail premises, commercial buildings, hospitality premises, rooms and garages, for sale and to rent, across all 179 municipalities the portal indexes. It does not read the site's cars, jobs or general classifieds sections. It does not return seller phone numbers, which the portal masks behind its own click. Join the 4zida actor on street plus price when you want the union of both portals.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/halooglasi-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want property adverts from halooglasi.com, Serbia's biggest classifieds portal using the Apify Actor `sian.agency/halooglasi-property-scraper`.

Use it when I need: Serbian property adverts as rows: asking price or monthly rent in euros, price per m2, area, room count, floor, seller segment, publish date, and the full city, municipality, neighbourhood and street chain. The advert id is stable, so scheduled runs deduplicate cleanly. Switch to Property Detail and each row also carries latitude and longitude, heating, build type, condition, monthly utility cost, the amenity list and every photo. Detail rows add the advert's own view counter, the portal's neighbourhood price-per-m2 benchmark, and the advertising agency with its profile and register number. The portal's own filters are inputs too, so price band, area band, room ladder, seller segment, build type, condition, heating and a posted-within window all apply before anything is charged.

Don't use it when: the advert is on the other Serbian property portal, or you need a market outside Serbia — use 4zida-property-scraper or imovirtual-property-scraper instead.

How to call it: set `category` to one of the eleven property sections (`prodaja-stanova` for apartments to buy, `izdavanje-stanova` to rent, `prodaja-kuca` for houses, `prodaja-zemljista` for land) and `city` to a Serbian municipality slug (`beograd`, `novi-sad`, `nis`, `kragujevac`), or `any` for the whole country. `minPrice`/`maxPrice`, `minArea`/`maxArea`, `minRooms`/`maxRooms`, `sellerType`, `buildingType`, `condition`, `heating` and `postedWithinHours` become the portal's own filters. To reach a neighbourhood or a street, paste the portal's search address into `searchUrls` as {url} objects. For the full record switch `operation` to `detail` and pass advert links in `listingUrls`.

Start with this input:
{
  "operation": "search",
  "category": "prodaja-stanova",
  "city": "beograd",
  "minPrice": 80000,
  "maxPrice": 150000,
  "sellerType": "owner",
  "maxResults": 100
}

Ask me which Serbian cities to cover, whether they want the sale or the rental section, and whether the coordinates, heating, condition and agency block are worth switching to Property Detail, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Pull every Belgrade apartment for sale between 80,000 and 150,000 euros listed by the owner rather than an agency, and summarise the median price per m2 by neighbourhood*
- *Track new Novi Sad rentals daily: run izdavanje-stanova with postedWithinHours set to 24 and list only what appeared overnight*
- *Build an agency lead list for Nis: sweep prodaja-stanova, then run Property Detail on the results and deduplicate by advertiserName to get one row per agency with its profile and register number*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/halooglasi-property-scraper.md](https://apify.com/sian.agency/halooglasi-property-scraper.md).

***

### 📋 Overview

**halooglasi.com is where Serbia looks for property** — 201,000 brand searches a month, 22,200 on the property vertical alone. This actor turns that vertical into rows: about 31,500 live adverts across eleven categories, 179 municipalities, sale and rent, in euros.

**What you get:**

- ✅ **20 complete records per request** — the result card already carries price, price per m², area, rooms, floor, seller segment, publish date and the full city › municipality › neighbourhood › street chain. No advert has to be opened for a usable row.
- ⚡ **The portal's filters are your filters** — price band, area band, the Serbian room ladder, seller segment, build type, condition, heating and a posted-within window all run on the portal. A daily new-listing sweep charges you for the handful that appeared overnight.
- 🎯 **Values read from the portal's own data, not off the page** — asking prices print European-style and room counts print as decimals on the same card, so a naive parser reports thirty rooms. This one reads the structured record.
- 💰 **$2 per 1,000 adverts** — a third under the next-cheapest halooglasi actor on the Store. The full detail record is priced separately and stays optional.
- 💎 **Fields the other halooglasi actors do not return** — coordinates, heating, condition, monthly utility cost and every photo with the seller's own captions. Plus the advert's view counter, the portal's neighbourhood €/m² benchmark, and the agency register number.
- ✨ **Eleven categories** — flats, houses, land in ari with a converted m², retail premises, commercial buildings, hospitality premises, rooms and garages.

***

### ✨ Features

- 🏢 **Eleven property categories**: apartments, houses, land, retail premises, commercial buildings, hospitality premises, rooms and garages — sale and rent.
- 📍 **179 Serbian municipalities**: Beograd, Novi Sad, Niš and Kragujevac down to towns with a single page of stock, plus a nationwide sweep.
- 🎚️ **Eight portal-side filters**: price, area, rooms, seller segment, build type, condition, heating and posted-within.
- 🙋 **Owner-only stock in one click**: the vlasnik segment isolates private sellers — the fee-free corner of the market.
- 🏗️ **Developer pipeline**: novogradnja plus the investitor segment returns new-build units with their activation dates.
- 🧭 **Coordinates on every detail row**: latitude and longitude straight from the advert, ready for a map or a radius join.
- 📊 **The portal's own €/m² benchmark**: what comparable stock in that micro-location and room count has been asking.
- 🖼️ **Every photo, with captions**: the whole gallery, carrying the seller's own room labels.
- 🔗 **Paste any search address**: neighbourhood, street and map slices are honoured exactly as the portal built them.
- 🇷🇸 **Latin and Cyrillic**: text comes back as the seller wrote it, and Cyrillic place names resolve.

***

### 🎬 Quick Start

Pick a category, pick a city, press Start. The default run reads Belgrade apartments for sale. Everything else — price bands, seller segment, freshness — narrows the search on the portal before a single row is charged.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~halooglasi-property-scraper/runs?token=YOUR_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"operation":"search","category":"prodaja-stanova","city":"beograd","maxResults":100}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose the section

Set **Property category** — `prodaja-stanova` for apartments to buy, `izdavanje-stanova` to rent, `prodaja-kuca` for houses, `prodaja-zemljista` for land.

#### Step 2: Choose the place

Pick a **City** from the portal's own list of 179 municipalities, or `any` for the whole country. For a neighbourhood or a street, paste the portal's search address into **Search URLs** instead.

#### Step 3: Narrow it, then run

Add a price band, an area band, a seller segment or a posted-within window, set **Max listings**, and press Start.

**That's it. What you end up with:**

- One row per advert, with price, area, rooms, floor and the full location chain
- A CSV, JSON or Excel export you can open in a spreadsheet
- An HTML run report showing what was returned and what it cost

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|---|---|---|---|
| `operation` | select | No | `search` (default) or `detail` |
| `category` | select | No | One of eleven property sections; default `prodaja-stanova` |
| `city` | select | No | Serbian municipality slug; default `beograd`, `any` for nationwide |
| `searchUrls` | array | No | Paste portal search addresses verbatim as `{"url": "…"}` objects |
| `maxResults` | integer | No | Whole-run row budget; default 100 |
| `minPrice` / `maxPrice` | integer | No | Asking price or monthly rent, in euros |
| `minArea` / `maxArea` | integer | No | Floor area in m² |
| `minRooms` / `maxRooms` | select | No | The Serbian room ladder, 0.5 (garsonjera) to 5+ |
| `sellerType` | select | No | `owner`, `agency` or `developer` |
| `buildingType` | select | No | `old` (stara gradnja) or `new` (novogradnja) |
| `condition` | select | No | `original`, `renovated`, `lux` or `needs-work` |
| `heating` | select | No | Central, electric, storage heater, gas, underfloor, tiled stove, heat pump |
| `postedWithinHours` | select | No | `24`, `72` or `168` |
| `listingUrls` | array | No | For `detail`: advert addresses as `{"url": "…"}` objects |

**Example — owner-listed Belgrade flats in a price band:**

```json
{
  "operation": "search",
  "category": "prodaja-stanova",
  "city": "beograd",
  "minPrice": 80000,
  "maxPrice": 150000,
  "sellerType": "owner",
  "maxResults": 100
}
```

**Example — the full record for adverts you already have:**

```json
{
  "operation": "detail",
  "listingUrls": [
    { "url": "https://www.halooglasi.com/nekretnine/prodaja-stanova/blok-21-novi-beograd/5425647093652" }
  ]
}
```

***

### 📤 Output

Rows land in the Apify dataset with **48 fields**. The Output tab opens on a Property Search view and carries a second view for Property Detail.

| Field | Type | Description |
|---|---|---|
| `listingId` | string | The portal's 13-digit advert number, stable across runs |
| `url` | string | The advert page |
| `titleText` | string | The seller's headline |
| `dealType` | string | `sale` or `rent`, derived from the category |
| `price` | number | Asking price or monthly rent |
| `currency` | string | `EUR` — the portal quotes property in euros throughout |
| `pricePerSqm` | number | Price per square metre |
| `areaValue` / `areaUnit` / `areaM2` | number / string / number | The portal's own value and unit, plus a converted m² (land is in ari) |
| `rooms` | number | The Serbian room count: 0.5 for a garsonjera, 3 for a trosoban |
| `floor` / `totalFloors` | string / integer | The portal's floor token (`PR`, `VPR`, `7`) and floors in the building |
| `city` / `municipality` / `neighbourhood` / `street` | string | The full location chain |
| `latitude` / `longitude` | number | Detail rows only |
| `sellerType` | string | `owner`, `agency` or `developer` |
| `buildingType` / `condition` / `heating` | string | Detail rows only |
| `monthlyUtilities` | number | Monthly utility cost in euros, where the seller published it |
| `features` | array | Amenity list — lift, terrace, parking, registered title, and the rest |
| `viewCount` | integer | The advert's own view counter |
| `areaAveragePricePerSqm` | number | The portal's benchmark for that micro-location and room count |
| `advertiserName` / `advertiserProfileUrl` / `advertiserRegistryNumber` | string | The agency behind the advert |
| `publishedDate` / `expiresDate` | string | ISO dates |

**Example row (Property Search):**

```json
{
  "operation": "search",
  "listingId": "5425647591123",
  "url": "https://www.halooglasi.com/nekretnine/prodaja-stanova/centar-preko-lepenice-svetao-43-m-lodja-lift/5425647591123",
  "titleText": "Centar preko Lepenice – svetao 43 m² + lođa, lift",
  "dealType": "sale",
  "category": "prodaja-stanova",
  "price": 82900,
  "currency": "EUR",
  "pricePerSqm": 1928,
  "areaValue": 43,
  "areaUnit": "m2",
  "areaM2": 43,
  "rooms": 1,
  "floor": "III",
  "totalFloors": 5,
  "city": "Kragujevac",
  "municipality": "Gradska lokacija",
  "neighbourhood": "Centar preko Lepenice",
  "street": "Maglićka",
  "sellerType": "owner",
  "photoCount": 6,
  "publishedDate": "2026-08-28",
  "status": "success"
}
```

***

### 💼 Use Cases & Examples

#### 1. Serbian market pricing and €/m² benchmarks

**Valuation analysts building a price series the portal only publishes quarterly.**

**Input:** `prodaja-stanova` for Beograd, Novi Sad, Niš and Kragujevac
**Output:** asking price, price per m², area, floor, condition and build type per advert, plus the portal's neighbourhood benchmark on detail rows
**Use:** the spread every valuation conversation starts from, in euros, with no currency conversion

#### 2. Rental yield screening

**Investors comparing purchase price against achievable rent.**

**Input:** the same city run twice — `prodaja-stanova` and `izdavanje-stanova`
**Output:** two exports that join on area and neighbourhood
**Use:** yield modelling where both sides come from one portal, so the stock definitions match

#### 3. Owner-listed stock without the agency fee

**Buyers and buying agents hunting fee-free deals.**

**Input:** `sellerType: "owner"`
**Output:** private sellers only — 8 of 193 adverts on a live Kragujevac check
**Use:** every row repeats its own `sellerType`, so the filter is checkable against the data rather than trusted

#### 4. Developer and new-build pipeline tracking

**Prop-tech and investment teams watching what is being activated.**

**Input:** `buildingType: "new"` plus `sellerType: "developer"`
**Output:** new construction with its publish date
**Use:** the units a developer released this week, before they reach the aggregators

#### 5. Agency stock and market-share mapping

**Brokerage scouts and prop-tech sales teams.**

**Input:** a city sweep, then Property Detail on the results
**Output:** advertiser name, logo, profile page and register number on every row
**Use:** group a city by advertiser to see who holds the stock, where, and at which price band

#### 6. New-listing alerts and daily diffs

**Anyone who wants tomorrow's stock, not today's whole city.**

**Input:** `postedWithinHours: "24"` on a daily schedule
**Output:** only what appeared overnight — five adverts, not 193
**Use:** the freshness filter runs on the portal, so the small number is what you pay for

#### 7. Land, retail and commercial premises

**Developers and commercial agents.**

**Input:** `prodaja-zemljista`, `prodaja-lokala`, `izdavanje-lokala`, `prodaja-poslovnih-zgrada`
**Output:** the same row shape, with land measured in ari and converted to m²
**Use:** site-finding and commercial comparables on the same filter grammar as residential

***

### 🔗 Integration Examples

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/halooglasi-property-scraper').call({
  operation: 'search',
  category: 'prodaja-stanova',
  city: 'novi-sad',
  minRooms: '2.0',
  maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/halooglasi-property-scraper').call(run_input={
    'operation': 'search',
    'category': 'izdavanje-stanova',
    'city': 'beograd',
    'postedWithinHours': '24',
})

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['titleText'], item['price'], item['neighbourhood'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~halooglasi-property-scraper/runs?token=YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"operation":"search","category":"prodaja-kuca","city":"kragujevac","maxResults":50}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: a daily schedule
2. **HTTP Request**: run the actor with `postedWithinHours: "24"`
3. **Process**: diff `listingId` against yesterday's set
4. **Action**: post new adverts to Slack, or append them to a sheet

***

### 📊 Performance & Pricing

#### FREE Tier (try it now)

- **25 adverts** per run, full feature access, same data quality
- **5 adverts** per run on Property Detail
- No credit card required

#### PAID Tier (production)

- **Unlimited** adverts per run, to the last page of any search
- Pay per successful advert — errors, withdrawn adverts and empty searches cost nothing

💰 **$2.00 per 1,000 adverts** on Property Search, a third below the next halooglasi actor on the Store. Property Detail is a separate opt-in at $12.00 per 1,000, because each one is its own page request.

🔗 [View current pricing](https://apify.com/sian.agency/halooglasi-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: Does this cover halooglasi.com's cars, jobs and general classifieds?**
A: No, and deliberately so. It reads the property vertical only — eleven categories covering apartments, houses, land, retail premises, commercial buildings, hospitality premises, rooms and garages, for sale and to rent.

**Q: How is this different from a 4zida.rs scraper?**
A: Different corpus, different portal. Two Serbian markets enumerated completely on both sites measured 50.8% to 61.7% overlap, so roughly 40% of halooglasi's apartment stock is not on 4zida at all. The two also use unrelated advert-id spaces, so nothing joins across them without matching on address and price.

**Q: Are prices in euros or dinars?**
A: Euros. halooglasi quotes property in EUR throughout, sales and rentals alike, and every row carries the currency the portal printed.

**Q: What does Property Detail add?**
A: Coordinates, heating, build type, condition, monthly utility cost, the amenity list and the full seller description. It also carries every photo rather than one, the advert's own view counter, the portal's neighbourhood €/m² benchmark, and the agency with its logo, profile and register number.

**Q: Can I scrape a neighbourhood or a single street?**
A: Yes. The city list covers the portal's 179 municipalities; anything finer is reached by pasting the portal's own search address into Search URLs, filters included.

**Q: Is Cyrillic handled?**
A: Yes. Serbian adverts arrive in both Latin and Cyrillic and both come back as the seller wrote them. Cyrillic place names resolve to the right city.

**Q: Are seller phone numbers included?**
A: No. The portal masks them behind a click on its own page. Detail rows carry the advertising agency's name, profile page and register number, which is what identifies a professional seller.

**Q: How deep can a search go?**
A: To the last page. The nationwide sale-apartments set runs 812 pages, and the run walks it until your Max listings is reached, removing duplicates across pages first.

***

### 🐞 Troubleshooting

**A run returns fewer adverts than the city has**

- Max listings is a whole-run budget. Raise it, or narrow the search so the rows you want come first.
- FREE accounts stop at 25 adverts per run by design.

**"is not a city Halo Oglasi indexes"**

- Pick the city from the list rather than typing it. Neighbourhoods and streets are not municipalities — paste the portal's search address into Search URLs for those.

**A detail row comes back as unavailable**

- The seller took the advert down. Re-run the search that produced it to pick up what is live now. You are not charged for it.

**"challenging automated requests right now"**

- The portal throttled the run. Narrow the search with a price or area band, or space scheduled runs further apart.

**A filter seems to have no effect**

- Room, condition and heating filters apply to residential categories. Land, garages and commercial premises do not carry those attributes.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

Halo Oglasi is a trademark of Halo oglasi d.o.o. This actor is not affiliated with, endorsed by or sponsored by Halo Oglasi, and reads only pages that are already public.

***

### 🤝 Support

**Join our active support community**

- For issues or questions, open an issue on the actor page
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

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.

## `category` (type: `string`):

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.

## `city` (type: `string`):

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.

## `searchUrls` (type: `array`):

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.

## `maxResults` (type: `integer`):

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.

## `minPrice` (type: `integer`):

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` (type: `integer`):

Maximum asking price or monthly rent in EUR. The portal quotes every property price in euros, including rentals.

## `minArea` (type: `integer`):

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` (type: `integer`):

Maximum floor area in m².

## `minRooms` (type: `string`):

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.

## `maxRooms` (type: `string`):

Largest layout to include.

## `sellerType` (type: `string`):

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.

## `buildingType` (type: `string`):

Existing stock or new construction, as the portal classifies it.

## `condition` (type: `string`):

The portal's four condition bands. Needs-renovation stock is the value-add filter; lux is the premium band.

## `heating` (type: `string`):

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.

## `postedWithinHours` (type: `string`):

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.

## `listingUrls` (type: `array`):

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.

## Actor input object example

```json
{
  "operation": "search",
  "category": "prodaja-stanova",
  "city": "beograd",
  "searchUrls": [],
  "maxResults": 100,
  "minRooms": "any",
  "maxRooms": "any",
  "sellerType": "any",
  "buildingType": "any",
  "condition": "any",
  "heating": "any",
  "postedWithinHours": "any",
  "listingUrls": []
}
```

# Actor output Schema

## `halooglasiComListings` (type: `string`):

Every listing this run returned.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "operation": "search",
    "category": "prodaja-stanova",
    "city": "beograd",
    "searchUrls": [],
    "maxResults": 100,
    "minRooms": "any",
    "maxRooms": "any",
    "sellerType": "any",
    "buildingType": "any",
    "condition": "any",
    "heating": "any",
    "postedWithinHours": "any",
    "listingUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/halooglasi-property-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "operation": "search",
    "category": "prodaja-stanova",
    "city": "beograd",
    "searchUrls": [],
    "maxResults": 100,
    "minRooms": "any",
    "maxRooms": "any",
    "sellerType": "any",
    "buildingType": "any",
    "condition": "any",
    "heating": "any",
    "postedWithinHours": "any",
    "listingUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/halooglasi-property-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "operation": "search",
  "category": "prodaja-stanova",
  "city": "beograd",
  "searchUrls": [],
  "maxResults": 100,
  "minRooms": "any",
  "maxRooms": "any",
  "sellerType": "any",
  "buildingType": "any",
  "condition": "any",
  "heating": "any",
  "postedWithinHours": "any",
  "listingUrls": []
}' |
apify call sian.agency/halooglasi-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/halooglasi-property-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6LKEh4cSuqLvCPaci/builds/OevI4iOQRDJgxDSLp/openapi.json
