# LUN.ua Real Estate Scraper – Ukraine (`ivladimir/lun-ua-realestate`) Actor

Scrape LUN.ua real estate listings in Ukraine. Extract prices, addresses, photos, descriptions, and optional phones. Pay per result.

- **URL**: https://apify.com/ivladimir/lun-ua-realestate.md
- **Developed by:** [Владимир Иваницкий](https://apify.com/ivladimir) (community)
- **Categories:** Real estate
- **Security:** 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 results

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

## LUN.ua Real Estate Scraper – Ukraine

Scrape property listings from LUN.ua, one of Ukraine's largest real estate aggregators. Extract structured data from sale and rent listings across Ukrainian cities, including prices, addresses, photos, descriptions, and optional phone numbers. LUN aggregates listings from multiple sources, so you also get the original source site and URL.

### What data you get

| Field | Type | Description |
|-------|------|-------------|
| id | integer | LUN listing ID |
| url | string | LUN listing URL |
| sourceSiteUrl | string | Original listing URL on source site |
| sourceSite | string | Source site domain (e.g., rieltor.ua) |
| title | string | Listing title |
| address | string | Full address |
| price | number | Price |
| currency | string | Currency (USD, UAH, etc.) |
| pricePerSqm | number | Price per square meter |
| rooms | integer | Number of rooms |
| areaTotal | number | Total area (m²) |
| areaLiving | number | Living area (m²) |
| areaKitchen | number | Kitchen area (m²) |
| areaLand | number | Land area (m²) |
| floor | integer | Floor number |
| floorsTotal | integer | Total floors in building |
| wallType | string | Wall type (brick, panel, etc.) |
| houseType | string | House type (special_project, etc.) |
| heating | string | Heating type |
| ceilingHeight | number | Ceiling height (m) |
| builtYear | integer | Year built |
| isOwner | boolean | Whether listed by owner |
| city | string | City |
| district | string | District |
| street | string | Street |
| residentialComplex | string | Residential complex name |
| region | string | Region |
| longitude | number | Longitude |
| latitude | number | Latitude |
| images | array | Array of image URLs |
| contactName | string | Contact person name |
| agency | string | Agency name |
| publishedAt | string | Publication date (ISO 8601) |
| updatedAt | string | Last update date (ISO 8601) |
| description | string | Full listing description |
| sourceUrl | string | Search URL used |
| totalFound | integer | Total listings found on search page |

### Use cases

- Real estate market analysis and price monitoring
- Investment research and property valuation
- Lead generation for real estate agencies
- Rental market tracking
- Data enrichment for property portals
- Academic research on housing markets

### How to use

1. Set up your search URLs: Go to LUN.ua, apply filters (city, property type, price range, etc.), and copy the URL. Add one or more URLs to the input.
2. Configure max items per URL: Set how many listings to scrape per search URL (24 listings per page).
3. Choose optional fields: Enable description and/or phone numbers (phones off by default for GDPR compliance).
4. Proxy settings: Use the built-in Apify Residential proxy (recommended for Ukrainian IPs) or provide your own custom proxy URL.
5. Run the actor and download results in JSON, CSV, or Excel.

### Input example

```json
{
  "searchUrls": ["https://lun.ua/sale/kyiv/flats"],
  "maxItemsPerUrl": 100,
  "includeDescription": true,
  "includePhones": false,
  "customProxyUrl": "",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "UA"
  }
}
```

### Output example

```json
{
  "id": 4201353427,
  "url": "https://lun.ua/realty/4201353427",
  "sourceSiteUrl": "https://rieltor.ua/flats-sale/view/12457302/",
  "sourceSite": "rieltor.ua",
  "title": "Кадетський Гай вул., 10",
  "address": "Кадетський Гай вул., 10, Солом'янський, Київ, Київська область",
  "price": 84000,
  "currency": "USD",
  "pricePerSqm": 1918,
  "rooms": 1,
  "areaTotal": 43.8,
  "areaLiving": 16.9,
  "areaKitchen": 11.7,
  "areaLand": null,
  "floor": 23,
  "floorsTotal": 26,
  "wallType": "brick",
  "houseType": "special_project",
  "heating": "centralized",
  "ceilingHeight": 2.8,
  "builtYear": 2021,
  "isOwner": false,
  "city": "Київ",
  "district": "Солом’янський",
  "street": "вулиця Кадетський Гай",
  "residentialComplex": "ЖК Медовий",
  "region": "Київська область",
  "longitude": 30.472793579101562,
  "latitude": 50.41172409057617,
  "images": [
    "https://market-images.lunstatic.net/lun-ua/1200/1200/images/offers/1873314400777057.jpg",
    "https://market-images.lunstatic.net/lun-ua/1200/1200/images/offers/1873314400540103.jpg"
  ],
  "contactName": "Кузьменко Сергій",
  "agency": "NOVATOR25",
  "publishedAt": "2026-01-24T19:53:53",
  "updatedAt": "2026-11-01T07:00:04",
  "description": "Тихий та зручний район Києва, сучасний ЖК Медовий з новими будинками та працюючою інфраструктурою — місце, де приємно жити і легко повертатись додому. Шукаєте квартиру, куди можна одразу заїхати без зайвих витрат і ремонту? Тут уже все зроблено, продумано і майже не використовувалось. Це однокімнатн",
  "sourceUrl": "https://lun.ua/sale/kyiv/flats",
  "totalFound": 1250
}
```

### Pricing

This actor uses pay-per-result pricing: **$3 per 1,000 results**. Apify platform usage is included. For example, scraping 5,000 listings costs $15. See the Pricing tab for details.

### FAQ

**Q: Is scraping LUN.ua legal?**
A: This actor only extracts publicly available data and respects robots.txt. Ensure you have a lawful basis for processing personal data, especially phone numbers (GDPR).

**Q: Do I need a proxy?**
A: Yes, we recommend using residential proxies, especially Ukrainian IPs. The actor includes built-in Apify Residential proxy, or you can provide your own custom proxy URL.

**Q: How many listings per page?**
A: LUN.ua shows 24 listings per page. The actor automatically paginates until it reaches the max items per URL.

**Q: Can I get phone numbers?**
A: Phone numbers are optional and disabled by default. Enable `includePhones` to extract them, but ensure you have a lawful basis under GDPR.

**Q: What is sourceSite?**
A: LUN.ua aggregates listings from other websites. `sourceSite` and `sourceSiteUrl` indicate the original source.

**Q: How do I set up search URLs?**
A: Go to LUN.ua, apply filters, and copy the URL from your browser. You can add multiple URLs.

### Integrations

- **API**: Access results via Apify API.
- **Webhooks**: Trigger notifications on run completion.
- **Google Sheets**: Export directly to Google Sheets.
- **Make/Zapier**: Connect to thousands of apps.
- **Scheduling**: Set up recurring runs to monitor new listings.

### 🇺🇦 Коротко українською

Цей актор збирає оголошення нерухомості з LUN.ua — ціни, адреси, фото, описи та інші дані. Підтримує продаж і оренду, працює з кількома пошуковими URL. Вбудований український резидентський проксі рекомендується для стабільної роботи. Телефони можна збирати опціонально, але лише за наявності законних підстав (GDPR). Ціна — $3 за 1000 результатів.

# Actor input Schema

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

Listing pages from lun.ua, e.g. https://lun.ua/sale/kyiv/flats or https://lun.ua/rent/lviv/flats (set filters on the site and copy the URL).

## `maxItemsPerUrl` (type: `integer`):

24 listings per page.

## `includeDescription` (type: `boolean`):

Full listing text.

## `includePhones` (type: `boolean`):

Seller phone numbers as shown on LUN. Process personal data only with a lawful basis (GDPR).

## `customProxyUrl` (type: `string`):

Your own residential proxy http://user:pass@host:port. Ukrainian residential IPs recommended.

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

Used if no custom proxy is set. RESIDENTIAL group with country UA is recommended.

## Actor input object example

```json
{
  "searchUrls": [
    "https://lun.ua/sale/kyiv/flats"
  ],
  "maxItemsPerUrl": 100,
  "includeDescription": true,
  "includePhones": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped items in the default dataset

# 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 = {
    "searchUrls": [
        "https://lun.ua/sale/kyiv/flats"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ivladimir/lun-ua-realestate").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 = { "searchUrls": ["https://lun.ua/sale/kyiv/flats"] }

# Run the Actor and wait for it to finish
run = client.actor("ivladimir/lun-ua-realestate").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 '{
  "searchUrls": [
    "https://lun.ua/sale/kyiv/flats"
  ]
}' |
apify call ivladimir/lun-ua-realestate --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ivladimir/lun-ua-realestate"
        }
    }
}
```

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/uavhNxRMtpc8TDPcE/builds/o9cGC0pF0Gz2TmEuh/openapi.json
