# DDProperty TH $1💰 Powerful Filters + Deep Search (`abotapi/ddproperty-scraper`) Actor

From $1/1K. Extract property listings from ddproperty.com Thailand at scale. Get comprehensive data including prices, features, images, agent contacts, coordinates, nearby transit (BTS/MRT), and more. Perfect for Thai real estate analytics, market research, and investment analysis.

- **URL**: https://apify.com/abotapi/ddproperty-scraper.md
- **Developed by:** [AbotAPI](https://apify.com/abotapi) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 17 total users, 6 monthly users, 91.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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/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

## DDProperty Thailand Scraper

Extract property listings from **ddproperty.com** (PropertyGuru Thailand) at scale. Get comprehensive data including prices, features, images, agent contacts, coordinates, nearby transit (BTS/MRT), and more. Perfect for Thai property market analytics, research, and investment analysis.

### What does DDProperty Scraper do?

This Apify Actor scrapes property listings from ddproperty.com. It extracts full listing data from search result pages and automatically enriches every listing with exact coordinates via the PropertyGuru Map Cluster API, so no individual page visits are required.

#### Key Features

| Feature | Description |
|---------|-------------|
| **All Listing Types** | For Sale and For Rent properties across Thailand |
| **Property Type Filters** | Condos, Houses, Villas, Townhouses, Land, Apartments, Commercial |
| **Price & Bedroom Filters** | Narrow results by price range (THB) and bedrooms |
| **Location Filters** | Filter by region (Bangkok, Phuket, Chiang Mai, Pattaya, etc.) |
| **Exact Coordinates** | Lat/lng for every listing via PropertyGuru Map Cluster API (no detail page visits) |
| **MRT/BTS Fallback** | Remaining listings enriched with nearest transit station coordinates (253 stations) |
| **Multiple Dataset Views** | Overview, Map View, Detailed, Agent Contacts |
| **Pagination** | Multi-page scraping with automatic retry on blocked pages |

### What data can you extract?

The scraper extracts 30+ fields per listing:

<table>
<tr><td>

**Property Details**
- Listing ID & URL
- Title & full address
- Property type (Condo, House, Villa, etc.)
- Bedrooms & bathrooms
- Floor area & land area
- Tenure (Freehold/Leasehold)
- Badges (New Project, Built year, etc.)

</td><td>

**Pricing**
- Price (THB numeric value)
- Formatted price (e.g. "฿12,990,000")
- Price per sqm
- Listing type (Sale/Rent)

</td></tr>
<tr><td>

**Location & Transit**
- Latitude & longitude (exact, from Map Cluster API)
- Region, district, area (with codes)
- Nearest MRT/BTS station name & line
- Distance to nearest station
- Location source indicator

</td><td>

**Agent & Developer**
- Agent name & ID
- Agency ID
- Developer name
- Is developer listing flag

</td></tr>
<tr><td>

**Media**
- Property images (up to 10 per listing)
- Image count

</td><td>

**Dates & Metadata**
- Posted date (text & unix timestamp)
- Recency text
- Listing status (Active, etc.)

</td></tr>
</table>

### Quick Start

Search for condos for sale in Bangkok:

```json
{
  "mode": "search",
  "listing_type": "sale",
  "property_type": "CONDO",
  "region": "TH10",
  "max_properties": 20,
  "max_pages": 3,
  "proxy": { "useApifyProxy": true }
}
````

### How to Use

#### Step 1: Basic search by region

```json
{
  "mode": "search",
  "listing_type": "sale",
  "region": "TH83",
  "max_properties": 50,
  "max_pages": 5,
  "proxy": { "useApifyProxy": true }
}
```

#### Step 2: Filter by property type and price

```json
{
  "mode": "search",
  "listing_type": "rent",
  "property_type": "CONDO",
  "region": "TH10",
  "min_price": 15000,
  "max_price": 50000,
  "bedrooms": 1,
  "max_properties": 100,
  "max_pages": 10,
  "proxy": { "useApifyProxy": true }
}
```

#### Step 3: Scrape specific URLs

```json
{
  "mode": "url",
  "urls": [
    "https://www.ddproperty.com/en/condo-for-sale/in-bangkok-th10",
    "https://www.ddproperty.com/en/property-for-rent/in-phuket-th83"
  ],
  "max_properties": 50,
  "max_pages": 5,
  "proxy": { "useApifyProxy": true }
}
```

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `search` | `search` (build URL from filters) or `url` (use provided URLs) |
| `urls` | array | `[]` | DDProperty search URLs (url mode only) |
| `listing_type` | string | `sale` | `sale` or `rent` |
| `property_type` | string | - | `CONDO`, `BUNG`, `SEMI`, `VIL`, `TOWN`, `LAND`, `APT`, `RET`, `OFF`, `WAR`, `BIZ`, `SHOP` |
| `region` | string | - | Region code (see table below) |
| `min_price` | integer | - | Minimum price in THB |
| `max_price` | integer | - | Maximum price in THB |
| `bedrooms` | integer | - | Number of bedrooms (0 = Studio) |
| `sort` | string | `date` | Sort by: `date`, `price`, `psf` |
| `sort_order` | string | `desc` | `asc` or `desc` |
| `max_properties` | integer | `20` | Max listings to scrape (0 = unlimited) |
| `proxy` | object | - | Proxy configuration (Apify proxy recommended) |

### Region Codes

| Code | Region | Code | Region |
|------|--------|------|--------|
| `TH10` | Bangkok | `TH83` | Phuket |
| `TH11` | Samut Prakan | `TH84` | Surat Thani (Koh Samui) |
| `TH12` | Nonthaburi | `TH77` | Prachuap Khiri Khan (Hua Hin) |
| `TH13` | Pathum Thani | `TH50` | Chiang Mai |
| `TH20` | Chon Buri (Pattaya) | `TH90` | Songkhla |

### Property Type Codes

| Code | Type | Code | Type |
|------|------|------|------|
| `CONDO` | Condo | `LAND` | Land |
| `BUNG` | Single Detached House | `APT` | Apartment |
| `SEMI` | Semi-Detached House | `RET` | Retail Space |
| `VIL` | Villa | `OFF` | Office Space |
| `TOWN` | Townhouse | `SHOP` | Shophouse |

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape — the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record — not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Output Schema

Each scraped listing is returned as a JSON object with the fields shown below. Field names and types are stable across all results; values shown are placeholder examples.

```json
{
  "id": "<integer listing id>",
  "title": "<localized listing title>",
  "address": "<full property address>",
  "listing_type": "sale | rent",
  "property_type": "CONDO | BUNG | SEMI | VIL | TOWN | LAND | APT | RET | OFF | WAR | BIZ | SHOP",
  "price": "<integer THB>",
  "price_formatted": "<formatted THB string, e.g. ฿X,XXX,XXX>",
  "price_per_sqm": "<formatted THB / sqm>",
  "bedrooms": "<integer; 0 = studio>",
  "bathrooms": "<integer>",
  "floor_area": "<sqm, number>",
  "tenure": "Freehold | Leasehold",
  "developer": "<developer name, when applicable>",
  "is_developer_listing": "<boolean>",
  "agent_name": "<agent display name>",
  "agent_id": "<integer>",
  "agency_id": "<integer>",
  "region": "<region label>",
  "region_code": "<TH region code>",
  "district": "<district label>",
  "district_code": "<TH district code>",
  "area": "<area label>",
  "area_code": "<TH area code>",
  "latitude": "<float>",
  "longitude": "<float>",
  "location_source": "nearest_mrt_station | map_api",
  "nearby_mrt": "<descriptive distance to nearest MRT/BTS>",
  "nearby_station_id": "<station id, e.g. BL17>",
  "badges": ["<string>", "..."],
  "posted_date": "<DD MMM YYYY>",
  "posted_unix": "<unix timestamp>",
  "images": ["<image url>", "..."],
  "image_count": "<integer>",
  "url": "<full listing url on ddproperty.com>",
  "status": "<listing status code, e.g. ACT>"
}
```

# Actor input Schema

## `mode` (type: `string`):

Search mode = build URLs from the filters below. URL mode = paste one or more ddproperty.com search URLs (recommended for refined searches; pagination still auto-advances forward from any ?page=N you provide).

## `listing_type` (type: `string`):

sale or rent

## `property_type` (type: `string`):

Filter by property type code

## `search` (type: `string`):

Free-text location search (e.g. 'Sukhumvit', 'Ari', 'Phuket'). Use this OR the region code below, not both. If both are set, this takes priority.

## `region` (type: `string`):

Location code: region (TH10=Bangkok, TH83=Phuket), district (TH1033=Watthana), or area (TH103302=Khlong Tan).

## `min_price` (type: `integer`):

Minimum price in Thai Baht

## `max_price` (type: `integer`):

Maximum price in Thai Baht

## `bedrooms` (type: `integer`):

Number of bedrooms (0=Studio)

## `sort` (type: `string`):

Sort results

## `sort_order` (type: `string`):

Sort direction: ascending or descending

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

One or more ddproperty.com search URLs. Open the site in a browser, refine your search with any filters, then paste the resulting URLs here. Pagination auto-advances forward from each URL - if a URL contains ?page=N, scraping continues from N. In URL mode, the search-mode fields above are ignored.

## `max_properties` (type: `integer`):

Maximum number of properties to scrape (0=unlimited). Caps both Search and URL modes. Pagination stops automatically when this cap is hit or the site runs out of results.

## `enable_detail_pages` (type: `boolean`):

Fetch the per-listing detail page in addition to the search page. Adds latitude/longitude, description, facilities, project info, etc.

## `detail_concurrency` (type: `integer`):

Parallel detail-page fetches. All concurrent requests share one proxy IP, so values above 3 risk per-IP rate limiting.

## `session_ttl_seconds` (type: `integer`):

How long to reuse a single edge session before forcing a refresh.

## `proxy` (type: `object`):

Residential proxy with country=TH is the default and recommended. The session is bound to a single proxy IP and is reused across requests internally.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "listing_type": "sale",
  "sort": "date",
  "sort_order": "desc",
  "urls": [
    "https://www.ddproperty.com/en/property-for-sale/in-bangkok-th10"
  ],
  "max_properties": 20,
  "enable_detail_pages": true,
  "detail_concurrency": 1,
  "session_ttl_seconds": 300,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "TH"
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `listings` (type: `string`):

Individual property listing records with address, price, features, location, and transit data.

## `output` (type: `string`):

Complete output with all properties and run metadata (duration, total scraped, engine).

## `metadata` (type: `string`):

Scraping run metadata including timing, counts, MRT enrichment stats, and configuration.

## `mrt_stations` (type: `string`):

Complete Thai transit station data (12 lines, 253 stations) with coordinates.

# 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 = {
    "mode": "search",
    "urls": [
        "https://www.ddproperty.com/en/property-for-sale/in-bangkok-th10"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "TH"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/ddproperty-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 = {
    "mode": "search",
    "urls": ["https://www.ddproperty.com/en/property-for-sale/in-bangkok-th10"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "TH",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/ddproperty-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 '{
  "mode": "search",
  "urls": [
    "https://www.ddproperty.com/en/property-for-sale/in-bangkok-th10"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "TH"
  }
}' |
apify call abotapi/ddproperty-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "DDProperty TH $1💰 Powerful Filters + Deep Search",
        "description": "From $1/1K. Extract property listings from ddproperty.com Thailand at scale. Get comprehensive data including prices, features, images, agent contacts, coordinates, nearby transit (BTS/MRT), and more. Perfect for Thai real estate analytics, market research, and investment analysis.",
        "version": "2.0",
        "x-build-id": "nxnCt0Str6Mc9Hc4y"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/abotapi~ddproperty-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-abotapi-ddproperty-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/abotapi~ddproperty-scraper/runs": {
            "post": {
                "operationId": "runs-sync-abotapi-ddproperty-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/abotapi~ddproperty-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-abotapi-ddproperty-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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "1. Search mode",
                        "enum": [
                            "search",
                            "url"
                        ],
                        "type": "string",
                        "description": "Search mode = build URLs from the filters below. URL mode = paste one or more ddproperty.com search URLs (recommended for refined searches; pagination still auto-advances forward from any ?page=N you provide)."
                    },
                    "listing_type": {
                        "title": "Listing type (Search mode)",
                        "enum": [
                            "sale",
                            "rent"
                        ],
                        "type": "string",
                        "description": "sale or rent",
                        "default": "sale"
                    },
                    "property_type": {
                        "title": "Property type (Search mode)",
                        "enum": [
                            "CONDO",
                            "BUNG",
                            "SEMI",
                            "VIL",
                            "TOWN",
                            "LAND",
                            "APT",
                            "RET",
                            "OFF",
                            "WAR",
                            "BIZ",
                            "SHOP"
                        ],
                        "type": "string",
                        "description": "Filter by property type code"
                    },
                    "search": {
                        "title": "Location search (Search mode)",
                        "type": "string",
                        "description": "Free-text location search (e.g. 'Sukhumvit', 'Ari', 'Phuket'). Use this OR the region code below, not both. If both are set, this takes priority."
                    },
                    "region": {
                        "title": "Region / district / area code (Search mode)",
                        "type": "string",
                        "description": "Location code: region (TH10=Bangkok, TH83=Phuket), district (TH1033=Watthana), or area (TH103302=Khlong Tan)."
                    },
                    "min_price": {
                        "title": "Min price (THB) (Search mode)",
                        "type": "integer",
                        "description": "Minimum price in Thai Baht"
                    },
                    "max_price": {
                        "title": "Max price (THB) (Search mode)",
                        "type": "integer",
                        "description": "Maximum price in Thai Baht"
                    },
                    "bedrooms": {
                        "title": "Bedrooms (Search mode)",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Number of bedrooms (0=Studio)"
                    },
                    "sort": {
                        "title": "Sort by (Search mode)",
                        "enum": [
                            "date",
                            "price",
                            "psf"
                        ],
                        "type": "string",
                        "description": "Sort results",
                        "default": "date"
                    },
                    "sort_order": {
                        "title": "Sort order (Search mode)",
                        "enum": [
                            "asc",
                            "desc"
                        ],
                        "type": "string",
                        "description": "Sort direction: ascending or descending",
                        "default": "desc"
                    },
                    "urls": {
                        "title": "Search URLs (URL mode)",
                        "type": "array",
                        "description": "One or more ddproperty.com search URLs. Open the site in a browser, refine your search with any filters, then paste the resulting URLs here. Pagination auto-advances forward from each URL - if a URL contains ?page=N, scraping continues from N. In URL mode, the search-mode fields above are ignored.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "max_properties": {
                        "title": "Max properties",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of properties to scrape (0=unlimited). Caps both Search and URL modes. Pagination stops automatically when this cap is hit or the site runs out of results.",
                        "default": 20
                    },
                    "enable_detail_pages": {
                        "title": "Fetch detail pages",
                        "type": "boolean",
                        "description": "Fetch the per-listing detail page in addition to the search page. Adds latitude/longitude, description, facilities, project info, etc.",
                        "default": true
                    },
                    "detail_concurrency": {
                        "title": "Detail page concurrency",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Parallel detail-page fetches. All concurrent requests share one proxy IP, so values above 3 risk per-IP rate limiting.",
                        "default": 1
                    },
                    "session_ttl_seconds": {
                        "title": "Session TTL (seconds)",
                        "minimum": 60,
                        "maximum": 1800,
                        "type": "integer",
                        "description": "How long to reuse a single edge session before forcing a refresh.",
                        "default": 300
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Residential proxy with country=TH is the default and recommended. The session is bound to a single proxy IP and is reused across requests internally."
                    },
                    "mcpConnectors": {
                        "title": "Pipe results into your apps (optional)",
                        "type": "array",
                        "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
                    },
                    "notionParentPageUrl": {
                        "title": "Notion parent page (Notion connector only)",
                        "type": "string",
                        "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
                    },
                    "maxNotifyListings": {
                        "title": "Max items to export per connector",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Cap on items written to each connector per run. Does not affect the dataset.",
                        "default": 50
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
