# Njuškalo Scraper - Croatia Property, Cars & Classifieds (`sian.agency/njuskalo-property-scraper`) Actor

Scrape Njuškalo.hr listings: apartments, houses, land, cars and marketplace ads with EUR prices, GPS, seller type and photos. No login, no API key.

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

## Pricing

from $1.14 / 1,000 listing 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

## Njuškalo Scraper — Croatia Property, Cars & Classifieds 🇭🇷

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-97D700?logo=apify\&logoColor=black)](https://apify.com/sian.agency/njuskalo-property-scraper?fpr=sian)
[![Pricing](https://img.shields.io/badge/from-%241.30%20per%201k%20listings-blue)](https://apify.com/sian.agency/njuskalo-property-scraper?fpr=sian)
[![Free tier](https://img.shields.io/badge/free-25%20listings-brightgreen)](https://apify.com/sian.agency/njuskalo-property-scraper?fpr=sian)
[![Maintained by SIÁN](https://img.shields.io/badge/by-SI%C3%81N%20Agency-6f42c1)](https://apify.com/sian.agency?fpr=sian)

#### 🎉 Every listing on Croatia's biggest marketplace — 52,000 apartments, 50,000 cars, 2,000+ pages deep — with GPS and agency-or-private on every row

### 🔎 What is the Njuškalo Scraper — and when should you use it?

The **Njuškalo Scraper** turns public listings from Njuškalo.hr, Croatia's biggest classifieds marketplace 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:** Croatian listings as rows: title, asking price in euros, photos, location, post date and the direct listing URL. Property sections carry floor area, room count, floor, build year and energy rating; the car, boat and marketplace sections carry their own attribute sets. Switch on full listing pages and each row also gains GPS coordinates, the complete Croatian description, the seller's name and whether they are an agency or a private owner.

**Use something else when:** the listing is not on Njuškalo. Use [Craigslist Listings Scraper](https://apify.com/sian.agency/craigslist-scraper?fpr=sian) for the same kind of general classifieds in the US, Canada and the UK. Use [Immobiliare Property Scraper](https://apify.com/sian.agency/immobiliare-property-scraper?fpr=sian) for Italian property, where Njuškalo covers Croatia. Use [Avito Property Scraper](https://apify.com/sian.agency/avito-property-scraper?fpr=sian) for Russian classifieds with the same private-seller mix. This actor covers the public listing sections of njuskalo.hr in Croatia only. Seller phone numbers sit behind a session-gated click and are not returned, and Njuškalo carries asking prices on live listings rather than what anything sold for.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/njuskalo-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 listings and prices from Njuškalo in Croatia using the Apify Actor `sian.agency/njuskalo-property-scraper`.

Use it when I need: Croatian listings as rows: title, asking price in euros, photos, location, post date and the direct listing URL. Property sections carry floor area, room count, floor, build year and energy rating; the car, boat and marketplace sections carry their own attribute sets. Switch on full listing pages and each row also gains GPS coordinates, the complete Croatian description, the seller's name and whether they are an agency or a private owner.

Don't use it when: the listing is not on Njuškalo — use craigslist-scraper or immobiliare-property-scraper or avito-property-scraper instead.

How to call it: pick a `category` (`prodaja-stanova` for apartments for sale, `prodaja-kuca` for houses, `auti` for used cars — 27 sections in all) and optionally a `location` such as `zagreb`, `split` or `istra`. Narrow with `minPrice`, `maxPrice`, `onlyWithImages` and `sort`. `includeDetails` adds GPS, the full description, the attribute table and the agency-or-private seller type for an extra charge per listing. Use `keyword` to search the whole site instead of one section. To expand listings you already have, set `operation` to `detail` and pass `listingUrls`; to reuse a search you built on njuskalo.hr, paste it into `searchUrls`.

Start with this input:
{
  "category": "prodaja-stanova",
  "location": "zagreb",
  "maxResults": 100,
  "includeDetails": true
}

Ask me which section and which Croatian county or city to search, and whether they want the full listing pages with GPS and seller type, then run the Actor and summarise the results as a table.
```

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

- *Pull every apartment for sale in Zagreb under 250,000 euros and show me price per square metre by neighbourhood.*
- *Find houses for sale in Istria listed by private owners rather than agencies, newest first.*
- *Compare asking prices for used BMWs across Croatia and show mileage against price.*

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

### 📋 Overview

Njuškalo.hr is where Croatia buys and sells. It carries more property than any Croatian portal, more used cars than any Croatian dealer network, and a marketplace that runs from phones to farm machinery. None of it has a public API.

This Actor turns any of it into rows. Pick a section and a county, or paste a search you built in your browser, and you get back clean records: title, asking price in euros, photos, location, post date and the direct listing URL. Turn on full listing pages and every row also carries GPS coordinates, the complete Croatian description, the attribute table, and whether the seller is an agency or a private owner.

There is no ceiling to work around. Apartments for sale exposes all 2,094 pages of its 52,329 listings, so a whole Croatian vertical is one run rather than a weekend of orchestration.

### ✨ Features

- 🏠 **27 sections** — apartments, houses, land, commercial space, holiday homes, new builds, garages and rooms, plus cars, motorcycles, commercial vehicles, boats and eleven marketplace verticals
- 📍 **County and city filtering** matched against the list Njuškalo publishes itself, so a location it adds tomorrow works tomorrow
- 🪙 **Prices in euros**, parsed to real numbers — Croatian formatting reads `171.500 €` as one hundred and seventy-one thousand, not as 171.5
- 🌐 **GPS on every enriched listing**, so you can map a market instead of reading it
- 🏪 **Agency or private owner** on every enriched listing, taken from the page rather than guessed from the wording
- 📄 **Full Croatian descriptions** and the complete attribute table — floor area, rooms, floor, build year, energy rating, heating, permits
- 🖼️ **Every photo** on the listing — the whole gallery, rather than the cover shot alone
- 🔗 **Paste your own URLs** to keep filters this form does not expose — floor area, heating, year built, search radius
- 🎚️ **Price band, photos-only and sort** applied by Njuškalo before rows are returned, so you never pay for listings outside your filter
- 🆓 **25 listings free**, then $1.30 per 1,000

### 🎬 Quick Start

```json
{
  "category": "prodaja-stanova",
  "location": "zagreb",
  "maxResults": 100,
  "includeDetails": true
}
```

Every apartment for sale in Zagreb, with GPS, seller type and the full description on each row.

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose what to scrape

Leave **What do you want to scrape** on **Listing Search** and pick a **Section** — `prodaja-stanova` for apartments for sale is the default. Add a **County or city** if you want one region rather than the whole country.

#### Step 2: Decide how deep to go

Set **Max listings**. Switch on **Fetch full listing pages** if you need GPS, the full description and the agency-or-private seller type — that is what most people are here for, and it bills one extra event per listing.

#### Step 3: Run it

Press **Start**. Results arrive in the dataset tab and export as JSON, CSV, Excel or XML. The **Processing Report** in the Output tab shows what ran, what was returned and exactly what you were charged for.

### 📥 Input Configuration

| Field | Type | Default | What it does |
|---|---|---|---|
| `operation` | select | `search` | `search` walks a section; `detail` expands listing URLs you already have |
| `category` | select | `prodaja-stanova` | Which of the 27 sections to walk |
| `location` | string | — | Croatian county or city: `zagreb`, `split`, `rijeka`, `istra`. Property sections only |
| `keyword` | string | — | Search the whole site for a word instead of walking one section |
| `maxResults` | integer | `100` | Stop after this many listings |
| `includeDetails` | boolean | `false` | Open every listing for GPS, description, attributes, photos and seller type |
| `searchUrls` | array | — | Paste njuskalo.hr browse or search URLs; every filter in them is kept |
| `listingUrls` | array | — | Listing URLs to expand, for the `detail` operation |
| `minPrice` / `maxPrice` | integer | `0` | Price band in euros; `0` means no bound |
| `onlyWithImages` | boolean | `false` | Skip listings with no photo |
| `sort` | select | `new` | `new`, `old`, `cheap` or `expensive` |

**Sections available:** `prodaja-stanova` · `iznajmljivanje-stanova` · `prodaja-kuca` · `iznajmljivanje-kuca` · `prodaja-zemljista` · `prodaja-poslovnih-prostora` · `iznajmljivanje-poslovnih-prostora` · `vikendice` · `novogradnja` · `prodaja-garaza` · `iznajmljivanje-soba` · `turisticki-smjestaj` · `auti` · `novi-auti` · `motori` · `gospodarska-vozila` · `nautika` · `mobiteli` · `informatika` · `audio-video-foto` · `sve-za-dom` · `sportska-oprema` · `strojevi-alati` · `djecji-svijet` · `posao` · `usluge` · `kucni-ljubimci`

### 📤 Output

One row per listing. Search rows always carry the first block; the second block arrives when **Fetch full listing pages** is on, or on any `detail` run.

| Field | Type | Description |
|---|---|---|
| `listingId` | number | Njuškalo's own listing id |
| `listingTitle` | string | Listing headline as posted |
| `price` | number | Asking price as a number |
| `priceText` | string | Price as Njuškalo formats it, e.g. `171.500 €` |
| `currency` | string | Always `EUR` |
| `isPriceOnRequest` | boolean | True when the seller hid the price |
| `url` | string | Direct link to the listing |
| `imageUrl` | string | Thumbnail |
| `location` | string | Town and neighbourhood |
| `postedAt` | string | ISO timestamp of posting |
| `summary` | array | The short facts Njuškalo shows under the title |
| `categorySlug` | string | Section the listing sits in |
| `isPromoted` | boolean | Whether the seller paid for placement |
| `hasVirtualTour` / `hasVideo` / `hasGroundPlan` | boolean | Media the listing carries |
| `listingDescription` | string | **Full Croatian description** |
| `latitude` / `longitude` | number | **GPS coordinates** |
| `locationApproximate` | boolean | Whether Njuškalo blurred the pin |
| `categoryPath` | array | Full breadcrumb, including county and town |
| `categoryId` | number | Njuškalo's category id |
| `sellerType` | string | **`agency` or `private`** |
| `sellerName` | string | Seller or agency name |
| `sellerId` | number | Njuškalo seller id |
| `sellerUrl` | string | Link to the seller's other listings |
| `sellerRating` / `sellerRatingCount` | number | Seller's rating and how many ratings it is from |
| `attributes` | object | Floor area, rooms, floor, build year, energy rating and the rest |
| `features` | object | Grouped features: heating, permits, parking, orientation |
| `imageUrls` | array | Every photo |
| `imageCount` | number | How many photos |
| `viewCount` | number | Times the listing has been viewed |
| `publishedAt` | string | Publication date as Njuškalo displays it |
| `listingStatus` | string | `active` while the listing is live |
| `sourceCategory` / `sourceKeyword` / `sourceUrl` | string | What produced the row |
| `status` | string | `success` or `error` |
| `_operation` / `_fetchedAt` | string | Which mode produced the row, and when |

### 💼 Use Cases & Examples

#### 1. Croatian Property Market Tracking

Walk apartments, houses or land for one county and get asking price, floor area, room count, build year and GPS on every row. Run it weekly and you have a price series for Zagreb, Split or Istria that nobody publishes.

```json
{ "category": "prodaja-stanova", "location": "split", "maxResults": 2000, "includeDetails": true }
```

#### 2. Agency vs Private Seller Analysis

Every enriched listing says whether an agency or a private owner posted it, and names the agency. Split a section by `sellerType` to see what share of a market the agencies hold and which of them are winning listings.

```json
{ "category": "prodaja-kuca", "location": "istra", "maxResults": 5000, "includeDetails": true }
```

#### 3. FSBO & New-Listing Lead Generation

Sort newest first, keep the row limit small, and run it on a schedule: each run pays only for what appeared since the last one. Filter the output to `sellerType: "private"` and you have owners selling without an agent, with the full description they wrote.

```json
{ "category": "prodaja-stanova", "sort": "new", "maxResults": 200, "includeDetails": true }
```

#### 4. Used Car & Marketplace Pricing

The cars, boats, phones and computing sections read exactly like the property ones. Pull a model across the whole country to see the real spread of asking prices before you buy or list.

```json
{ "keyword": "bmw serija 5", "maxResults": 1000, "includeDetails": true }
```

#### 5. Coastal Rental & Holiday-Home Research

Holiday homes and tourist accommodation with coordinates on every row, so you can map yield against location instead of guessing from a listing page.

```json
{ "category": "vikendice", "minPrice": 100000, "maxResults": 1000, "includeDetails": true }
```

#### 6. Commercial Property Sweeps

Commercial space for sale and for rent, across the whole country or one county, with floor area and the full description.

```json
{ "category": "prodaja-poslovnih-prostora", "maxResults": 1000, "includeDetails": true }
```

#### 7. Reusing a Search You Already Built

Njuškalo has filters this form does not expose — heating type, year of renovation, parking, search radius. Build the search in your browser, then paste the address.

```json
{ "searchUrls": ["https://www.njuskalo.hr/prodaja-stanova/zagreb?price[max]=200000&livingArea[min]=60&buildingInfo[lift]=1"], "maxResults": 500 }
```

### 🔗 Integration Examples

#### JavaScript/Node.js

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('sian.agency/njuskalo-property-scraper').call({
    category: 'prodaja-stanova',
    location: 'zagreb',
    maxResults: 100,
    includeDetails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
const privateSellers = items.filter((i) => i.sellerType === 'private');
console.log(`${privateSellers.length} of ${items.length} listed by owners`);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("sian.agency/njuskalo-property-scraper").call(run_input={
    "category": "prodaja-stanova",
    "location": "zagreb",
    "maxResults": 100,
    "includeDetails": True,
})

rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
priced = [r for r in rows if r.get("price")]
print(f"median asking price: {sorted(r['price'] for r in priced)[len(priced) // 2]:,} EUR")
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~njuskalo-property-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"category":"prodaja-stanova","location":"zagreb","maxResults":100,"includeDetails":true}'
```

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

Point an **HTTP Request** node at the `run-sync-get-dataset-items` endpoint above and you have a Croatian property feed inside your workflow. A common shape: run it nightly with `sort: "new"` and a small `maxResults`, filter to `sellerType: "private"`, and push each new row into your CRM or a Slack channel. Apify's own N8N, Zapier and Make integrations work too, if you would rather not build the HTTP call yourself.

### 📊 Performance & Pricing

One page request returns 25 listings, and a search page answers in under a second, so a 1,000-listing sweep is 40 requests and about a minute. Turning on full listing pages adds one request per listing — that is the slow and the expensive part, so leave it off when you only need prices.

#### FREE Tier (Try It Now)

- **25 listings per run**, so you can see the real output before paying anything
- Every field is available — including GPS, seller type and full descriptions
- No credit card, no API key, no proxy to configure

#### PAID Tier (Production Ready)

| Event | Price (Bronze) | What it covers |
|---|---|---|
| Listing Search | **$0.0013** per listing | One listing from a search — $1.30 per 1,000 |
| Listing Detail | **$0.0022** per listing | One listing opened for GPS, description, attributes, photos and seller type |
| Actor Start | $0.005 per run | Apify's per-run start event |

Higher Apify plan tiers pay less per row. **You are only charged for rows that were actually returned** — a search that matched nothing, a listing that had been sold, and any input that could not be read all cost you nothing.

### ❓ Frequently Asked Questions

**Do I need an API key, a login or a proxy?**
No. Pick a section and press Start. There is nothing to configure and nothing to buy on top.

**Which currency are the prices in?**
Euros. Croatia finished the kuna changeover in 2023 and Njuškalo re-denominated its whole back catalogue — 180 prices sampled across six sections in August 2026 were euro-denominated without exception. Croatian formatting uses a dot for thousands, so `171.500 €` is 171,500 euros; the `price` field gives you that as a number.

**How many listings can one run return?**
As many as the section holds. Njuškalo does not cap paging — apartments for sale exposes all 2,094 pages of its 52,329 listings. Your **Max listings** setting is the only ceiling.

**Can I scrape cars and marketplace ads as well as property?**
Yes. Cars, motorcycles, commercial vehicles, boats, phones, computing, home, sports, tools, kids, jobs, services and pets are all in the picker, and any other Njuškalo URL can be pasted in. They return the same row shape.

**Does it return seller phone numbers?**
No. Njuškalo puts phone numbers behind a click that needs a logged-in session, so a phone column would be empty most of the time. You get the seller's name, whether they are an agency or a private person, their profile URL and their rating — plus whatever they typed into the description.

**What does the full-listing-page option cost?**
It opens each listing, so it bills one Listing Detail event per enriched row on top of the search row. Leave it off and you pay for search rows only.

**Can I paste a search URL from my browser?**
Yes, and it is the best way to reach the fine-grained filters. Build the search on Njuškalo with whatever filters you like — floor area, heating, year built, radius — and paste the URL into **Search URLs**. Every parameter is preserved.

**Can I monitor a market for new listings?**
Yes. Schedule the Actor with `sort: "new"` and a modest **Max listings**. Each run returns the newest listings first, so you pay for a small window rather than re-reading the whole section.

### 🐛 Troubleshooting

**The run returned fewer rows than Max listings.**
The section ran out of listings that match your filters. The log prints how many matched and how many pages exist — if that number is small, widen the price band or drop the county.

**The run stopped saying my county is not one Njuškalo lists.**
Deliberate: a county the Actor cannot honour stops the run instead of quietly searching the whole country and billing you for it. The error names every county that section does have. Njuškalo's slugs are not always the county name — Istarska lives at `istra` — so type the name and let the Actor match it, or copy a slug from the error. Leave the field empty to search the whole country on purpose.

**A county filter did nothing on a car or marketplace run.**
Only the property sections carry a county filter. For cars, paste a search URL from njuskalo.hr with the location filter already applied.

**Some listings have no price.**
The seller chose to hide it. Those rows carry `isPriceOnRequest: true` and a null `price` — they are real listings, not parse failures.

**A listing URL came back as an error row.**
It had been sold or withdrawn. Error rows are never charged.

**Njuškalo is challenging automated requests.**
The site occasionally challenges a session mid-crawl. The Actor drops that session, starts a fresh one and carries on by itself, so you normally only see this in the log. If a run still fails on it, wait a few minutes and run again.

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

Yes — collecting publicly available information is legal in the EU and the US, and has been repeatedly upheld in court. This Actor reads only pages any visitor can open without logging in, and it collects no personal data beyond the seller name and profile link that Njuškalo itself publishes on every listing.

You are responsible for what you do with the data. Direct marketing to individuals in Croatia is governed by the GDPR, so treat private-seller names as personal data and have a lawful basis before you contact anyone. Apify's [ethical web scraping](https://blog.apify.com/is-web-scraping-legal/) guide is a good starting point.

### 🤝 Support

- 🐛 **Something broken?** [Open an issue](https://apify.com/sian.agency/njuskalo-property-scraper/issues) — we read every one
- ⭐ **Working well?** [Leave a 5-star review](https://apify.com/sian.agency/njuskalo-property-scraper/reviews) — it is what gets the next feature built
- 🔍 **Need another market?** [Browse the SIÁN Agency store](https://apify.com/sian.agency?fpr=sian) — property and classifieds scrapers for Italy, Germany, Spain, Brazil, Argentina, Russia and more

***

*Njuškalo is a trademark of Njuškalo d.o.o. This Actor is not affiliated with, endorsed by, or sponsored by Njuškalo. It collects only publicly available listing data.*

# Actor input Schema

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

🎯 **PICK ONE PER RUN.**

🔍 **Listing Search** — every listing in a section that matches your filters. This is the one you want 95% of the time.

📄 **Listing Detail** — you already have listing URLs and want the full description, the attribute table, GPS and every photo for each one.

💡 Want all of that on a SEARCH run instead? Leave this on Listing Search and switch on **Fetch full listing pages** below.

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

🗂️ **WHICH SECTION** of Njuškalo to walk.

🏠 The twelve **property** sections come first — apartments and houses to buy or rent, land, commercial space, holiday homes, new builds.

🚗 **Cars, boats and the marketplace** sections return the same row shape, so a used-car run needs no extra setup.

🎯 Every section has its own attribute set — floor area on apartments, mileage on cars — in the **Attributes** column when full listing pages are on.

💡 Ignored when you paste URLs or type a keyword.

## `location` (type: `string`):

📍 **NARROW IT TO ONE PLACE.** Type a Croatian county or city: `zagreb`, `split`, `rijeka`, `osijek`, `istra`, `dubrovnik`.

🌍 **Or leave it empty** to take the whole country.

🔎 Matched against the county list Njuškalo publishes on the section page, so `Osječko-baranjska`, `osjecko-baranjska` or just the start of it all work.

⚠️ No match STOPS the run and names the counties that section has — a typo can never bill you for the whole country.

💡 Only property sections filter by county.

## `keyword` (type: `string`):

🔑 **SEARCH THE WHOLE SITE** for a word instead of walking one section: `penthouse`, `novogradnja`, `bmw serija 5`, `iphone 17`.

🌐 Njuškalo's keyword search spans **every category at once**, so when this is filled the section and county above are ignored.

💡 Leave it empty to browse a section instead — that is usually what you want for market data, because it returns everything rather than what matched a word.

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

🔢 **STOP AFTER THIS MANY LISTINGS.** Each page request returns 25, so the run stops at the first page that crosses your limit.

📊 There is no ceiling on the source side — apartments for sale exposes all 2,094 pages of its 52,000+ listings — so this number is what controls both run length and your bill.

🆓 Free Apify accounts are capped at 25 rows per run regardless of this setting.

## `includeDetails` (type: `boolean`):

📄 **OPEN EVERY LISTING** to add what the results page does not carry: the full Croatian description, GPS coordinates, the seller's name and whether they are an **agency or a private owner**, the complete attribute table, view count and every photo.

🎯 This is what turns a listing dump into a lead list — seller type is the field you filter on.

💰 Costs one extra request per listing and bills the **Listing Detail** event on top of the search row. Leave it off and you pay for search rows only.

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

🌐 **PASTE BROWSE OR SEARCH URLS** from njuskalo.hr instead of filling the fields above.

🎚️ **Every filter already in the URL is kept** — price band, floor area, rooms, heating, year built, radius, sort order. This is how you reach filters this form does not carry.

💡 Build the search on Njuškalo in your browser, then copy the address bar.

📋 Bulk edit, .txt upload and + Add all work here.

✅ Example: `https://www.njuskalo.hr/prodaja-stanova/zagreb?price[max]=200000`

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

🔗 **USED BY THE LISTING DETAIL OPERATION.** Njuškalo listing addresses to expand, in the form you get from your browser's address bar — they end in `-oglas-<id>`.

✅ Example: `https://www.njuskalo.hr/nekretnine/stan-zagreb-oglas-51235965`

📋 Bulk edit, .txt upload and + Add all work here.

⚠️ A listing that has been sold or withdrawn comes back as an error row and is **not charged**.

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

💵 **LOWEST PRICE TO INCLUDE**, in euros. `0` means no lower bound.

🪙 Croatia has been on the euro since 2023 and Njuškalo re-denominated its whole back catalogue, so every price on the site — and every number here — is in euros.

## `maxPrice` (type: `integer`):

💰 **HIGHEST PRICE TO INCLUDE**, in euros. `0` means no upper bound.

🎯 Filtering here is cheaper than filtering afterwards: Njuškalo applies the band before the rows are returned, so you are never billed for listings outside it.

## `onlyWithImages` (type: `boolean`):

🖼️ **SKIP LISTINGS WITH NO PHOTO.**

🧹 Most useful on the marketplace sections, where placeholder and text-only ads are common. Property listings almost always have photos, so it changes little there.

## `sort` (type: `string`):

↕️ **WHICH LISTINGS COME FIRST.**

🕒 **Newest first** is what you want on a schedule — combine it with a row limit and each run pays for the listings added since the last one.

⬆️⬇️ **Price order** is better for a one-off sweep of a band, because the run stops at your row limit from the end of the market you care about.

## Actor input object example

```json
{
  "operation": "search",
  "category": "prodaja-stanova",
  "location": "zagreb",
  "keyword": "",
  "maxResults": 100,
  "includeDetails": false,
  "searchUrls": [],
  "listingUrls": [],
  "minPrice": 0,
  "maxPrice": 0,
  "onlyWithImages": false,
  "sort": "new"
}
```

# Actor output Schema

## `njuskaloListings` (type: `string`):

Listings with asking price in euros, photos, location and post date — plus GPS, seller type, the full Croatian description and the attribute table when full listing pages are on

## `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",
    "location": "zagreb",
    "keyword": "",
    "maxResults": 100,
    "includeDetails": false,
    "searchUrls": [],
    "listingUrls": [],
    "minPrice": 0,
    "maxPrice": 0,
    "onlyWithImages": false,
    "sort": "new"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/njuskalo-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",
    "location": "zagreb",
    "keyword": "",
    "maxResults": 100,
    "includeDetails": False,
    "searchUrls": [],
    "listingUrls": [],
    "minPrice": 0,
    "maxPrice": 0,
    "onlyWithImages": False,
    "sort": "new",
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/njuskalo-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",
  "location": "zagreb",
  "keyword": "",
  "maxResults": 100,
  "includeDetails": false,
  "searchUrls": [],
  "listingUrls": [],
  "minPrice": 0,
  "maxPrice": 0,
  "onlyWithImages": false,
  "sort": "new"
}' |
apify call sian.agency/njuskalo-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/njuskalo-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/Bvxgi7BfxuOZ34PVX/builds/GAWMRGyJIvuY45raw/openapi.json
