# Njuskalo.hr Scraper - Croatia Classifieds (`gmpsignal/njuskalo-scraper`) Actor

Scrape njuskalo.hr, the largest classifieds marketplace in Croatia. Search by keyword or paste category URLs. Prices are parsed to numeric EUR, sellers are flagged as private or dealer, locations are split into city and district, and promoted ads are marked.

- **URL**: https://apify.com/gmpsignal/njuskalo-scraper.md
- **Developed by:** [GMPSignal](https://apify.com/gmpsignal) (community)
- **Categories:** E-commerce, Real estate, AI
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Njuškalo.hr Scraper — Croatia Classifieds & Marketplace Listings

Extract classified listings from **Njuškalo.hr** (`njuskalo.hr`), Croatia's largest online marketplace covering electronics, real estate, motor vehicles, auto parts, home goods, and services.

Supports **keyword searches**, **custom category/search URLs**, **EUR price range filters**, **seller type filtering** (private vs. business/dealer), and **city/location filtering**.

***

### Features

- **Search by Keyword or Category URL:** Query any search term via `searchQuery` or pass direct Njuškalo category/filter URLs via `startUrls`.
- **Price Range Filtering (EUR):** Filter listings server-side and client-side with `priceMin` and `priceMax`.
- **Seller Type & Location Filters:** Filter by `sellerType` (`all`, `private`, `dealer`) and Croatian city/region (`location`, e.g. `Zagreb`, `Split`, `Rijeka`, `Osijek`).
- **Automatic Pagination & Deduplication:** Traverses multi-page results up to `maxPages` and `maxItems`, deduplicating across regular and highlighted (`Vau Vau` / `Standard`) ad blocks.
- **Structured Output:** Extracts listing ID, title, URL, numeric price in EUR (`priceEUR`), formatted price text, negotiable flag, category slug, city & district, publication timestamp, and thumbnail image URL.

***

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchQuery` | `string` | `"iphone"` | Keyword to search on Njuškalo.hr (used when `startUrls` is empty). |
| `startUrls` | `array` | `[]` | Optional list of direct Njuškalo category or search URLs (e.g. `https://www.njuskalo.hr/iphone`). |
| `priceMin` | `string` | `""` | Minimum price in EUR (e.g. `"200"`). |
| `priceMax` | `string` | `""` | Maximum price in EUR (e.g. `"1500"`). |
| `sellerType` | `string` | `"all"` | Filter by seller type: `"all"`, `"private"` (Privatna osoba), or `"dealer"` (Poslovni korisnik / Trgovina). |
| `location` | `string` | `""` | Case-insensitive substring filter matched against listing location (e.g. `"Zagreb"`, `"Split"`). |
| `maxItems` | `integer` | `100` | Maximum number of listings to extract (`1`–`10000`). |
| `maxPages` | `integer` | `20` | Maximum search result pages to crawl per start URL (`1`–`200`). |
| `proxy` | `object` | `{"useApifyProxy": true}` | Proxy configuration (Apify Proxy recommended for reliable access). |

#### Example Input

```json
{
  "searchQuery": "iphone 15",
  "priceMin": "400",
  "priceMax": "1200",
  "sellerType": "all",
  "location": "Zagreb",
  "maxItems": 100,
  "maxPages": 10
}
```

***

### Output Format

```json
{
  "id": "43198210",
  "title": "iPhone 15 Pro 256GB Natural Titanium - račun i garancija",
  "url": "https://www.njuskalo.hr/iphone-15-pro/iphone-15-pro-256gb-natural-titanium-oglas-43198210",
  "priceEUR": 850,
  "priceText": "850 €",
  "priceNegotiable": false,
  "category": "iphone-15-pro",
  "city": "Grad Zagreb",
  "district": "Trešnjevka - Sjever",
  "location": "Grad Zagreb, Trešnjevka - Sjever",
  "sellerType": null,
  "promoted": false,
  "publishedAt": "2026-04-16T18:30:00+02:00",
  "image": "https://www.njuskalo.hr/image-w920x690/iphone-15-pro/...",
  "scrapedAt": "2026-04-17T10:00:00.000Z"
}
```

***

### Use Cases

- **Price Comparison & Market Research in Croatia:** Track second-hand and retail prices for electronics, smartphones, computers, and appliances in EUR.
- **Automotive & Real Estate Lead Generation:** Monitor newly published car, motorcycle, apartment, and land listings across Croatian counties.
- **Reseller & Arbitrage Alerts:** Identify underpriced items in Zagreb, Split, Rijeka, or nationwide as soon as they are listed.

# Actor input Schema

## `searchQuery` (type: `string`):

Keyword to search on njuskalo.hr, e.g. "iphone", "golf 7", "stan zagreb". Ignored when Start URLs are provided.

## `startUrls` (type: `array`):

Optional list of njuskalo.hr search or category URLs to scrape instead of the keyword search. Pagination is followed automatically.

## `priceMin` (type: `string`):

Skip listings priced below this amount. Listings without a numeric price are also skipped when set.

## `priceMax` (type: `string`):

Skip listings priced above this amount. Listings without a numeric price are also skipped when set.

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

Keep only private sellers, only dealers (trgovac), or everything.

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

Optional filter on the listing location, e.g. "Zagreb", "Split", "Rijeka". Case-insensitive substring match.

## `maxItems` (type: `integer`):

Maximum number of listings to store in the dataset.

## `maxPages` (type: `integer`):

Maximum number of result pages to follow per start URL.

## `proxy` (type: `object`):

Proxy settings. Apify Proxy is used by default and is recommended for larger runs.

## Actor input object example

```json
{
  "searchQuery": "iphone",
  "sellerType": "all",
  "maxItems": 100,
  "maxPages": 20,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "searchQuery": "iphone",
    "maxItems": 100,
    "maxPages": 20,
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("gmpsignal/njuskalo-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 = {
    "searchQuery": "iphone",
    "maxItems": 100,
    "maxPages": 20,
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("gmpsignal/njuskalo-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 '{
  "searchQuery": "iphone",
  "maxItems": 100,
  "maxPages": 20,
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call gmpsignal/njuskalo-scraper --silent --output-dataset

```

## MCP server setup

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