# Realitica.com Adriatic Real Estate Listings (`zinin/realitica-adriatic`) Actor

Pull live apartment and house listings straight from Realitica.com — a real-estate classifieds portal covering Montenegro, Croatia and Serbia — by deal type, property type and region. No login, no browser, no proxies.

- **URL**: https://apify.com/zinin/realitica-adriatic.md
- **Developed by:** [Tim Zinin](https://apify.com/zinin) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 listing founds

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/platform/actors/running/actors-in-store#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

## Realitica.com Adriatic Real Estate Listings

Pull live apartment and house listings straight from Realitica.com — a
real-estate classifieds portal covering Montenegro, Croatia and Serbia —
filtered by deal type (sale/long-term rent), property type and region. No
login, no API key, no browser needed on your side.

### What you get

- Title, price (with currency), rooms, floor area, location, a short
  description, a preview photo and the direct listing URL for every ad found.
- Filter by sale or long-term rent, apartment or house, and any Realitica
  region — a whole country (`Crna-Gora`, `Hrvatska`, `Srbija`) or a
  city-level drilldown (`budva/Crna-Gora`).
- Runs on Apify: schedule it, monitor it, call it from the API, export to
  JSON/CSV/Excel or push straight into your own pipeline.

### How to run it

1. Click **Try for free** — no card needed on the free plan.
2. Pick **Deal type**, **Property type** and type in a **Region**.
3. Hit **Start** and pull the results from the dataset (UI, API or webhook).

### Pricing

Pay-per-event: **$0.005 per run start + $0.002 per result**. No monthly seat, no minimum. 100 listings found cost about $0.21 (the one-time start fee plus 100 result rows). Rows where the source returned nothing (an
unrecognized region, or a combination with zero matching listings) are
returned for transparency but are **never** charged for.

### Input

| Field | Required | What it does |
|---|---|---|
| `deal_type` | yes | `prodaja` (sale) or `najam` (long-term rent). |
| `property_type` | yes | `stanova` (apartments) or `kuca` (houses). |
| `region` | yes | A Realitica region path — `Crna-Gora`, `Hrvatska`, `Srbija`, or a city drilldown like `budva/Crna-Gora`. Defaults to `Crna-Gora`. |
| `max_items` | no | Row cap for this run (default 25). |
| `max_pages` | no | How many result pages to walk, 25 listings per page (default 3). |

```json
{
    "deal_type": "prodaja",
    "property_type": "stanova",
    "region": "Crna-Gora",
    "max_items": 5,
    "max_pages": 1
}
```

### Output

Real row from a live run on the platform (2026-07-31):

```json
{
    "found": true,
    "url": "https://www.realitica.com/hr/listing/3665844",
    "title": "Branko · prodaje stan · 2 sobe · 78 m²",
    "price": 200000,
    "currency": "EUR",
    "deal_type": "sale",
    "property_type": "stanova",
    "rooms": 2,
    "area_sqm": 78,
    "location": "Radanovići, Kotor, Crna Gora",
    "lat": null,
    "lng": null,
    "posted_date": null,
    "description": "Stanovi u izgradnji.Prodaja direktno od Investitora. Betonski radovi su završeni na oba objekta. Stambeni kompleks “DOMA”, koji se sastoji iz dvije zgrade, predstavlja moderan i f...",
    "images": ["https://www.realitica.com/images/listing_photos/thumb_3665844_08-09.jpg"],
    "source_portal": "realitica-adriatic",
    "scraped_at": "2026-07-31T14:20:39.189Z",
    "partial": true,
    "partial_reason": "stopped after 1 page(s), 5 item(s) collected — reached this run's own max_pages/max_items limit before the source confirmed (via confirmedEnd) that there is nothing more; there may be additional matching listings beyond what was collected"
}
```

| Field | Meaning |
|---|---|
| `found` | `true` for a real listing row, `false` for a not-found/error row. |
| `price` | Listing price as a number (thousands separators stripped); `null` when the seller didn't list a price — that row is dropped, not billed. |
| `currency` | `EUR` for a priced row. |
| `deal_type` | `sale` or `rent` — `rent` here always means Realitica's long-term rental category, not its separate short-term/tourist listings. |
| `rooms` / `area_sqm` | `null` when not stated — a house listing, in particular, often shows a room count with no floor area at all. |
| `location` | Free-text location line as shown on the listing card. |
| `posted_date` | Always `null` — Realitica does not print a publish/renewal date anywhere on the pages this Actor reads. |
| `images` | The one preview photo shown on the search-results card (not the full listing gallery). |
| `lat` / `lng` | Not available on list pages — always `null`. |
| `partial` | `true` when this run stopped without Realitica itself confirming there is nothing more — either `max_pages`/`max_items` was reached, or an unconfirmed empty page came back. `false` only when the source's own response confirmed no further results exist. Carried on every row, found or not — in practice `true` on most runs, since Realitica rarely sends an explicit "no more results" marker before `max_pages` is reached. |
| `partial_reason` | Plain-English reason when `partial` is `true`; `null` when it's `false`. |

A not-found row looks like:

```json
{
    "found": false,
    "note": "realitica.com returned zero listings for prodaja:stanova:Not-A-Real-Region-9999.",
    "scraped_at": "2026-07-31T14:20:43.621Z"
}
```

### API

Start a run with a bearer token and explicit JSON input:

```bash
curl -sS -X POST 'https://api.apify.com/v2/acts/zinin~realitica-adriatic/runs?waitForFinish=60' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"deal_type":"prodaja","property_type":"stanova","region":"Crna-Gora","max_items":5,"max_pages":1}'
```

Read Dataset rows using the returned `defaultDatasetId`:

```bash
curl -sS "https://api.apify.com/v2/datasets/$DEFAULT_DATASET_ID/items?clean=true&format=json" \
  -H "Authorization: Bearer $APIFY_TOKEN"
```

### MCP

For an Apify MCP client exposing the standard `call-actor` tool, send this exact payload:

```json
{
  "name": "call-actor",
  "arguments": {
    "actor": "zinin/realitica-adriatic",
    "input": {
      "deal_type": "prodaja",
      "property_type": "stanova",
      "region": "Crna-Gora",
      "max_items": 5,
      "max_pages": 1
    }
  }
}
```

### Related Actors

Other real-estate portals on the same account, for a buyer weighing the Adriatic against other markets.

| Actor | Use it when |
|---|---|
| [Imovirtual Portugal Real Estate Listings](https://apify.com/zinin/imovirtual-lisbon) | Comparing Adriatic coastal property against a Western-Europe lifestyle-buyer market with the same seasonal-rental appeal. |
| [Otodom Poland Real Estate Listings](https://apify.com/zinin/otodom-warsaw) | You want a non-coastal EU capital in the same portfolio, not just vacation-home inventory. |
| [PropertyFinder.ae UAE Real Estate Listings](https://apify.com/zinin/propertyfinder-gulf) | Weighing a tax-free, high-yield Gulf property against Adriatic lifestyle property in the same comparison. |
| [Rightmove UK Property Listings (London and beyond)](https://apify.com/zinin/rightmove-london) | Benchmarking a buyer's home UK market against Adriatic second-home pricing. |
| [Krisha.kz Kazakhstan Real Estate Listings](https://apify.com/zinin/krisha-kz) | Diversifying outside the EU/Adriatic into a CIS/Central Asia market with the same query shape. |

### FAQ / Limitations

**Does this need a Realitica account or API key?** No — it reads the same
public search pages a visitor sees, no login.

**What this is NOT.** This does not fetch the full photo gallery, exact
coordinates, or the seller's contact details from the listing detail page —
only what's shown on the search-results list. It does not distinguish
short-term/tourist rentals (Realitica's separate "Najam"/daily-rate category)
from long-term housing rentals — this Actor's `najam` input always maps to
long-term rent. It does not guarantee every listing on Realitica is returned;
pagination stops at `max_pages` / `max_items`.

Found a bug or need a custom variant (a different country's classifieds
site, extra fields)? Open an issue on the Actor page.

### Machine use

The Actor is callable through the Apify API, SDK, and Apify MCP server. The input and Dataset row are the machine-facing contract; `posted_date`/`lat`/`lng` are always `null` (Realitica doesn't publish them on the pages this Actor reads, so this Actor never guesses), and `partial`/`partial_reason` mark whenever a row's completeness wasn't independently confirmed by the source itself — an agent treating a run's results as the full market should check `partial` first.

# Actor input Schema

## `deal_type` (type: `string`):

`prodaja` (sale) or `najam` (long-term rent). `najam` maps to Realitica's own "Duži Najam" long-term-rental category, not its separate short-term/tourist rental listings.

## `property_type` (type: `string`):

`stanova` (apartments) or `kuca` (houses).

## `region` (type: `string`):

A Realitica region path, e.g. `Crna-Gora` (Montenegro), `Hrvatska` (Croatia), `Srbija` (Serbia), or a city drilldown like `budva/Crna-Gora`.

## `max_items` (type: `integer`):

Maximum number of listing rows to return for this deal\_type/property\_type/region combination.

## `max_pages` (type: `integer`):

How many result pages to walk (25 listings per page) before stopping.

## Actor input object example

```json
{
  "deal_type": "prodaja",
  "property_type": "stanova",
  "region": "Crna-Gora",
  "max_items": 5,
  "max_pages": 1
}
```

# Actor output Schema

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

API URL for the default dataset items produced by this run.

# 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 = {
    "deal_type": "prodaja",
    "property_type": "stanova",
    "region": "Crna-Gora",
    "max_items": 5,
    "max_pages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/realitica-adriatic").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 = {
    "deal_type": "prodaja",
    "property_type": "stanova",
    "region": "Crna-Gora",
    "max_items": 5,
    "max_pages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("zinin/realitica-adriatic").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "deal_type": "prodaja",
  "property_type": "stanova",
  "region": "Crna-Gora",
  "max_items": 5,
  "max_pages": 1
}' |
apify call zinin/realitica-adriatic --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=zinin/realitica-adriatic",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/Daea6P3eYVBkDO1yw/builds/Ig4V8Kv1cJnDvB1L9/openapi.json
