# Ingatlan Scraper for Hungarian Real Estate Listings (`studio-amba/ingatlan-scraper`) Actor

Scrape sale and rental listings from ingatlan.com, the Hungarian property portal. Get prices, price per m2, addresses, rooms, sizes, photos and agency info. No login or cookies required.

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

## Pricing

from $2.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?

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

## Ingatlan Scraper

Scrape sale and rental listings from ingatlan.com, the Hungarian property portal. You get price, price per m2, address, rooms, size, photos and (with detail pages on) condition, heating, energy rating and agency. No login or cookies required.

### How to scrape Ingatlan data

1. Go to the [Ingatlan Scraper](https://apify.com/studio-amba/ingatlan-scraper) page on Apify Store.
2. Click "Try for free" to open the actor in Apify Console.
3. Set your search filters: listing type (buy or rent), location, property type, price range, size and room count.
4. Click "Start" and wait for the run to finish.
5. Download your data as JSON, CSV, Excel, or connect it to your pipeline via API.

No API key, no login, no cookies needed. The actor handles Cloudflare protection and pagination automatically.

### Why use this actor?

ingatlan.com has no public API. This actor returns each listing as one structured row (prices as numbers, rooms and size as numbers, price per m2 filled in), so you can load the result straight into a spreadsheet, database or dashboard. You can search the whole country or a single city or district, for sale or for rent.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `listingType` | String | No | `elado` (buy, default) or `kiado` (rent) |
| `location` | String | No | City or district in Hungarian (e.g. `budapest`, `debrecen`, `szeged`). Leave empty to search all of Hungary |
| `propertyType` | String | No | `lakas` (apartment), `haz` (house), `telek` (land), `garázs`, `iroda`, or `uzlethelyiseg` |
| `minPrice` | Integer | No | Minimum price in HUF. For rent (`kiado`) this is the monthly rent |
| `maxPrice` | Integer | No | Maximum price in HUF. For rent (`kiado`) this is the monthly rent |
| `minSize` | Integer | No | Minimum floor area in m2 |
| `maxSize` | Integer | No | Maximum floor area in m2 |
| `minRooms` | Number | No | Minimum number of rooms. Ingatlan.com counts a half-room toward the total, so a `3 + 1 half` listing matches a minimum of 4 |
| `maxRooms` | Number | No | Maximum number of rooms |
| `maxResults` | Integer | No | Maximum results to return (default: 100, up to 100,000) |
| `fetchDetails` | Boolean | No | Off by default. Fetches each listing's own page to fill the eight detail-only fields marked below. Costs one extra page fetch per listing and adds roughly 15-30 seconds per listing |
| `maxDetails` | Integer | No | Cap on how many detail pages a run fetches when `fetchDetails` is on (default: 50). Listings past the cap are still returned, with the eight detail-only fields `null` |
| `trackNewListings` | Boolean | No | Off by default. Remembers the listing ids of this exact search in a key-value store in your account (`ingatlan-new-listings`) and adds `isNew` to every row. With `fetchDetails` on, only new listings get a detail page, up to `maxDetails`. The first run is a baseline: no detail pages, nothing marked new. Every run still reads and returns the whole search, because ingatlan.com has no newest-first sort or date filter |
| `searchRoute` | String | No | `auto` (default) is the fastest route. `webUnlocker` reads search pages through the Web Unlocker only, which can take longer. Rows and billing are the same. See Proxies below |
| `brightDataApiKey` | String | No | Leave empty. Only needed if you want the run to go through your own Bright Data account |
| `proxyConfiguration` | Object | No | Kept for backwards compatibility and ignored. See Proxies below |

### Output

Each result contains the fields below. The eight marked **detail** are only
published on a listing's own page, so they are `null` unless you turn on
`fetchDetails`.

| Field | Type | Example |
|-------|------|---------|
| `listingId` | String | `"35625213"` |
| `listingTitle` | String | `"Budapest, XIII. kerület, Angyalföld"` |
| `price` | Number | `45900000` |
| `currency` | String | `"HUF"` |
| `pricePerSqm` | Number | `850000` |
| `listingType` | String | `"sale"` or `"rent"` |
| `propertyType` | String | `"lakas"` |
| `address` | String | `"Budapest, XIII. kerület, Angyalföld"` |
| `city` | String | `"Budapest"` |
| `district` | String | `"XIII. kerület"`. Filled for Budapest districts, `null` for other cities |
| `rooms` | Number | `2` |
| `halfRooms` | Number | `1` |
| `surface` | Number | `54` |
| `landSurface` | Number | **detail**: `998` (houses and land; `null` for apartments) |
| `floor` | String | **detail**: `"9"` (apartments; `null` for houses) |
| `condition` | String | **detail**: `"felújított"` |
| `heating` | String | **detail**: `"gázkazán"` |
| `energyRating` | String | **detail**: `"A+"`. Ingatlan.com leaves this unset on roughly half of listings |
| `balcony` | Boolean | `true` |
| `parking` | String | **detail**: `"teremgarázs hely - megvásárolható"` |
| `agencyName` | String | **detail**: `"Otthon 13 Kft."`. The selling office, or the named agent or project sales team when there is no office |
| `agencyUrl` | String | **detail**: agency profile URL, e.g. `"https://iroda.ingatlan.com/cseri"` |
| `imageUrl` | String | Primary listing photo URL, `null` when the listing has no photo |
| `imageUrls` | Array | All listing photo URLs |
| `description` | String | **detail**: full listing description text |
| `url` | String | Full listing URL on ingatlan.com |
| `scrapedAt` | String | `"2026-10-14T04:00:57.834Z"` |

### Example output

```json
{
    "listingId": "35625213",
    "listingTitle": "Debrecen, Monostorpályi út 25.",
    "price": 265000,
    "currency": "HUF",
    "pricePerSqm": 2650,
    "listingType": "rent",
    "propertyType": "lakas",
    "address": "Debrecen, Monostorpályi út 25.",
    "city": "Debrecen",
    "district": null,
    "rooms": 2,
    "halfRooms": null,
    "surface": 100,
    "landSurface": null,
    "floor": "1",
    "condition": "újszerű",
    "heating": "gázkazán, házközponti",
    "energyRating": "B",
    "balcony": true,
    "parking": "utca, közterület - ingyenes",
    "agencyName": null,
    "agencyUrl": null,
    "imageUrl": "https://ip.ingatlancdn.com/resize/magan/800x800/7bc5bd11735bd09f8dfd32d346fc54be9ed2b67c4c4a46ba95d65da248dec1ec/eyJrZXkiOiJjNVwvMThcLzEyNTU2MjIyOC5qcGciLCJrZWVwX3JhdGlvIjp0cnVlfQ==?source=listing_card",
    "imageUrls": [
        "https://ip.ingatlancdn.com/resize/magan/800x800/7bc5bd11735bd09f8dfd32d346fc54be9ed2b67c4c4a46ba95d65da248dec1ec/eyJrZXkiOiJjNVwvMThcLzEyNTU2MjIyOC5qcGciLCJrZWVwX3JhdGlvIjp0cnVlfQ==?source=listing_card"
    ],
    "description": "Debrecen , Monostorpályi úton frekventált helyen, buszmegállótól 2 percre boltok, üzletekhez közel, modern, bútorozott,...",
    "url": "https://ingatlan.com/35625213",
    "scrapedAt": "2026-10-14T04:00:57.834Z"
}
```

### Proxies

You do not configure a proxy for this actor. Ingatlan.com sits behind
Cloudflare and refuses Apify proxy exits on every page except the first search
page, so the actor fetches through Bright Data using its own credentials:
search pages through the Scraping Browser (one fresh session per page, three
at a time at the default 512 MB and six from 1 GB of run memory), detail pages
through the Web Unlocker, which is also the fallback for search pages. `proxyConfiguration` is still accepted so that existing saved
tasks keep running, but it is ignored and the run says so in its log.

A search page holds 20 listings. Measured on the platform at the default
512 MB on 2026-10-12: 440 listings in 169 seconds and 2,000 listings in 744
seconds, about 7.5 seconds per page. At that memory the run is limited by its
CPU share, so more memory makes it faster (on a full core the same 2,000
listings took 108 seconds). A search of 8,500 listings needs about 55 minutes
at 512 MB: raise the run memory or the run timeout for searches that size.
When the Scraping Browser is unavailable the run falls back to the Web
Unlocker, which on a slow day reads one page per 25 seconds. Rows are saved page by
page, so a run that reaches its timeout keeps what it has read.

Set `searchRoute` to `webUnlocker` to keep search pages off the Scraping Browser
for the whole run. Three pages are read at a time, between 8 and 22 seconds per
page measured on 2026-11-03, so a search of 28,000 listings takes 3 to 9 hours
and needs a run timeout to match.

### Cost estimate

The actor charges $0.005 per run (start fee, one event per GB of memory; the
default is 512 MB) plus $0.002 per result scraped. 100 results costs about
$0.21; 1,000 results about $2.01. A run's usage cost only settles after it reports
SUCCEEDED.

`fetchDetails` does not change the price per result, but it does change how
long a run takes: one extra page fetch per listing. Three are fetched at a
time, which works out at roughly 15-30 seconds per listing. A 50-listing run
with `fetchDetails` on takes about 12-25 minutes, where
the same run without it finishes in under a minute. Use `maxDetails` to bound
it.

### Limitations

- The eight fields marked **detail** above need `fetchDetails`. Without it they are `null`, because ingatlan.com does not put them on the search results page
- `energyRating`, `condition` and `parking` are `null` on listings where the seller left them blank, even with `fetchDetails` on
- `floor` applies to apartments, `landSurface` to houses and land. Each is `null` for the other
- Data is scraped from the public website and may change without notice
- Prices are in HUF (Hungarian Forint) unless listed in EUR by the seller

### Use cases

- **Market analysis**: track asking prices, price-per-m2, and listing volumes across Hungarian cities and districts.
- **Investment research**: compare property prices in Budapest districts or across regional cities like Debrecen, Szeged, and Pecs.
- **Relocation planning**: search rental listings by area, room count, and budget for employees or families moving to Hungary.
- **Real estate CRM enrichment**: import listings with agency info, photos, and property specs into your pipeline.
- **Competitor monitoring**: compare asking prices of nearby listings.
- **Proptech dashboards**: build rental-yield and ROI models on fresh ingatlan.com inventory.

### Support

Hit a bug or a missing field? Open an issue on the Actor page with the input you used. We answer Store issues within 24 hours.

# Actor input Schema

## `listingType` (type: `string`):

Filter by sale (elado) or rent (kiado).

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

City or district name in Hungarian (e.g. 'budapest', 'debrecen', 'szeged', 'budapest+XIII.+kerulet'). Leave empty for all Hungary.

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

Filter by property type.

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

Minimum price in Hungarian Forint. For rent (kiado) this is the monthly rent. Ingatlan.com rounds this to whole millions for sale and whole thousands for rent.

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

Maximum price in Hungarian Forint. For rent (kiado) this is the monthly rent.

## `minSize` (type: `integer`):

Minimum floor area in square meters. Setting only a minimum searches from that size upward.

## `maxSize` (type: `integer`):

Maximum floor area in square meters. Setting only a maximum searches from 0 up to that size.

## `minRooms` (type: `number`):

Minimum number of rooms. Ingatlan.com counts a half-room toward the total, so a '3 + 1 half' listing matches a minimum of 4; the output reports rooms and halfRooms separately.

## `maxRooms` (type: `number`):

Maximum number of rooms.

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

Maximum number of listings to return.

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

OFF by default. When off, each listing carries what the search page shows (price, address, city, district, size, rooms, balcony, image). Turn it on to also fill landSurface, floor, condition, heating, energyRating, parking, agencyName and description, which ingatlan.com only publishes on the listing's own page. This costs ONE extra page fetch per listing and adds roughly 15-30 seconds per listing (three are fetched at a time), so a 50-listing run takes 12-25 minutes. Use maxDetails to cap it.

## `maxDetails` (type: `integer`):

Hard cap on how many listings get their detail page fetched when fetchDetails is on. Listings past the cap are still returned, with the eight detail-only fields null.

## `trackNewListings` (type: `boolean`):

OFF by default. Remembers the listing ids of this exact search in a key-value store in your account (ingatlan-new-listings) and adds isNew to every row. With fetchDetails on, only new listings get a detail page, up to maxDetails. The first run reads the whole search as a baseline: it fetches no detail pages and marks nothing as new. Ingatlan.com has no newest-first sort or date filter, so each run still reads and returns the whole search and every row is billed as usual.

## `searchRoute` (type: `string`):

How search pages are fetched. auto is the fastest route and the right choice for almost every run. webUnlocker reads search pages through the Web Unlocker only, three at a time, which can take longer: between 8 and 22 seconds per page measured on 2026-11-03, so a 28,000-listing search takes 3 to 9 hours. Rows and billing are the same on both routes. With webUnlocker, set the run timeout to match.

## `brightDataApiKey` (type: `string`):

Optional. Leave empty -- the actor supplies its own key. Only needed if you want the run to go through your own Bright Data account.

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

Kept for backwards compatibility and no longer used. Ingatlan.com refuses Apify proxy exits on every page except the first search page, so this actor fetches through Bright Data Web Unlocker instead. Anything set here is ignored.

## Actor input object example

```json
{
  "listingType": "elado",
  "location": "budapest",
  "propertyType": "lakas",
  "maxResults": 20,
  "fetchDetails": false,
  "maxDetails": 50,
  "trackNewListings": false,
  "searchRoute": "auto",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "HU"
  }
}
```

# 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 = {
    "listingType": "elado",
    "location": "budapest",
    "propertyType": "lakas",
    "maxResults": 20,
    "fetchDetails": false,
    "maxDetails": 50,
    "trackNewListings": false,
    "searchRoute": "auto",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "HU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/ingatlan-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 = {
    "listingType": "elado",
    "location": "budapest",
    "propertyType": "lakas",
    "maxResults": 20,
    "fetchDetails": False,
    "maxDetails": 50,
    "trackNewListings": False,
    "searchRoute": "auto",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "HU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/ingatlan-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 '{
  "listingType": "elado",
  "location": "budapest",
  "propertyType": "lakas",
  "maxResults": 20,
  "fetchDetails": false,
  "maxDetails": 50,
  "trackNewListings": false,
  "searchRoute": "auto",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "HU"
  }
}' |
apify call studio-amba/ingatlan-scraper --silent --output-dataset

```

## MCP server setup

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