# Etagi Property Search Scraper (`stealth_mode/etagi-property-search-scraper`) Actor

Scrape property listings from Etagi.com with comprehensive details. Collect prices, locations, media, property types, and 55+ fields per listing — perfect for real estate investors, market researchers, and property aggregators.

- **URL**: https://apify.com/stealth\_mode/etagi-property-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Etagi Property Search Scraper: Extract Real Estate Data Easily

***

### What Is Etagi.com?

Etagi.com is a comprehensive real estate platform offering property listings across multiple cities and regions. It hosts thousands of residential and commercial properties with detailed information including prices, specifications, media galleries, and availability. Manually extracting and analyzing this property data is labor-intensive — the **Etagi Property Search Scraper** automates the entire process, transforming search results into structured, actionable datasets.

***

### Overview

The **Etagi Property Search Scraper** extracts property listings from Etagi.com search result pages, capturing comprehensive property metadata and converting unstructured listings into clean, structured records. It is designed for:

- **Real estate investors** tracking market trends and deal opportunities
- **Market researchers** analyzing property pricing and availability by location
- **Data analysts** building datasets for valuation models and market intelligence
- **Property aggregator platforms** feeding data into custom portals
- **Competitive intelligence teams** monitoring competitor listings

Key advantages include batch processing multiple search pages, flexible item limits per URL, and resilient error handling with the `ignore_url_failures` option to handle temporary issues gracefully.

***

### Input Format

The scraper accepts a JSON configuration object controlling which properties to extract:

```json
{
    "urls": [
        "https://pattaya.etagi.com/en-us/realty/?page=2"
    ],
    "max_items_per_url": 200,
    "ignore_url_failures": true
}
```

| Field | Description |
|---|---|
| `urls` | Etagi property search result page URLs (supports multiple pages and filters) |
| `max_items_per_url` | Maximum properties per URL (default: 20, max: 200) |
| `ignore_url_failures` | If `true`, skips failed URLs instead of halting the run |

> **Tip:** You can scrape multiple search result pages by adding them to the `urls` array, such as page 1, page 2, etc. Use filter parameters in the URL to refine results by city, price range, or property type.

***

### Output Format

**Sample output**

```json
{
  "address_id": 14832829,
  "city_id": 2426168,
  "entrance_id": 4937038,
  "gp_id": 614079,
  "newhouses_id": 614079,
  "newcomplex_id": 53521,
  "district_id": null,
  "district_type": null,
  "office_id": 318,
  "street_id": 2112118,
  "wall_id": 85,
  "is_aggregator_object": false,
  "price": "2200000",
  "price_m2": "81481",
  "row_num": "1",
  "house_address_number": "159/49",
  "square": 27,
  "action_sl": "sale",
  "is_exclusive": false,
  "floors": 8,
  "floor": 6,
  "is_sell_off": false,
  "main_photo": "https://cdn.esoft.digital/content/cluster/ecoobjects26/08/b8/e455c8ab39ec91033657a57b40262d03b26e79b8.jpeg",
  "media": {
    "photos": 14
  },
  "rooms": 0,
  "object_type_id": 1,
  "is_sale": false,
  "with_stuff": false,
  "studio_type": 2,
  "ticket_type_id": 1,
  "building_year": 2015,
  "deadline_q": 4,
  "deadline_y": 2015,
  "ondeadline": true,
  "debt_transfer": false,
  "share_sale": false,
  "online_showing": true,
  "is_xl_card": false,
  "is_color_card": false,
  "type_text": "apartments",
  "type": "flat",
  "keep": "6",
  "status": "active",
  "has_installment": false,
  "studio": true,
  "la": "12.962856",
  "lo": "100.889161",
  "house_num": "159/49",
  "object_id": 13839110,
  "class_": "flats",
  "visual": "photo",
  "has_videos": false,
  "house_complex_media": {
    "photos": 7
  },
  "user_id": 149794,
  "housing_category_ids": null,
  "districttr": null,
  "nntr": "city-garden-tropicana",
  "streettr": "moo-5",
  "meta": {
    "city": "Паттайя (Pattaya)",
    "city_district": null,
    "district": null,
    "street": "Moo 5",
    "newcomplex": "CITY GARDEN TROPICANA",
    "walls": "Монолитные"
  },
  "from_url": "https://pattaya.etagi.com/en-us/realty/?page=2"
}
```

Each property listing returns a detailed record with 57+ fields covering identification, pricing, specifications, location, media, and metadata:

#### Identification & Core IDs

| Field | Meaning |
|---|---|
| `Object ID` | Unique identifier for the property listing |
| `Ticket ID` | Internal ticket number assigned by Etagi |
| `Address ID` | Unique address identifier |
| `City ID` | City classification code |
| `District ID` | Administrative district identifier |
| `Street ID` | Street identifier within the district |
| `Office ID` | Real estate office handling the listing |
| `User ID` | Agent or user account ID |

#### Pricing & Financial

| Field | Meaning |
|---|---|
| `Price` | Total asking price in local currency |
| `Price per m²` | Unit price per square meter |
| `Has Installment` | Whether the property offers payment plans |
| `Debt Transfer` | Applicable debt transfer conditions |
| `Share Sale` | Fractional ownership sale options |

#### Property Specifications

| Field | Meaning |
|---|---|
| `Square` | Total area in square meters |
| `Rooms` | Number of rooms or bedrooms |
| `Floor` | Current floor level |
| `Floors` | Total floors in the building |
| `Studio Type` | Apartment layout classification (e.g., studio, 1-bed) |
| `Building Year` | Year of construction or completion |
| `Wall` | Wall construction material (e.g., concrete, brick) |
| `With Stuff` | Furnished status and included fixtures |

#### Location & Geography

| Field | Meaning |
|---|---|
| `House Address Number` | Building or house number |
| `House Number` | Street-level address number |
| `District TR` | Turkish/localized district name |
| `Street TR` | Turkish/localized street name |
| `Latitude` | GPS latitude coordinate |
| `Longitude` | GPS longitude coordinate |
| `Displayed Location` | User-friendly location description |

#### Media & Visuals

| Field | Meaning |
|---|---|
| `Main Photo` | Primary listing photo URL |
| `Media` | Array of additional images and media |
| `Has Videos` | Whether video tour(s) are available |
| `House Complex Media` | Complex-wide photo galleries |
| `Is Color Card` | Enhanced color property card flag |
| `Is XL Card` | Large format listing card flag |
| `Visual` | Visual presentation type |

#### Listing Status & Flags

| Field | Meaning |
|---|---|
| `Status` | Current listing status (active, sold, pending) |
| `Type` | Property type (apartment, house, commercial, etc.) |
| `Object Type ID` | Numeric property type classification |
| `Is Sale` | Sale listing (vs. rental) |
| `Is Sell Off` | Off-plan or pre-completion sale |
| `Is Exclusive` | Exclusive listing flag |
| `Is Aggregator Object` | Synced from external aggregator |
| `Action SL` | Action or promotion code |
| `Keep` | Listing retention flag |
| `Online Showing` | Virtual tour availability |

#### Construction & Timeline

| Field | Meaning |
|---|---|
| `Deadline Quarter` | Q1, Q2, Q3, or Q4 completion target |
| `Deadline Year` | Expected completion year |
| `On Deadline` | Whether project is tracking to deadline |

#### Additional Metadata

| Field | Meaning |
|---|---|
| `Class` | Property class or tier (luxury, standard, budget) |
| `Housing Category IDs` | Categories the property belongs to |
| `Entrance ID` | Building entrance identifier |
| `GP ID` | General property grouping code |
| `New Houses ID` | New construction project ID |
| `New Complex ID` | New development complex ID |
| `Row Number` | Row position in search results |
| `Meta` | Extended metadata JSON object |
| `Type Text` | Text description of property type |
| `NNTR` | Additional classification code |

***

### How to Use

1. **Find property list URLs** — Navigate to Etagi.com, apply any search filters (city, price, type), and copy the search results page URL.
2. **Configure input** — Paste the URL(s) into the `urls` array. Set `max_items_per_url` to control volume (e.g., 200 properties per page).
3. **Enable resilience** — Set `ignore_url_failures: true` for multi-page scrapes to skip temporarily unavailable pages.
4. **Run the scraper** — Start the actor and monitor progress in the logs.
5. **Export and analyze** — Download results as JSON, CSV, or Excel for market analysis, valuation modeling, or platform integration.

**Pro tips:**

- Use URL filters to target specific cities, price ranges, or property types before scraping.
- Scrape multiple pages sequentially by adding paginated URLs to the array.
- Combine output with geographic analysis tools using latitude/longitude fields.

***

### Benefits & Real-World Applications

- **Investment analysis:** Compare properties across cities by price per m², room count, and location
- **Market benchmarking:** Track average prices, appreciation rates, and inventory trends
- **Lead generation:** Identify new listings and off-plan projects matching investment criteria
- **Aggregation:** Feed structured data into your own property portal or mobile app
- **Competitive intelligence:** Monitor agent activity and listing strategies in your target market

The Etagi Property Search Scraper transforms time-consuming manual research into automated, scalable data collection, enabling faster decision-making and deeper market insights.

***

### Conclusion

The **Etagi Property Search Scraper** is an essential tool for anyone serious about real estate data. With 57+ fields capturing everything from pricing to media to geographic coordinates, it delivers the complete picture you need to analyze markets, identify opportunities, and make informed investment decisions. Start scraping today.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the property list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://pattaya.etagi.com/en-us/realty/?page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://pattaya.etagi.com/en-us/realty/?page=2"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/etagi-property-search-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 = {
    "urls": ["https://pattaya.etagi.com/en-us/realty/?page=2"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/etagi-property-search-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 '{
  "urls": [
    "https://pattaya.etagi.com/en-us/realty/?page=2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/etagi-property-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stealth_mode/etagi-property-search-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/AKre1u53mNo6q1nDk/builds/LKSJpHqyRYfOxJGif/openapi.json
