# Fazwaz Thailand Property Scraper — Sale & Rent (`sian.agency/fazwaz-property-scraper`) Actor

Scrape Thai real-estate listings from FazWaz — sale & rent across Phuket, Bangkok & all Thailand, as clean JSON/CSV. Choose a fast overview scan or full detail (photos, GPS, ownership, rental yield, price-per-sqm). Search by region, search URL, or specific listing URLs.

- **URL**: https://apify.com/sian.agency/fazwaz-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 overview listings

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## FazWaz Thailand Property Scraper 🇹🇭🏠

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian)
[![Smart Idealista Scraper](https://img.shields.io/badge/Store-Smart%20Idealista%20Scraper-E60023)](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian)
[![Bayut Property Scraper](https://img.shields.io/badge/Store-Bayut%20Property%20Scraper-93D500)](https://apify.com/sian.agency/bayut-property-scraper?fpr=sian)
[![Redfin Property Scraper](https://img.shields.io/badge/Store-Redfin%20Property%20Scraper-A02021)](https://apify.com/sian.agency/redfin-property-scraper?fpr=sian)

#### 🎉 NEW: Detail mode is now a full superset of Overview — every fast-scan field PLUS description, photos, GPS, ownership, developer & completion data on every listing.
##### Built for property investors, agents, and market researchers who need clean Thai real-estate data — for sale and for rent — without code or copy-paste.

### 📋 Overview

**Pull Thai real-estate listings from FazWaz as clean JSON or CSV** — for sale and for rent, across Phuket, Bangkok, Pattaya, Chiang Mai, Koh Samui, Hua Hin and all of Thailand. Pick the depth that fits the job: a fast price + spec scan, or the full per-property record.

**Why investors and agents choose us:**
- ⚡ **Two depths, one actor**: a fast Overview scan for sizing a market, or full Detail records when you need everything
- 🔁 **Detail = Overview + more**: every fast-scan field is on a Detail row too, with deep data added on top — never less
- 💱 **Dual currency built in**: every row carries THB **and** USD plus price-per-sqm, from one live FX rate per run
- 📊 **Investor-ready**: original (pre-discount) price, estimated monthly rent, rental yield (ROI %) and CAM fee on every row
- 🎯 **Three ways to search**: by region, by a pasted search URL, or by specific listing URLs
- 🆓 **Free to try**: up to 25 listings per run, no credit card

### ✨ Features

- 🧭 **Overview mode**: ~30 listings per page scan — price, specs, location, yield — ideal for fast market sweeps
- 🔍 **Detail mode**: full ~40-field record per listing (description, photo gallery, GPS, ownership, furnishing, developer, completion)
- 🗺️ **By region / search URL / listing URL**: pick provinces + sale/rent, paste a FazWaz search link, or drop in specific listings
- 🎚️ **Filters & sort**: price range, bedrooms, bathrooms, property type, completion status, and sort by newest or price
- 💱 **Dual-currency + price/sqm**: THB ↔ USD conversion and the standard Thai price-per-sqm metric on every row
- 📈 **Investor signals**: original price, estimated rent, rental yield (ROI %), CAM fee
- 🧾 **Self-documenting datasets**: every row carries a `metadata` object recording the exact search settings that produced it
- 📤 **Clean exports**: JSON, CSV, Excel, or the full REST API

### 🎬 Quick Start

Choose a scrape depth + a search mode, set your filters, and run.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~fazwaz-property-scraper/runs?token=[YOUR_TOKEN] \
-H 'Content-Type: application/json' \
-d '{
  "scrapeMode": "overview",
  "searchMode": "byRegion",
  "provinces": ["phuket", "bangkok"],
  "operation": "sale",
  "maxResults": 50
}'
````

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Pick your scrape depth

- **Overview** — fast price + spec scan straight from search results (~30 listings/page).
- **Detail** — everything Overview returns, **plus** the full per-property record.

#### Step 2: Choose how to search

- **By region** — pick provinces (e.g. `phuket`, `bangkok`) + sale or rent.
- **By search URL** — paste one (or several) FazWaz search-results URLs; each is paged through and merged (pagination automatic), with Max results spread evenly across them.
- **By listing URL** — drop in specific listing URLs (Detail mode).

#### Step 3: Filter, set Max results & run

Narrow a region search by price, bedrooms, bathrooms, property type and completion status, sort how you like, then download.

**That's it! In seconds you'll have:**

- Clean property data (price in THB **and** USD, beds/baths, size, price-per-sqm)
- Location detail (address, province · district · subdistrict, GPS coordinates in Detail)
- Investor signals (original price, estimated rent, rental yield, CAM fee)
- Full listing data in Detail (description, photo gallery, ownership, furnishing, developer, completion)

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| scrapeMode | string | No | `overview` (fast scan) or `detail` (full record). Default `overview` |
| searchMode | string | No | `byRegion`, `bySearchUrl`, or `byListingUrl`. Default `byRegion` |
| maxResults | integer | No | Max listings to return (FREE tier caps at 25). Default 100 |
| provinces | array | By region | Thai provinces, e.g. `["phuket","bangkok"]` |
| operation | string | By region | `sale` or `rent` |
| searchUrl | string | By search URL | A single FazWaz search-results URL |
| searchUrls | array | By search URL | One or more FazWaz search-results URLs (paged & merged) |
| listingUrls | array | By listing URL | Specific FazWaz listing URLs (Detail only) |
| sortBy | string | No | `recommended`, `newest`, `price_asc`, `price_desc` |
| propertyTypes | array | No | `condo`, `villa`, `house`, `townhouse`, `apartment`, `penthouse`, `land` |
| minPrice / maxPrice | integer | No | Price range in THB (by region) |
| bedrooms / bathrooms | array | No | Counts to include, e.g. `["2","3"]` (by region) |
| completionStatus | string | No | `all`, `off_plan`, `completed` (by region) |

**Example (Detail, by region):**

```json
{
  "scrapeMode": "detail",
  "searchMode": "byRegion",
  "provinces": ["phuket"],
  "operation": "sale",
  "propertyTypes": ["condo", "villa"],
  "minPrice": 3000000,
  "bedrooms": ["2", "3"],
  "sortBy": "price_asc",
  "maxResults": 100
}
```

### 📊 Overview vs Detail — what you get

| Field | ⚡ Overview | 🔍 Detail |
|---|:---:|:---:|
| Price (THB & USD), price/sqm | ✅ | ✅ |
| **Original / pre-discount price** | ✅ | ✅ |
| Property type, beds, baths, size | ✅ | ✅ |
| Project name & developer | ✅ | ✅ |
| Address (province · district · subdistrict) | ✅ | ✅ |
| Thumbnail | ✅ | ✅ |
| **Nearby landmarks** | ✅ | ✅ |
| **Estimated monthly rent, rental yield (ROI %), CAM fee** | ✅ | ✅ |
| Last-updated | ✅ | ✅ |
| Full description | — | ✅ |
| Full photo gallery | — | ✅ |
| GPS coordinates (lat/lng) | — | ✅ |
| Ownership (e.g. Freehold / Foreign Quota) | — | ✅ |
| Furnishing, floor, view | — | ✅ |
| Completion year & date, construction status | — | ✅ |
| Amenities / features list | — | ✅ |
| Listing reference, date listed | — | ✅ |

**Detail is a strict superset of Overview** — every Overview field lands on a Detail row too, with the deep listing data added on top.

> ℹ️ The card-sourced fields (**original price, nearby landmarks, estimated rent**) are carried into Detail when you search **By region** or **By search URL**. The **By listing URL** mode has no search page to read them from, so those three may be absent there.

### 📤 Output

Results are saved to the Apify dataset. Detail rows carry ~40 fields including:

| Field | Type | Description |
|-------|------|-------------|
| id | string | FazWaz listing ID (e.g. `U5350611`) |
| propertyTitle | string | Listing title |
| operation | string | `sale` or `rent` |
| price | integer | Listed price |
| currency | string | Listed currency |
| price\_thb / price\_usd | integer | Dual-currency price |
| price\_per\_sqm\_thb / price\_per\_sqm\_usd | number | Price per indoor sqm |
| price\_original | integer | Original / pre-discount price |
| rent | integer | Estimated monthly rent |
| rental\_yield | number | Gross rental yield (ROI %) |
| cam\_fee | integer | CAM (maintenance) fee |
| property\_type | string | Condo, villa, house… |
| bedrooms / bathrooms | integer | Room counts |
| area\_sqm | number | Indoor area |
| project\_name / developer | string | Project & developer |
| address / province / district / subdistrict | string | Location |
| lat / lng | number | GPS coordinates (Detail) |
| ownership | string | e.g. Freehold / Foreign Quota (Detail) |
| furnishing / floor / view | string | Unit details (Detail) |
| completion\_year / completion\_date / construction\_status | mixed | Build status (Detail) |
| features | array | Amenities (Detail) |
| photos | array | Photo gallery (Detail) |
| nearby | array | Nearby landmarks |
| description | string | Full description (Detail) |
| url | string | Canonical listing URL |
| metadata | object | The exact search settings that produced the row |

**Example (Detail):**

```json
{
  "id": "U5350611",
  "propertyTitle": "2 Bedroom Condo for sale at Supalai City Resort",
  "operation": "sale",
  "price": 6500000,
  "currency": "THB",
  "price_thb": 6500000,
  "price_usd": 197000,
  "price_per_sqm_thb": 108333,
  "price_original": 7200000,
  "rent": 28000,
  "rental_yield": 5.2,
  "cam_fee": 3000,
  "property_type": "Condo",
  "bedrooms": 2,
  "bathrooms": 2,
  "area_sqm": 60,
  "project_name": "Supalai City Resort Phuket",
  "developer": "Supalai",
  "address": "Ratsada, Phuket",
  "province": "Phuket",
  "district": "Mueang Phuket",
  "subdistrict": "Ratsada",
  "lat": 7.8916,
  "lng": 98.3925,
  "ownership": "Foreign Quota",
  "furnishing": "Fully Furnished",
  "completion_year": 2017,
  "construction_status": "Completed",
  "photos": ["https://cdn.fazwaz.com/.../0.jpg"],
  "nearby": ["Central Festival Phuket (2.1 km)"],
  "url": "https://www.fazwaz.com/property-sales/...-u5350611",
  "fx_usd_thb": 33.0
}
```

### 💼 Use Cases & Examples

#### Property Investment Sourcing

Scan a whole province for sale or rent and screen by cash-flow.

**Input:** By region + price/bedroom filters
**Output:** Listings with original price, estimated rent, rental yield & CAM fee
**Use:** Shortlist cash-flowing properties without opening each listing

#### Real-Estate Market Analysis

Track asking prices and price reductions across areas over time.

**Input:** By region + sort by newest or price
**Output:** Price, price-per-sqm, original vs current price
**Use:** Market reports, price-trend tracking

#### Agent & Relocation Client Lists

Export a client's search to a spreadsheet in one run.

**Input:** A pasted FazWaz search URL
**Output:** Clean listing rows ready for Excel/Sheets
**Use:** Client shortlists, relocation search

#### Comparable (Comp) Analysis

Pull like-for-like listings for valuation.

**Input:** Detail mode + property type + size filters
**Output:** Full records with ownership, completion year, size
**Use:** Valuation benchmarks, developer comps

#### Lead Generation & Data Feeds

Feed a clean Thai-property dataset into your own tools.

**Input:** Any mode + Max results
**Output:** Structured JSON/CSV with a self-documenting `metadata` object
**Use:** Dashboards, CRMs, internal models

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/fazwaz-property-scraper').call({
  scrapeMode: 'detail',
  searchMode: 'byRegion',
  provinces: ['phuket'],
  operation: 'sale',
  maxResults: 50,
});

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

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/fazwaz-property-scraper').call(
    run_input={
        'scrapeMode': 'overview',
        'searchMode': 'byRegion',
        'provinces': ['bangkok'],
        'operation': 'rent',
        'maxResults': 100,
    }
)

items = client.dataset(run['defaultDatasetId']).list_items().items
print(f"Found {len(items)} listings")
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~fazwaz-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
  "scrapeMode": "detail",
  "searchMode": "bySearchUrl",
  "searchUrl": "https://www.fazwaz.com/property-for-sale/thailand/phuket",
  "maxResults": 30
}'
```

#### Automation Tool Workflows (n8n, Zapier, Make, etc.)

1. **Trigger**: Manual / schedule / webhook
2. **HTTP Request**: Call this actor's API
3. **Process**: Filter and analyze listings
4. **Action**: Save to a database, send alerts, or build reports

### 📊 Performance & Pricing

**View current pricing in the [Apify Console](https://apify.com/sian.agency/fazwaz-property-scraper?fpr=sian).**

- **Pay-per-result**: you're charged per listing returned — Overview rows (fast scan) are priced for high-volume sweeps; Detail rows carry the full record.
- **FREE tier**: up to 25 listings per run — full feature access, no credit card.
- **PAID tier**: unlimited listings per run.

💡 **Tip:** Start with **Overview** to size a market cheaply, then re-run the interesting listings in **Detail** — you keep every Overview field and gain the full per-property record on top.

### ❓ Frequently Asked Questions

**Q: What's the difference between Overview and Detail?**
A: Overview is a fast scan of search-result cards (~30 listings/page) with price, specs, location and investor signals. Detail returns everything Overview does **plus** the full per-property record (description, photos, GPS, ownership, furnishing, developer, completion). Detail is a strict superset.

**Q: Does it cover sale and rent?**
A: Both — set `operation` to `sale` or `rent`, or paste a search URL for either.

**Q: Which areas are supported?**
A: Anywhere FazWaz lists in Thailand — Phuket, Bangkok, Pattaya, Chiang Mai, Koh Samui, Hua Hin and more.

**Q: What currency are prices in?**
A: Listings are served in Thai Baht; every row also includes a USD conversion and price-per-sqm from one live FX rate per run.

**Q: Can I export to Excel?**
A: Yes — download as CSV/Excel, or pull JSON via the REST API.

**Q: How many listings can I get?**
A: FREE tier: up to 25 per run. PAID tier: unlimited.

**Q: Is there a free trial?**
A: Yes — every account can pull up to 25 listings per run for free.

### 🐛 Troubleshooting

**No results returned**

- Check province spelling (e.g. `chiang-mai`, not `Chiang Mai`)
- Broaden your filters (price range, bedrooms)
- Confirm there are listings for that operation (sale vs rent)

**"requires at least one province" error**

- `byRegion` needs at least one entry in `provinces`

**Invalid URL error**

- `bySearchUrl` expects a FazWaz `/property-for-sale|rent/thailand/...` search URL
- `byListingUrl` expects FazWaz listing URLs ending in `-u<id>`

**Fewer fields than expected on a listing**

- Some fields are only available in **Detail** mode
- Original price / nearby / estimated rent are carried into Detail only for **By region** and **By search URL** searches

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data. They only extract what has been published publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers. You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### 💬 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

- 🐛 Found a bug? File an issue in the Apify Console Issues tab
- ⭐ Loving the tool? Leave a 5-star review — it helps us build more
- 📧 <apify@sian-agency.online>
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

**🎯 Not sure which tier you need?** Start with FREE — no credit card required. Upgrade when you're ready to scale!

*FazWaz™ is a trademark of its respective owner. This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by FazWaz. Use it responsibly and in line with applicable terms and laws.*

# Actor input Schema

## `scrapeMode` (type: `string`):

How deep to scrape each listing.

- **Overview** = fast price/spec scan straight from search-result cards (no detail-page visits, ~30 listings per fetch). Best for sizing a market cheaply.
- **Detail** = everything Overview returns PLUS the full per-listing record (description, photos, GPS coordinates, ownership, furnishing, developer, completion, amenities…) — a strict superset.

## `searchMode` (type: `string`):

How to choose which listings to scrape. Fill in the matching section below.

- **By region** — pick provinces + sale/rent (the default).
- **By search URL** — paste a FazWaz search-results URL.
- **By listing URL** — paste specific listing URLs (Detail mode only).

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

Maximum listings to return this run. The free tier is capped at 25.

## `provinces` (type: `array`):

Thai provinces to scrape when Search mode = **By region** (e.g. phuket, bangkok, chiang-mai, pattaya, koh-samui, hua-hin). Add as many as you like.

## `operation` (type: `string`):

Which side of the market to scrape (used with By region).

## `searchUrl` (type: `string`):

Paste a single FazWaz **search-results** URL (used when Search mode = By search URL). Any filters baked into the URL are kept; pagination is automatic. For several URLs at once, use **Search URLs** below instead.

**Example:** `https://www.fazwaz.com/property-for-sale/thailand/phuket`

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

Paste one or more FazWaz **search-results** URLs (used when Search mode = By search URL). Each URL is paged through and the results are merged with duplicates removed — e.g. combine Phuket sale + Bangkok rent + a typed villa search in a single run. **Max results is spread evenly across all the URLs**, so each contributes its share. Filters baked into each URL are kept. You can mix this with the single Search URL above.

## `listingUrls` (type: `array`):

Specific FazWaz **listing** URLs to scrape (used when Search mode = By listing URL; **Detail mode only**). Add one URL per line.

**Example:** `https://www.fazwaz.com/property-sales/2-bedroom-condo-for-sale-at-supalai-city-resort-phuket-in-ratsada-phuket-u5350611`

## `sortBy` (type: `string`):

Result order. Applies to **By region** and **By search URL**. Recommended = FazWaz default ranking.

## `propertyTypes` (type: `array`):

Filter by property type (By region only). Leave empty for all types.

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

Minimum price in Thai Baht (By region only). Leave empty for no minimum.

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

Maximum price in Thai Baht (By region only). Leave empty for no maximum.

## `bedrooms` (type: `array`):

Bedroom counts to include (By region only). Pick any combination; leave empty for any.

## `bathrooms` (type: `array`):

Bathroom counts to include (By region only). Pick any combination; leave empty for any.

## `completionStatus` (type: `string`):

Build status filter (By region only). All = both off-plan and completed.

## Actor input object example

```json
{
  "scrapeMode": "overview",
  "searchMode": "byRegion",
  "maxResults": 100,
  "provinces": [
    "phuket",
    "bangkok"
  ],
  "operation": "sale",
  "searchUrl": "https://www.fazwaz.com/property-for-sale/thailand/phuket",
  "searchUrls": [
    "https://www.fazwaz.com/property-for-sale/thailand/phuket",
    "https://www.fazwaz.com/villa-for-rent/thailand/bangkok"
  ],
  "listingUrls": [
    "https://www.fazwaz.com/property-sales/2-bedroom-condo-for-sale-at-supalai-city-resort-phuket-in-ratsada-phuket-u5350611"
  ],
  "sortBy": "recommended",
  "completionStatus": "all"
}
```

# Actor output Schema

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

Scraped FazWaz listings.

## `htmlReport` (type: `string`):

Human-readable HTML run summary.

# 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 = {
    "provinces": [
        "phuket",
        "bangkok"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/fazwaz-property-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 = { "provinces": [
        "phuket",
        "bangkok",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/fazwaz-property-scraper").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 '{
  "provinces": [
    "phuket",
    "bangkok"
  ]
}' |
apify call sian.agency/fazwaz-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=sian.agency/fazwaz-property-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Fazwaz Thailand Property Scraper — Sale & Rent",
        "description": "Scrape Thai real-estate listings from FazWaz — sale & rent across Phuket, Bangkok & all Thailand, as clean JSON/CSV. Choose a fast overview scan or full detail (photos, GPS, ownership, rental yield, price-per-sqm). Search by region, search URL, or specific listing URLs.",
        "version": "1.0",
        "x-build-id": "tAJeacgqczsfDCcn0"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~fazwaz-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-fazwaz-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/sian.agency~fazwaz-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-fazwaz-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/sian.agency~fazwaz-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-fazwaz-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "scrapeMode": {
                        "title": "🧭 Scrape mode",
                        "enum": [
                            "overview",
                            "detail"
                        ],
                        "type": "string",
                        "description": "How deep to scrape each listing.\n\n- **Overview** = fast price/spec scan straight from search-result cards (no detail-page visits, ~30 listings per fetch). Best for sizing a market cheaply.\n- **Detail** = everything Overview returns PLUS the full per-listing record (description, photos, GPS coordinates, ownership, furnishing, developer, completion, amenities…) — a strict superset.",
                        "default": "overview"
                    },
                    "searchMode": {
                        "title": "🔎 Search mode",
                        "enum": [
                            "byRegion",
                            "bySearchUrl",
                            "byListingUrl"
                        ],
                        "type": "string",
                        "description": "How to choose which listings to scrape. Fill in the matching section below.\n\n- **By region** — pick provinces + sale/rent (the default).\n- **By search URL** — paste a FazWaz search-results URL.\n- **By listing URL** — paste specific listing URLs (Detail mode only).",
                        "default": "byRegion"
                    },
                    "maxResults": {
                        "title": "🔢 Max results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum listings to return this run. The free tier is capped at 25.",
                        "default": 100
                    },
                    "provinces": {
                        "title": "📍 Provinces",
                        "type": "array",
                        "description": "Thai provinces to scrape when Search mode = **By region** (e.g. phuket, bangkok, chiang-mai, pattaya, koh-samui, hua-hin). Add as many as you like.",
                        "default": [
                            "phuket",
                            "bangkok"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "operation": {
                        "title": "🏠 Sale or rent",
                        "enum": [
                            "sale",
                            "rent"
                        ],
                        "type": "string",
                        "description": "Which side of the market to scrape (used with By region).",
                        "default": "sale"
                    },
                    "searchUrl": {
                        "title": "🔗 Search URL",
                        "type": "string",
                        "description": "Paste a single FazWaz **search-results** URL (used when Search mode = By search URL). Any filters baked into the URL are kept; pagination is automatic. For several URLs at once, use **Search URLs** below instead.\n\n**Example:** `https://www.fazwaz.com/property-for-sale/thailand/phuket`"
                    },
                    "searchUrls": {
                        "title": "🔗 Search URLs (multiple)",
                        "type": "array",
                        "description": "Paste one or more FazWaz **search-results** URLs (used when Search mode = By search URL). Each URL is paged through and the results are merged with duplicates removed — e.g. combine Phuket sale + Bangkok rent + a typed villa search in a single run. **Max results is spread evenly across all the URLs**, so each contributes its share. Filters baked into each URL are kept. You can mix this with the single Search URL above.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "listingUrls": {
                        "title": "🏷️ Listing URLs",
                        "type": "array",
                        "description": "Specific FazWaz **listing** URLs to scrape (used when Search mode = By listing URL; **Detail mode only**). Add one URL per line.\n\n**Example:** `https://www.fazwaz.com/property-sales/2-bedroom-condo-for-sale-at-supalai-city-resort-phuket-in-ratsada-phuket-u5350611`",
                        "items": {
                            "type": "string"
                        }
                    },
                    "sortBy": {
                        "title": "↕️ Sort by",
                        "enum": [
                            "recommended",
                            "newest",
                            "price_asc",
                            "price_desc"
                        ],
                        "type": "string",
                        "description": "Result order. Applies to **By region** and **By search URL**. Recommended = FazWaz default ranking.",
                        "default": "recommended"
                    },
                    "propertyTypes": {
                        "title": "🏘️ Property types",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Filter by property type (By region only). Leave empty for all types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "condo",
                                "villa",
                                "house",
                                "townhouse",
                                "apartment",
                                "penthouse",
                                "land"
                            ],
                            "enumTitles": [
                                "Condo",
                                "Villa",
                                "House",
                                "Townhouse",
                                "Apartment",
                                "Penthouse",
                                "Land"
                            ]
                        }
                    },
                    "minPrice": {
                        "title": "💰 Min price (THB)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum price in Thai Baht (By region only). Leave empty for no minimum."
                    },
                    "maxPrice": {
                        "title": "💰 Max price (THB)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum price in Thai Baht (By region only). Leave empty for no maximum."
                    },
                    "bedrooms": {
                        "title": "🛏️ Bedrooms",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Bedroom counts to include (By region only). Pick any combination; leave empty for any.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "0",
                                "1",
                                "2",
                                "3",
                                "4"
                            ],
                            "enumTitles": [
                                "Studio (0)",
                                "1",
                                "2",
                                "3",
                                "4+"
                            ]
                        }
                    },
                    "bathrooms": {
                        "title": "🛁 Bathrooms",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Bathroom counts to include (By region only). Pick any combination; leave empty for any.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "2",
                                "3",
                                "4"
                            ],
                            "enumTitles": [
                                "1",
                                "2",
                                "3",
                                "4+"
                            ]
                        }
                    },
                    "completionStatus": {
                        "title": "🏗️ Completion status",
                        "enum": [
                            "all",
                            "off_plan",
                            "completed"
                        ],
                        "type": "string",
                        "description": "Build status filter (By region only). All = both off-plan and completed.",
                        "default": "all"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
