# Imoti.net Scraper - Bulgarian Real Estate Listings (`studio-amba/imoti-net-scraper`) Actor

Scrape real estate listings from Imoti.net, Bulgaria's #2/#3 property portal. Extract prices in EUR and BGN, areas, rooms, floors, energy class, locations, images, and seller details for apartments, houses, land, and commercial properties for sale or rent.

- **URL**: https://apify.com/studio-amba/imoti-net-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 result scrapeds

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?

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

## Imoti.net Scraper

Extract property listings from [Imoti.net](https://www.imoti.net) -- one of Bulgaria's largest real estate portals -- into structured JSON with prices in both EUR and BGN, areas, rooms, floors, energy class, locations, photos, and seller details.

### What is Imoti.net Scraper?

**Imoti.net Scraper** lets you extract structured real estate data from one of Bulgaria's biggest property platforms, helping you monitor the market, compare prices, and automate property research -- all without manual browsing or login.

- **Track market prices across Bulgaria:** extract listings with prices in EUR and BGN, surface areas, and price-per-m2 to build price maps across Sofia, Plovdiv, Varna, Burgas, and every major Bulgarian city
- **Monitor new listings in real time:** schedule daily runs and get alerted the moment a property matching your criteria hits the market
- **Build property datasets for analysis:** export thousands of listings with areas, rooms, floors, and construction details for valuation models, academic research, or investment screening
- **Compare sale vs. rental markets:** switch between sale and rent listings to analyse yield gaps and rental demand across locations
- **Feed your CRM or dashboard:** export structured data to Google Sheets, Airtable, or any BI tool via Apify integrations

Imoti.net has **no public API and no bulk export feature**. This scraper is the only way to get structured data out of this platform at scale.

### What data does Imoti.net Scraper extract?

Each listing returns the following fields:

- **Property Title** -- the listing headline
- **Property Type** -- apartment (studio to 4+ room), house, villa, maisonette, office, plot, shop, and more (Bulgarian label as shown on the site)
- **Rooms** -- derived from the apartment-size label (Едностаен=1, Двустаен=2, Тристаен=3, Четиристаен=4, Многостаен=5+); null for houses, land, and other non-apartment types
- **Transaction Type** -- sale or rent
- **Price** -- asking price in EUR, with the BGN equivalent alongside (imoti.net always shows both currencies -- never converted, both are the site's own published numbers)
- **Price per m2** -- in both EUR and BGN
- **Area** -- living area in square meters
- **Floor** -- floor number, e.g. "2 от 4" (2 of 4) -- only with `fetchDetails` on
- **Construction Type** -- building material, e.g. "Тухла" (brick) -- only with `fetchDetails` on
- **Energy Class** -- energy performance rating, when the seller reported it -- only with `fetchDetails` on
- **City / District / Location** -- Bulgarian city and neighbourhood
- **Seller Type** -- agency or private individual
- **Agency Name** -- name of the listing agency, null for private sellers
- **Description** -- listing text (truncated snippet by default, full text with `fetchDetails` on)
- **Images** -- main thumbnail by default, full photo gallery with `fetchDetails` on
- **Posted Date / Views** -- only with `fetchDetails` on
- **URL** -- direct link to the listing on Imoti.net
- **Scraped At** -- ISO 8601 timestamp

### How to scrape Imoti.net data

The input is simple: choose a **city, property type, and transaction type** and hit run. You can configure the scraper through the Apify Console UI or programmatically via the API.

#### Input fields

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| **citySlug** | String | `"sofia"` | City area slug from an Imoti.net URL, e.g. `"sofia"`, `"plovdiv"`, `"varna"`, `"burgas"` |
| **transactionType** | String | `"sale"` | `"sale"` or `"rent"` |
| **propertyType** | String | `"any"` | `"any"`, `"ednostaen"`, `"dvustaen"`, `"tristaen"`, `"mnogostaen"`, `"mezonet"`, `"kashta"`, `"vila"`, `"ofis"`, `"parcel"`, `"magazin"` |
| **startUrls** | Array | -- | Imoti.net search-result or single-listing URLs (overrides city/type filters); max 100 |
| **maxResults** | Integer | `50` | Maximum number of listings to return (1--2,000) |
| **fetchDetails** | Boolean | `false` | OFF by default. When ON, fetches each listing's own detail page to add floor, construction type, energy class, posted date, views, and full photo gallery -- roughly doubles request count and run time |
| **proxyConfiguration** | Object | Automatic | No proxy group needed -- see "Do I need proxies?" below |

#### Tips for best results

- **Use `citySlug` for quick searches:** `"sofia"`, `"plovdiv"`, `"varna"`, `"burgas"`, `"ruse"`, `"stara-zagora"`, `"pleven"`, `"blagoevgrad"` and 18 more major cities are confirmed-working (see table below). Any valid Imoti.net area slug works, even ones not listed here.
- **Use `startUrls` for advanced filtering:** apply price ranges, room counts, or other filters on Imoti.net, copy the URL, and paste it as a start URL to preserve them. A single listing URL also works and returns full detail-page data for that one property.
- **Turn on `fetchDetails` only when you need it:** floor, construction type, energy class, posted date, and the full photo gallery all require an extra request per listing. Search-card data alone (default) already covers price in both currencies, area, rooms, location, and seller info.
- **Start with a small `maxResults`** (e.g. 20) to verify the output, then scale up.
- **Empty input works:** running with `{}` defaults to apartments and houses for sale in Sofia.

#### Confirmed city slugs

| City | Slug | City | Slug |
|------|------|------|------|
| Sofia | `sofia` | Montana | `montana` |
| Plovdiv | `plovdiv` | Haskovo | `haskovo` |
| Varna | `varna` | Yambol | `yambol` |
| Burgas | `burgas` | Pazardzhik | `pazardzhik` |
| Ruse | `ruse` | Kyustendil | `kustendil` |
| Stara Zagora | `stara-zagora` | Shumen | `shumen` |
| Pleven | `pleven` | Silistra | `silistra` |
| Dobrich | `dobrich` | Razgrad | `razgrad` |
| Sliven | `sliven` | Targovishte | `targovishte` |
| Pernik | `pernik` | Smolyan | `smolyan` |
| Veliko Tarnovo | `tarnovo` | Lovech | `lovech` |
| Blagoevgrad | `blagoevgrad` | Vidin | `vidin` |
| Vratsa | `vratsa` | Kardzhali | `kardzhali` |
| Gabrovo | `gabrovo` | | |

### Output

Results are stored in a **dataset** that you can download in JSON, CSV, Excel, XML, or HTML format directly from the Apify Console.

#### JSON example

```json
{
    "externalId": "6226637",
    "propertyTitle": "Едностаен апартамент, София, Малинова Долина",
    "propertyType": "Едностаен апартамент",
    "rooms": 1,
    "transactionType": "sale",
    "price": 95000,
    "currency": "EUR",
    "priceBgn": 185804,
    "pricePerSqm": 2794,
    "pricePerSqmBgn": 5464.82,
    "area": 34,
    "floor": "1 от 4",
    "constructionType": "Тухла",
    "energyClass": null,
    "city": "София",
    "district": "Малинова Долина",
    "location": "София, Малинова Долина",
    "sellerType": "agency",
    "agencyName": "Революшън Естейт България",
    "description": "Референтен номер: 2107424 ...",
    "imageUrl": "https://www.imoti.net/web/files/obiavi/6226637/main_image/thumb_880x0_wm_main_image_6226637_1.jpg",
    "images": ["https://www.imoti.net/web/files/obiavi/6226637/..."],
    "photoCount": 7,
    "postedDate": "2026-06-24",
    "views": 594,
    "url": "https://www.imoti.net/bg/obiava/prodava/sofia/malinova-dolina/ednostaen/6226637/",
    "scrapedAt": "2026-06-24T10:30:00.000Z"
}
```

### How much does it cost to scrape Imoti.net?

Imoti.net has no real bot protection to pay for -- the actor reads server-rendered HTML directly with a standard browser User-Agent header, no proxy or unblocking service required. That keeps runs fast and cheap.

| Scenario | Est. cost | Time |
|----------|-----------|------|
| 50 listings, `fetchDetails` off | ~$0.26 | ~10 sec |
| 500 listings, `fetchDetails` off | ~$2.51 | ~1 min |
| 500 listings, `fetchDetails` on | ~$2.51 | ~5 min |
| 2,000 listings, `fetchDetails` on | ~$10.01 | ~15 min |

**Pricing breakdown:**

- Per result: $0.005
- Per run: $0.01

Usage cost only settles once a run reports **SUCCEEDED** -- reading a dataset mid-run will show a cost far below the final total.

### Can I integrate Imoti.net Scraper with other apps?

Yes. Imoti.net Scraper connects with any tool through [Apify integrations](https://apify.com/integrations):

- **Google Sheets** -- automatically export property data to a spreadsheet
- **Slack / Email** -- get notified when new listings match your criteria
- **Zapier / Make** -- trigger workflows when data is ready
- **Airtable** -- build a searchable property database
- **REST API** -- call the scraper programmatically from any language
- **Webhooks** -- get notified when a run finishes

### Can I use Imoti.net Scraper as an API?

Yes. Use the [Apify API](https://docs.apify.com/api/v2) to run Imoti.net Scraper programmatically.

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("studio-amba/imoti-net-scraper").call(run_input={
    "citySlug": "sofia",
    "transactionType": "sale",
    "propertyType": "dvustaen",
    "maxResults": 200,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['propertyTitle']} -- EUR {item['price']:,} -- {item['location']}")
```

**JavaScript:**

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('studio-amba/imoti-net-scraper').call({
    citySlug: 'sofia',
    transactionType: 'sale',
    propertyType: 'dvustaen',
    maxResults: 200,
});

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

Check the [API tab](https://apify.com/studio-amba/imoti-net-scraper/api) for full documentation.

### FAQ

#### What is Imoti.net?

Imoti.net is one of Bulgaria's largest real estate platforms, covering apartments, houses, villas, land, and commercial property for sale and rent across every major Bulgarian city. It's a separate site and business from Imot.bg -- if you need both, Studio AMBA also publishes an [Imot.bg Scraper](https://apify.com/studio-amba/imot-bg-scraper).

#### How does Imoti.net Scraper work?

It requests Imoti.net search-result pages with a real browser User-Agent header (the site rejects requests that don't send one, but doesn't otherwise challenge automated access) and extracts structured data from the server-rendered HTML. Search cards give price, area, location, and seller info directly; the optional detail-page fetch adds floor, construction type, energy class, and the full photo gallery.

#### Can I scrape both sale and rental listings?

Yes. Set `transactionType` to `"sale"` or `"rent"`. Filter by property type with `propertyType`: apartments by room count, houses, villas, offices, plots, or shops.

#### Do I need proxies?

No. Imoti.net's only access rule is a realistic browser User-Agent header, which this actor always sends. The default `proxyConfiguration` uses Apify's free automatic proxy pool. If you see blocks from your own account's specific IP reputation, escalate to `RESIDENTIAL` in the proxy settings.

#### Why do prices show both EUR and BGN?

Imoti.net itself always displays both currencies for every listing -- the scraper reports both exactly as published, never converting one to the other at scrape time (an FX conversion would bake in a rate that goes stale immediately).

#### Is it legal to scrape Imoti.net?

This scraper extracts publicly available listing data that Imoti.net displays to all visitors. The data is factual (prices, addresses, property specifications) and does not contain private personal information. As with any scraping tool, use the data responsibly and in compliance with applicable laws. No login or cookies are required.

### Limitations

- **Bulgaria only.** Imoti.net covers exclusively Bulgarian real estate.
- **Rooms is derived, not native.** Imoti.net doesn't expose a separate numeric "rooms" field -- for apartments it's inferred from the Bulgarian size label (Едностаен/Двустаен/etc); it's null for houses, land, and other property types.
- **Floor, construction type, energy class, posted date, views, and full gallery all require `fetchDetails: true`.** With it off (the default, for speed), output comes only from search-card data.
- **Energy class is frequently missing.** Most sellers don't fill it in on the source site -- this is a data-completeness fact of Imoti.net, not a scraper limitation.
- **Description is a truncated snippet unless `fetchDetails` is on**, which pulls the full, untruncated listing text.

### Other Bulgarian and Balkan real estate scrapers

Combine Imoti.net Scraper with these actors for broader regional property market coverage:

- [Imot.bg Scraper](https://apify.com/studio-amba/imot-bg-scraper) -- Bulgaria's largest real estate portal
- [Spitogatos Scraper](https://apify.com/studio-amba/spitogatos-scraper) -- Greek real estate listings

### Your feedback

Found a bug or have a feature request? Please open an issue on the [Issues tab](https://apify.com/studio-amba/imoti-net-scraper/issues). We actively maintain this scraper and respond to all reports.

# Actor input Schema

## `citySlug` (type: `string`):

Bulgarian city area slug from an Imoti.net URL, e.g. 'sofia', 'plovdiv', 'varna', 'burgas', 'ruse', 'stara-zagora', 'pleven', 'blagoevgrad'. Defaults to 'sofia' if empty. Any valid Imoti.net area slug works, not just the documented ones.

## `transactionType` (type: `string`):

Search for properties for sale or for rent.

## `propertyType` (type: `string`):

Type of property to search for. Leave as 'any' for all types.

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

Imoti.net search-result or single-listing URLs. Overrides citySlug/transactionType/propertyType if provided. Max 100 URLs per run.

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

Maximum number of property listings to scrape. Hard-capped at 2000 to keep runs bounded (imoti.net search pages return up to 1000 cards per request, verified live).

## `fetchDetails` (type: `boolean`):

OFF by default. When ON, the actor visits each listing's own detail page (one extra request per result) to add floor, construction type, energy class, posted date, view count, and the full photo gallery — fields NOT available on the search-results cards. When OFF (default), output comes only from search-card data: price (EUR+BGN), area, rooms, location, seller, and one thumbnail image. Turning this ON roughly doubles request count and run time.

## `proxyConfiguration` (type: `object`):

Imoti.net has no real anti-bot — it only rejects requests without a realistic browser User-Agent header (which this actor always sends). No proxy group is required; automatic/free proxy is the default. Only escalate to RESIDENTIAL if you see repeated blocks from your own account's IP reputation.

## Actor input object example

```json
{
  "citySlug": "sofia",
  "transactionType": "sale",
  "propertyType": "any",
  "maxResults": 20,
  "fetchDetails": false,
  "proxyConfiguration": {
    "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 = {
    "citySlug": "sofia",
    "transactionType": "sale",
    "propertyType": "any",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/imoti-net-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 = {
    "citySlug": "sofia",
    "transactionType": "sale",
    "propertyType": "any",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/imoti-net-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 '{
  "citySlug": "sofia",
  "transactionType": "sale",
  "propertyType": "any",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/imoti-net-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/imoti-net-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/JVWbh18ZohJa2RU5q/builds/XjFwYiMr76sALyzYS/openapi.json
