{
  "data": {
    "id": "kwbxpYc5tzwT77tX5",
    "actId": "qPkm9zhap3uCleMSt",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-11-11T11:42:45.481Z",
    "finishedAt": "2026-11-11T11:42:55.957Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 10401,
      "runTimeSecs": 10.401,
      "computeUnits": 0.011556666666666666,
      "imageSizeBytes": 358519808
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"PropertyGuru & DDProperty Scraper Input\",\n  \"description\": \"Search Singapore, Malaysia and Thailand property listings, or paste search, listing and project URLs. Filters, detail enrichment and listing limits are controlled here.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"Search listings by filters, or scrape specific search, listing and project URLs.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"byUrl\"\n      ],\n      \"enumTitles\": [\n        \"Search listings by filters\",\n        \"Scrape these URLs\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"search\"\n    },\n    \"country\": {\n      \"title\": \"Country\",\n      \"type\": \"string\",\n      \"description\": \"Market to search (mode=search). Singapore and Malaysia use PropertyGuru; Thailand uses DDProperty.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"SG\",\n        \"MY\",\n        \"TH\"\n      ],\n      \"enumTitles\": [\n        \"Singapore (PropertyGuru)\",\n        \"Malaysia (PropertyGuru)\",\n        \"Thailand (DDProperty)\"\n      ],\n      \"default\": \"SG\",\n      \"prefill\": \"SG\"\n    },\n    \"listingType\": {\n      \"title\": \"Listing type\",\n      \"type\": \"string\",\n      \"description\": \"Sale or rental listings (mode=search).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"sale\",\n        \"rent\"\n      ],\n      \"enumTitles\": [\n        \"For sale\",\n        \"For rent\"\n      ],\n      \"default\": \"sale\",\n      \"prefill\": \"sale\"\n    },\n    \"searchQuery\": {\n      \"title\": \"Keyword or area\",\n      \"type\": \"string\",\n      \"description\": \"Free-text area, project, MRT station or keyword, for example 'Thomson', 'Mont Kiara' or 'Sukhumvit' (mode=search).\",\n      \"editor\": \"textfield\"\n    },\n    \"propertyType\": {\n      \"title\": \"Property type\",\n      \"type\": \"string\",\n      \"description\": \"Filter by property type (mode=search). Types a market does not have are ignored with a status note.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"condo\",\n        \"apartment\",\n        \"hdb\",\n        \"landed\",\n        \"bungalow\",\n        \"semiDetached\",\n        \"terrace\",\n        \"land\",\n        \"commercial\"\n      ],\n      \"enumTitles\": [\n        \"Any type\",\n        \"Condominium\",\n        \"Apartment\",\n        \"HDB flat (Singapore)\",\n        \"Landed house\",\n        \"Bungalow\",\n        \"Semi-detached house\",\n        \"Terrace house\",\n        \"Land\",\n        \"Commercial\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"district\": {\n      \"title\": \"Singapore district\",\n      \"type\": \"string\",\n      \"description\": \"Filter by Singapore district D01-D28 (mode=search). Ignored for Malaysia and Thailand.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"D01\",\n        \"D02\",\n        \"D03\",\n        \"D04\",\n        \"D05\",\n        \"D06\",\n        \"D07\",\n        \"D08\",\n        \"D09\",\n        \"D10\",\n        \"D11\",\n        \"D12\",\n        \"D13\",\n        \"D14\",\n        \"D15\",\n        \"D16\",\n        \"D17\",\n        \"D18\",\n        \"D19\",\n        \"D20\",\n        \"D21\",\n        \"D22\",\n        \"D23\",\n        \"D24\",\n        \"D25\",\n        \"D26\",\n        \"D27\",\n        \"D28\"\n      ],\n      \"enumTitles\": [\n        \"Any district\",\n        \"D01 Boat Quay / Raffles Place / Marina\",\n        \"D02 Chinatown / Tanjong Pagar\",\n        \"D03 Alexandra / Commonwealth\",\n        \"D04 Harbourfront / Telok Blangah\",\n        \"D05 Buona Vista / West Coast / Clementi\",\n        \"D06 City Hall / Clarke Quay\",\n        \"D07 Beach Road / Bugis / Rochor\",\n        \"D08 Farrer Park / Serangoon Road\",\n        \"D09 Orchard / River Valley\",\n        \"D10 Tanglin / Holland / Bukit Timah\",\n        \"D11 Newton / Novena\",\n        \"D12 Balestier / Toa Payoh\",\n        \"D13 Macpherson / Potong Pasir\",\n        \"D14 Eunos / Geylang / Paya Lebar\",\n        \"D15 East Coast / Marine Parade\",\n        \"D16 Bedok / Upper East Coast\",\n        \"D17 Changi Airport / Changi Village\",\n        \"D18 Pasir Ris / Tampines\",\n        \"D19 Hougang / Punggol / Sengkang\",\n        \"D20 Ang Mo Kio / Bishan / Thomson\",\n        \"D21 Clementi Park / Upper Bukit Timah\",\n        \"D22 Boon Lay / Jurong / Tuas\",\n        \"D23 Dairy Farm / Bukit Panjang / Choa Chu Kang\",\n        \"D24 Lim Chu Kang / Tengah\",\n        \"D25 Admiralty / Woodlands\",\n        \"D26 Mandai / Upper Thomson\",\n        \"D27 Sembawang / Yishun\",\n        \"D28 Seletar / Yio Chu Kang\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"minPrice\": {\n      \"title\": \"Minimum price\",\n      \"type\": \"integer\",\n      \"description\": \"Minimum asking price in the market's local currency (SGD, MYR or THB).\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000\n    },\n    \"maxPrice\": {\n      \"title\": \"Maximum price\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum asking price in the market's local currency (SGD, MYR or THB).\",\n      \"minimum\": 0,\n      \"maximum\": 1000000000\n    },\n    \"bedrooms\": {\n      \"title\": \"Bedrooms\",\n      \"type\": \"array\",\n      \"description\": \"Return any of these exact bedroom counts. 0 means studio. Leave empty for all.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"0\",\n          \"1\",\n          \"2\",\n          \"3\",\n          \"4\",\n          \"5\"\n        ],\n        \"enumTitles\": [\n          \"Studio\",\n          \"1 bedroom\",\n          \"2 bedrooms\",\n          \"3 bedrooms\",\n          \"4 bedrooms\",\n          \"5+ bedrooms\"\n        ]\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"bathrooms\": {\n      \"title\": \"Bathrooms\",\n      \"type\": \"array\",\n      \"description\": \"Return any of these exact bathroom counts. Leave empty for all.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"1\",\n          \"2\",\n          \"3\",\n          \"4\",\n          \"5\"\n        ],\n        \"enumTitles\": [\n          \"1 bathroom\",\n          \"2 bathrooms\",\n          \"3 bathrooms\",\n          \"4 bathrooms\",\n          \"5+ bathrooms\"\n        ]\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"minSize\": {\n      \"title\": \"Minimum floor area\",\n      \"type\": \"integer\",\n      \"description\": \"Minimum floor area in square feet for Singapore and Malaysia, square metres for Thailand.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000\n    },\n    \"maxSize\": {\n      \"title\": \"Maximum floor area\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum floor area in square feet for Singapore and Malaysia, square metres for Thailand.\",\n      \"minimum\": 0,\n      \"maximum\": 1000000\n    },\n    \"tenure\": {\n      \"title\": \"Tenure\",\n      \"type\": \"string\",\n      \"description\": \"Freehold or leasehold (mode=search, sale only).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"freehold\",\n        \"leasehold\"\n      ],\n      \"enumTitles\": [\n        \"Any tenure\",\n        \"Freehold\",\n        \"Leasehold\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"furnishing\": {\n      \"title\": \"Furnishing\",\n      \"type\": \"string\",\n      \"description\": \"Furnishing level of the property (mode=search).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"unfurnished\",\n        \"partially\",\n        \"fully\"\n      ],\n      \"enumTitles\": [\n        \"Any furnishing\",\n        \"Unfurnished\",\n        \"Partially furnished\",\n        \"Fully furnished\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"floorLevel\": {\n      \"title\": \"Floor level\",\n      \"type\": \"string\",\n      \"description\": \"Floor level of the unit (mode=search).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"ground\",\n        \"low\",\n        \"mid\",\n        \"high\",\n        \"penthouse\"\n      ],\n      \"enumTitles\": [\n        \"Any floor\",\n        \"Ground floor\",\n        \"Low floor\",\n        \"Mid floor\",\n        \"High floor\",\n        \"Penthouse\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"availability\": {\n      \"title\": \"Available from\",\n      \"type\": \"string\",\n      \"description\": \"Move-in availability (mode=search, rent only).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"immediate\",\n        \"within1Month\",\n        \"oneToTwoMonths\",\n        \"twoToThreeMonths\",\n        \"afterThreeMonths\"\n      ],\n      \"enumTitles\": [\n        \"Any availability\",\n        \"Immediately\",\n        \"Within 1 month\",\n        \"1-2 months\",\n        \"2-3 months\",\n        \"After 3 months\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"maxDistanceToMrt\": {\n      \"title\": \"Maximum distance to MRT\",\n      \"type\": \"string\",\n      \"description\": \"Maximum walking distance to an MRT/LRT station (Singapore and Thailand).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"250m\",\n        \"500m\",\n        \"750m\",\n        \"1km\",\n        \"1.5km\"\n      ],\n      \"enumTitles\": [\n        \"Any distance\",\n        \"Under 250 m\",\n        \"Under 500 m\",\n        \"Under 750 m\",\n        \"Under 1 km\",\n        \"Under 1.5 km\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"sort\": {\n      \"title\": \"Sort order\",\n      \"type\": \"string\",\n      \"description\": \"Order of the results (mode=search).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"recommended\",\n        \"newest\",\n        \"priceAsc\",\n        \"priceDesc\",\n        \"psfAsc\",\n        \"psfDesc\",\n        \"sizeAsc\",\n        \"sizeDesc\"\n      ],\n      \"enumTitles\": [\n        \"Recommended\",\n        \"Newest first\",\n        \"Price: low to high\",\n        \"Price: high to low\",\n        \"Price per area: low to high\",\n        \"Price per area: high to low\",\n        \"Size: low to high\",\n        \"Size: high to low\"\n      ],\n      \"default\": \"recommended\",\n      \"prefill\": \"recommended\"\n    },\n    \"maxItems\": {\n      \"title\": \"Maximum listings\",\n      \"type\": \"integer\",\n      \"description\": \"Stop after this many listings.\",\n      \"minimum\": 1,\n      \"maximum\": 100000,\n      \"default\": 100,\n      \"prefill\": 2\n    },\n    \"maxPages\": {\n      \"title\": \"Maximum search pages\",\n      \"type\": \"integer\",\n      \"description\": \"Stop after this many search-result pages. The site's own last page also stops the run.\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"default\": 50,\n      \"prefill\": 1\n    },\n    \"includeDetails\": {\n      \"title\": \"Include detail enrichment\",\n      \"type\": \"boolean\",\n      \"description\": \"Open each listing page for description, agent mobile, coordinates, transit, schools, amenities and media. One extra request per listing.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"startUrls\": {\n      \"title\": \"Search, listing or project URLs\",\n      \"type\": \"array\",\n      \"description\": \"Paste PropertyGuru SG/MY or DDProperty TH search-result, listing or project URLs (mode=byUrl).\",\n      \"editor\": \"requestListSources\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"url\": {\n            \"type\": \"string\",\n            \"title\": \"URL\",\n            \"description\": \"PropertyGuru or DDProperty URL.\"\n          }\n        }\n      },\n      \"default\": [],\n      \"prefill\": []\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# PropertyGuru & DDProperty Listings Scraper\n\nCollect property listings from Singapore and Malaysia on PropertyGuru and from Thailand on DDProperty. Search by keyword, property type, district, price, bedrooms, bathrooms, size, tenure, furnishing, floor level, availability, MRT distance and sort order, or paste search, listing and project URLs. Every record keeps the source's price label, area unit and contact details instead of flattening them.\n\n## What it does\n\n- **Three live markets** — Singapore (`propertyguru.com.sg`), Malaysia (`propertyguru.com.my`) and Thailand (`ddproperty.com/en`) with local currencies and area units.\n- **Filter-first search** — keyword or area, sale or rent, property type, Singapore district D01-D28, price, exact bedroom and bathroom chips, floor size, tenure, furnishing, floor level, move-in availability, MRT distance and eight sort orders.\n- **Paste any URL** — search-result URLs paginate, listing URLs return one detailed record, project URLs include the project's unit types. The market is inferred from the host.\n- **Optional detail enrichment** — opens each listing page for the description, agent mobile, licence, rating, agency, coordinates, nearby transit and schools, amenities, facilities, floor plans, videos and virtual tours.\n- **Project and new-launch aware** — reads unit-level prices, bedroom and bathroom counts, floor-area ranges and floor plans; development contact replaces agent contact where the source publishes a developer instead of an agent.\n- **Deep pagination with deduplication** — follows the site's own page count until your item or page limit, and removes repeated promoted cards.\n\n## Output per listing\n\n| Group | Fields |\n|---|---|\n| Identity | `recordType` (`listing` or `project`), `listingId`, `title`, `listingUrl`, `transactionType`, `country`, `sourceDomain`, `sourceUrl`, `sourcePage`, `statusCode`, `listerType`, `accountType` |\n| Price | `price`, `priceText`, `priceType`, `priceMin`, `priceMax`, `currency`, `pricePerSqft`, `pricePerSqm`, `pricePerArea`, `pricePerAreaUnit` |\n| Property | `propertyType`, `propertyTypeCode`, `propertyTypeGroup`, `bedrooms`, `bathrooms`, `floorArea`, `floorAreaUnit`, `floorAreaSqft`, `floorAreaSqm`, `landArea`, `landAreaUnit`, `landAreaSqft`, `landAreaSqm`, `tenure`, `tenureCode`, `completionYear`, `furnishing`, `floorLevel`, `availability`, `isNewProject`, `isVerified`, `isOfficialListing`, `isDeveloperListing` |\n| Project | `projectName`, `projectId`, `projectUrl`, `developer`, `developerUrl`, `developerWhatsapp`, `unitTypes` |\n| Location | `address`, `fullAddress`, `shortAddress`, `streetName`, `district`, `districtCode`, `region`, `regionCode`, `postalCode`, `latitude`, `longitude` |\n| Nearby | `nearbyMrt`, `nearestTransit`, `nearbySchools` |\n| Contact | `agentId`, `agentName`, `agentProfileUrl`, `agentLicense`, `agentVerified`, `agentJobTitle`, `agentMobile`, `agentRating`, `agentReviewCount`, `agencyName`, `agencyId` |\n| Media | `imageUrls`, `imageCount`, `thumbnailUrl`, `floorPlanUrls`, `videoUrls`, `virtualTourUrls` |\n| Detail | `headline`, `description`, `amenities`, `facilities`, `highlights` |\n| Provenance | `accessMethod`, `detailAccessMethod`, `dataFreshness`, `archiveTimestamp`, `archiveAgeDays` |\n| Dates | `postedOn`, `postedOnUnix`, `recency`, `scrapedAt` |\n\nEmpty fields are omitted from each record instead of being returned as null. `area` is kept as an alias of `floorArea` for compatibility with older datasets.\n\n### How the data is accessed\n\nEvery request is cookieless. The actor reads the marketplace's public Next.js data route and public listing/project pages with the same headers a browser sends; no account, cookie, API key or proxy setup is needed. When a new site release changes the Next.js build id, the actor repairs it from the site's own 404 response and retries. If the origin still challenges a request, the actor tries Google Translate's live mirror and then the Wayback Machine. Archived responses are always labelled: `accessMethod` is `nextjsData`, `directHtml`, `translateMirror` or `wayback`, and `dataFreshness` is `live` or `staleArchive`. Wayback snapshots older than 90 days for search pages or 180 days for detail pages are rejected, and the accepted snapshot time is written to `archiveTimestamp` with its age in `archiveAgeDays`.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select, required | `search` | Search by filters, or scrape pasted URLs. |\n| `country` | select | `SG` | `SG`, `MY` or `TH` (mode=search). |\n| `listingType` | select | `sale` | Sale or rent. |\n| `searchQuery` | text | – | Area, project, station or keyword. |\n| `propertyType` | select | `any` | Condo, apartment, HDB, landed, bungalow, semi-detached, terrace, land or commercial. |\n| `district` | select | `any` | Singapore district D01-D28. |\n| `minPrice` / `maxPrice` | integer | – | Price range in SGD, MYR or THB. |\n| `bedrooms` | multi-select | – | Studio (0) through 5+. |\n| `bathrooms` | multi-select | – | 1 through 5+. |\n| `minSize` / `maxSize` | integer | – | Floor area in sqft (SG/MY) or sqm (TH). |\n| `tenure` | select | `any` | Freehold or leasehold (sale only). |\n| `furnishing` | select | `any` | Unfurnished, partially or fully furnished. |\n| `floorLevel` | select | `any` | Ground, low, mid, high or penthouse. |\n| `availability` | select | `any` | Immediate to after three months (rent only). |\n| `maxDistanceToMrt` | select | `any` | 250 m to 1.5 km (SG/TH). |\n| `sort` | select | `recommended` | Newest, price, price per area or size. |\n| `maxItems` | integer | `100` | Stop after this many listings. |\n| `maxPages` | integer | `50` | Stop after this many search pages. |\n| `includeDetails` | boolean | `true` | Enrich each listing with detail-page fields. |\n| `startUrls` | URL list | – | Search, listing or project URLs (mode=byUrl). |\n\n### Example: two-bedroom condos in Singapore District 20\n\n```json\n{\n  \"mode\": \"search\",\n  \"country\": \"SG\",\n  \"listingType\": \"sale\",\n  \"propertyType\": \"condo\",\n  \"district\": \"D20\",\n  \"bedrooms\": [\"2\"],\n  \"maxItems\": 20,\n  \"includeDetails\": true\n}\n```\n\n### Example: rentals in Kuala Lumpur\n\n```json\n{\n  \"mode\": \"search\",\n  \"country\": \"MY\",\n  \"listingType\": \"rent\",\n  \"searchQuery\": \"Mont Kiara\",\n  \"minPrice\": 2000,\n  \"maxPrice\": 6000,\n  \"furnishing\": \"fully\",\n  \"maxItems\": 30\n}\n```\n\n### Example: Bangkok condos near the MRT\n\n```json\n{\n  \"mode\": \"search\",\n  \"country\": \"TH\",\n  \"listingType\": \"sale\",\n  \"propertyType\": \"condo\",\n  \"searchQuery\": \"Sukhumvit\",\n  \"maxDistanceToMrt\": \"500m\",\n  \"sort\": \"priceAsc\",\n  \"maxItems\": 20\n}\n```\n\n### Example: paste a search page and a project page\n\n```json\n{\n  \"mode\": \"byUrl\",\n  \"startUrls\": [\n    { \"url\": \"https://www.propertyguru.com.sg/property-for-sale?district_code=D09\" },\n    { \"url\": \"https://www.propertyguru.com.my/property-listing/project/enlace-suite-ii-for-sale-by-amona-development-sdn-bhd-501086101\" }\n  ],\n  \"maxItems\": 50\n}\n```\n\n## Use cases\n\n- **Market comparison** — compare asking prices and price per area across Singapore, Malaysia and Thailand in one dataset.\n- **Lead research** — collect the public agent name, mobile, licence and agency for non-project listings, or the developer contact for project listings.\n- **Investment screening** — combine district, price, size, tenure and MRT filters to shortlist candidates.\n- **New-launch tracking** — follow project pages with unit-level prices, layouts and floor plans.\n- **Listing audits** — re-scrape a saved set of URLs to spot price or availability changes.\n\n## Notes and limitations\n\n- **Indonesia is not available.** The PropertyGuru Indonesia marketplace closed on 2023-11-30, so the actor reports that closure instead of returning empty data.\n- **Thailand uses DDProperty's English site.** That is the live Thai marketplace for this listing data; the old PropertyGuru Thailand domain no longer serves listings.\n- **Agent email is not published.** The actor returns the public agent mobile, licence, profile and rating where the source shows them; it does not invent an email address.\n- **Project pricing is a range or a \"from\" price.** When the source only gives unit ranges, the record carries `priceMin` and `priceMax` plus the source label rather than a made-up single price.\n- **Short links are not supported.** Paste canonical search, listing or project URLs.\n- **Pasted detail pages can be protected.** If a listing or project page is blocked and no archive snapshot exists, but the same id still appears in search, the record is rebuilt from search-card data. Detail-only fields such as the description, amenities and coordinates are then omitted, and the run status reports how many records used this fallback.\n- **Archive fallback is a last resort.** When the origin challenges both the data route and the live pages, the actor may read a recent Wayback snapshot. Search snapshots older than 90 days and detail snapshots older than 180 days are rejected. Archived search pages cannot re-run the site's own keyword or filter engine, so only the locally verifiable filters are applied; `dataFreshness=staleArchive` tells you the row did not come from today's live index. If the archive also rate-limits the run, the actor reports zero items rather than inventing data.\n- **Project units follow the source.** Unit names, prices, bedroom/bathroom counts, floor areas and floor-plan URLs are returned when the project page publishes them. Some projects publish only an overview or price range, in which case the unit array is omitted.\n\n## FAQ\n\n**Is this affiliated with PropertyGuru or DDProperty?**\nNo. This is an independent, third-party actor that reads publicly visible listing pages. It is not operated by or affiliated with either marketplace.\n\n**Do I need an account, cookie or API key?**\nNo. The actor works without credentials or a proxy setup.\n\n**Why is the agent mobile missing on some records?**\nMobile numbers are only published on some listing pages. Project and new-launch listings usually show a developer contact instead, so those records carry developer fields rather than agent fields. Email addresses are not published at all.\n\n**Why does one listing have `price` and another only `priceMin`/`priceMax`?**\nA fixed asking price becomes `price`; a range or a project with several unit prices becomes `priceMin`/`priceMax`. `priceText` always keeps the label shown by the source, including \"Price on ask\" or \"Starting From\".\n\n**Why is `floorAreaUnit` sometimes sqft and sometimes sqm?**\nSingapore and Malaysia publish square feet; Thailand publishes square metres. Both `floorAreaSqft` and `floorAreaSqm` are provided so records from different markets can be compared directly.\n\n**What happens when a filter is not available in a market?**\nThe actor ignores that filter and says so in the run's status message. Singapore districts, for example, do not apply to Malaysia or Thailand.\n\n**How many requests does a run make?**\nOne request per search page. With detail enrichment on, it also makes one request per emitted listing. Turning enrichment off gives the fastest and smallest run.\n\n**Can I scrape more than a few thousand listings?**\nYes. Pagination follows the site's own last page and stops at `maxItems` or `maxPages`; duplicate promoted cards are removed. Very large runs take longer because pages are read at a polite pace.\n\n**Are images and media links usable?**\nYes. Image, floor-plan, video and virtual-tour URLs are absolute links to the source's public media host.\n\n**Who is responsible for how the contact data is used?**\nAgent and developer contact details are personal or business data. You are responsible for using them lawfully in your jurisdiction and for respecting the marketplace's terms.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "southeast-asia-property-listings-by-country",
      "title": "PropertyGuru & DDProperty Listings Scraper",
      "description": "Scrape Singapore, Malaysia and Thailand property listings with keyword, type, district, price, bed, bath, size, tenure, furnishing, floor, availability, MRT and sort filters, plus agent contact, project units, transit, schools and media.",
      "version": "1.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# PropertyGuru & DDProperty Listings Scraper\n\nCollect property listings from Singapore and Malaysia on PropertyGuru and from Thailand on DDProperty. Search by keyword, property type, district, price, bedrooms, bathrooms, size, tenure, furnishing, floor level, availability, MRT distance and sort order, or paste search, listing and project URLs. Every record keeps the source's price label, area unit and contact details instead of flattening them.\n\n## What it does\n\n- **Three live markets** — Singapore (`propertyguru.com.sg`), Malaysia (`propertyguru.com.my`) and Thailand (`ddproperty.com/en`) with local currencies and area units.\n- **Filter-first search** — keyword or area, sale or rent, property type, Singapore district D01-D28, price, exact bedroom and bathroom chips, floor size, tenure, furnishing, floor level, move-in availability, MRT distance and eight sort orders.\n- **Paste any URL** — search-result URLs paginate, listing URLs return one detailed record, project URLs include the project's unit types. The market is inferred from the host.\n- **Optional detail enrichment** — opens each listing page for the description, agent mobile, licence, rating, agency, coordinates, nearby transit and schools, amenities, facilities, floor plans, videos and virtual tours.\n- **Project and new-launch aware** — reads unit-level prices, bedroom and bathroom counts, floor-area ranges and floor plans; development contact replaces agent contact where the source publishes a developer instead of an agent.\n- **Deep pagination with deduplication** — follows the site's own page count until your item or page limit, and removes repeated promoted cards.\n\n## Output per listing\n\n| Group | Fields |\n|---|---|\n| Identity | `recordType` (`listing` or `project`), `listingId`, `title`, `listingUrl`, `transactionType`, `country`, `sourceDomain`, `sourceUrl`, `sourcePage`, `statusCode`, `listerType`, `accountType` |\n| Price | `price`, `priceText`, `priceType`, `priceMin`, `priceMax`, `currency`, `pricePerSqft`, `pricePerSqm`, `pricePerArea`, `pricePerAreaUnit` |\n| Property | `propertyType`, `propertyTypeCode`, `propertyTypeGroup`, `bedrooms`, `bathrooms`, `floorArea`, `floorAreaUnit`, `floorAreaSqft`, `floorAreaSqm`, `landArea`, `landAreaUnit`, `landAreaSqft`, `landAreaSqm`, `tenure`, `tenureCode`, `completionYear`, `furnishing`, `floorLevel`, `availability`, `isNewProject`, `isVerified`, `isOfficialListing`, `isDeveloperListing` |\n| Project | `projectName`, `projectId`, `projectUrl`, `developer`, `developerUrl`, `developerWhatsapp`, `unitTypes` |\n| Location | `address`, `fullAddress`, `shortAddress`, `streetName`, `district`, `districtCode`, `region`, `regionCode`, `postalCode`, `latitude`, `longitude` |\n| Nearby | `nearbyMrt`, `nearestTransit`, `nearbySchools` |\n| Contact | `agentId`, `agentName`, `agentProfileUrl`, `agentLicense`, `agentVerified`, `agentJobTitle`, `agentMobile`, `agentRating`, `agentReviewCount`, `agencyName`, `agencyId` |\n| Media | `imageUrls`, `imageCount`, `thumbnailUrl`, `floorPlanUrls`, `videoUrls`, `virtualTourUrls` |\n| Detail | `headline`, `description`, `amenities`, `facilities`, `highlights` |\n| Provenance | `accessMethod`, `detailAccessMethod`, `dataFreshness`, `archiveTimestamp`, `archiveAgeDays` |\n| Dates | `postedOn`, `postedOnUnix`, `recency`, `scrapedAt` |\n\nEmpty fields are omitted from each record instead of being returned as null. `area` is kept as an alias of `floorArea` for compatibility with older datasets.\n\n### How the data is accessed\n\nEvery request is cookieless. The actor reads the marketplace's public Next.js data route and public listing/project pages with the same headers a browser sends; no account, cookie, API key or proxy setup is needed. When a new site release changes the Next.js build id, the actor repairs it from the site's own 404 response and retries. If the origin still challenges a request, the actor tries Google Translate's live mirror and then the Wayback Machine. Archived responses are always labelled: `accessMethod` is `nextjsData`, `directHtml`, `translateMirror` or `wayback`, and `dataFreshness` is `live` or `staleArchive`. Wayback snapshots older than 90 days for search pages or 180 days for detail pages are rejected, and the accepted snapshot time is written to `archiveTimestamp` with its age in `archiveAgeDays`.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select, required | `search` | Search by filters, or scrape pasted URLs. |\n| `country` | select | `SG` | `SG`, `MY` or `TH` (mode=search). |\n| `listingType` | select | `sale` | Sale or rent. |\n| `searchQuery` | text | – | Area, project, station or keyword. |\n| `propertyType` | select | `any` | Condo, apartment, HDB, landed, bungalow, semi-detached, terrace, land or commercial. |\n| `district` | select | `any` | Singapore district D01-D28. |\n| `minPrice` / `maxPrice` | integer | – | Price range in SGD, MYR or THB. |\n| `bedrooms` | multi-select | – | Studio (0) through 5+. |\n| `bathrooms` | multi-select | – | 1 through 5+. |\n| `minSize` / `maxSize` | integer | – | Floor area in sqft (SG/MY) or sqm (TH). |\n| `tenure` | select | `any` | Freehold or leasehold (sale only). |\n| `furnishing` | select | `any` | Unfurnished, partially or fully furnished. |\n| `floorLevel` | select | `any` | Ground, low, mid, high or penthouse. |\n| `availability` | select | `any` | Immediate to after three months (rent only). |\n| `maxDistanceToMrt` | select | `any` | 250 m to 1.5 km (SG/TH). |\n| `sort` | select | `recommended` | Newest, price, price per area or size. |\n| `maxItems` | integer | `100` | Stop after this many listings. |\n| `maxPages` | integer | `50` | Stop after this many search pages. |\n| `includeDetails` | boolean | `true` | Enrich each listing with detail-page fields. |\n| `startUrls` | URL list | – | Search, listing or project URLs (mode=byUrl). |\n\n### Example: two-bedroom condos in Singapore District 20\n\n```json\n{\n  \"mode\": \"search\",\n  \"country\": \"SG\",\n  \"listingType\": \"sale\",\n  \"propertyType\": \"condo\",\n  \"district\": \"D20\",\n  \"bedrooms\": [\"2\"],\n  \"maxItems\": 20,\n  \"includeDetails\": true\n}\n```\n\n### Example: rentals in Kuala Lumpur\n\n```json\n{\n  \"mode\": \"search\",\n  \"country\": \"MY\",\n  \"listingType\": \"rent\",\n  \"searchQuery\": \"Mont Kiara\",\n  \"minPrice\": 2000,\n  \"maxPrice\": 6000,\n  \"furnishing\": \"fully\",\n  \"maxItems\": 30\n}\n```\n\n### Example: Bangkok condos near the MRT\n\n```json\n{\n  \"mode\": \"search\",\n  \"country\": \"TH\",\n  \"listingType\": \"sale\",\n  \"propertyType\": \"condo\",\n  \"searchQuery\": \"Sukhumvit\",\n  \"maxDistanceToMrt\": \"500m\",\n  \"sort\": \"priceAsc\",\n  \"maxItems\": 20\n}\n```\n\n### Example: paste a search page and a project page\n\n```json\n{\n  \"mode\": \"byUrl\",\n  \"startUrls\": [\n    { \"url\": \"https://www.propertyguru.com.sg/property-for-sale?district_code=D09\" },\n    { \"url\": \"https://www.propertyguru.com.my/property-listing/project/enlace-suite-ii-for-sale-by-amona-development-sdn-bhd-501086101\" }\n  ],\n  \"maxItems\": 50\n}\n```\n\n## Use cases\n\n- **Market comparison** — compare asking prices and price per area across Singapore, Malaysia and Thailand in one dataset.\n- **Lead research** — collect the public agent name, mobile, licence and agency for non-project listings, or the developer contact for project listings.\n- **Investment screening** — combine district, price, size, tenure and MRT filters to shortlist candidates.\n- **New-launch tracking** — follow project pages with unit-level prices, layouts and floor plans.\n- **Listing audits** — re-scrape a saved set of URLs to spot price or availability changes.\n\n## Notes and limitations\n\n- **Indonesia is not available.** The PropertyGuru Indonesia marketplace closed on 2023-11-30, so the actor reports that closure instead of returning empty data.\n- **Thailand uses DDProperty's English site.** That is the live Thai marketplace for this listing data; the old PropertyGuru Thailand domain no longer serves listings.\n- **Agent email is not published.** The actor returns the public agent mobile, licence, profile and rating where the source shows them; it does not invent an email address.\n- **Project pricing is a range or a \"from\" price.** When the source only gives unit ranges, the record carries `priceMin` and `priceMax` plus the source label rather than a made-up single price.\n- **Short links are not supported.** Paste canonical search, listing or project URLs.\n- **Pasted detail pages can be protected.** If a listing or project page is blocked and no archive snapshot exists, but the same id still appears in search, the record is rebuilt from search-card data. Detail-only fields such as the description, amenities and coordinates are then omitted, and the run status reports how many records used this fallback.\n- **Archive fallback is a last resort.** When the origin challenges both the data route and the live pages, the actor may read a recent Wayback snapshot. Search snapshots older than 90 days and detail snapshots older than 180 days are rejected. Archived search pages cannot re-run the site's own keyword or filter engine, so only the locally verifiable filters are applied; `dataFreshness=staleArchive` tells you the row did not come from today's live index. If the archive also rate-limits the run, the actor reports zero items rather than inventing data.\n- **Project units follow the source.** Unit names, prices, bedroom/bathroom counts, floor areas and floor-plan URLs are returned when the project page publishes them. Some projects publish only an overview or price range, in which case the unit array is omitted.\n\n## FAQ\n\n**Is this affiliated with PropertyGuru or DDProperty?**\nNo. This is an independent, third-party actor that reads publicly visible listing pages. It is not operated by or affiliated with either marketplace.\n\n**Do I need an account, cookie or API key?**\nNo. The actor works without credentials or a proxy setup.\n\n**Why is the agent mobile missing on some records?**\nMobile numbers are only published on some listing pages. Project and new-launch listings usually show a developer contact instead, so those records carry developer fields rather than agent fields. Email addresses are not published at all.\n\n**Why does one listing have `price` and another only `priceMin`/`priceMax`?**\nA fixed asking price becomes `price`; a range or a project with several unit prices becomes `priceMin`/`priceMax`. `priceText` always keeps the label shown by the source, including \"Price on ask\" or \"Starting From\".\n\n**Why is `floorAreaUnit` sometimes sqft and sometimes sqm?**\nSingapore and Malaysia publish square feet; Thailand publishes square metres. Both `floorAreaSqft` and `floorAreaSqm` are provided so records from different markets can be compared directly.\n\n**What happens when a filter is not available in a market?**\nThe actor ignores that filter and says so in the run's status message. Singapore districts, for example, do not apply to Malaysia or Thailand.\n\n**How many requests does a run make?**\nOne request per search page. With detail enrichment on, it also makes one request per emitted listing. Turning enrichment off gives the fastest and smallest run.\n\n**Can I scrape more than a few thousand listings?**\nYes. Pagination follows the site's own last page and stops at `maxItems` or `maxPages`; duplicate promoted cards are removed. Very large runs take longer because pages are read at a polite pace.\n\n**Are images and media links usable?**\nYes. Image, floor-plan, video and virtual-tour URLs are absolute links to the source's public media host.\n\n**Who is responsible for how the contact data is used?**\nAgent and developer contact details are personal or business data. You are responsible for using them lawfully in your jurisdiction and for respecting the marketplace's terms.\n",
      "input": {
        "title": "PropertyGuru & DDProperty Scraper Input",
        "description": "Search Singapore, Malaysia and Thailand property listings, or paste search, listing and project URLs. Filters, detail enrichment and listing limits are controlled here.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "Search listings by filters, or scrape specific search, listing and project URLs.",
            "editor": "select",
            "enum": [
              "search",
              "byUrl"
            ],
            "enumTitles": [
              "Search listings by filters",
              "Scrape these URLs"
            ],
            "default": "search",
            "prefill": "search"
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Market to search (mode=search). Singapore and Malaysia use PropertyGuru; Thailand uses DDProperty.",
            "editor": "select",
            "enum": [
              "SG",
              "MY",
              "TH"
            ],
            "enumTitles": [
              "Singapore (PropertyGuru)",
              "Malaysia (PropertyGuru)",
              "Thailand (DDProperty)"
            ],
            "default": "SG",
            "prefill": "SG"
          },
          "listingType": {
            "title": "Listing type",
            "type": "string",
            "description": "Sale or rental listings (mode=search).",
            "editor": "select",
            "enum": [
              "sale",
              "rent"
            ],
            "enumTitles": [
              "For sale",
              "For rent"
            ],
            "default": "sale",
            "prefill": "sale"
          },
          "searchQuery": {
            "title": "Keyword or area",
            "type": "string",
            "description": "Free-text area, project, MRT station or keyword, for example 'Thomson', 'Mont Kiara' or 'Sukhumvit' (mode=search).",
            "editor": "textfield"
          },
          "propertyType": {
            "title": "Property type",
            "type": "string",
            "description": "Filter by property type (mode=search). Types a market does not have are ignored with a status note.",
            "editor": "select",
            "enum": [
              "any",
              "condo",
              "apartment",
              "hdb",
              "landed",
              "bungalow",
              "semiDetached",
              "terrace",
              "land",
              "commercial"
            ],
            "enumTitles": [
              "Any type",
              "Condominium",
              "Apartment",
              "HDB flat (Singapore)",
              "Landed house",
              "Bungalow",
              "Semi-detached house",
              "Terrace house",
              "Land",
              "Commercial"
            ],
            "default": "any",
            "prefill": "any"
          },
          "district": {
            "title": "Singapore district",
            "type": "string",
            "description": "Filter by Singapore district D01-D28 (mode=search). Ignored for Malaysia and Thailand.",
            "editor": "select",
            "enum": [
              "any",
              "D01",
              "D02",
              "D03",
              "D04",
              "D05",
              "D06",
              "D07",
              "D08",
              "D09",
              "D10",
              "D11",
              "D12",
              "D13",
              "D14",
              "D15",
              "D16",
              "D17",
              "D18",
              "D19",
              "D20",
              "D21",
              "D22",
              "D23",
              "D24",
              "D25",
              "D26",
              "D27",
              "D28"
            ],
            "enumTitles": [
              "Any district",
              "D01 Boat Quay / Raffles Place / Marina",
              "D02 Chinatown / Tanjong Pagar",
              "D03 Alexandra / Commonwealth",
              "D04 Harbourfront / Telok Blangah",
              "D05 Buona Vista / West Coast / Clementi",
              "D06 City Hall / Clarke Quay",
              "D07 Beach Road / Bugis / Rochor",
              "D08 Farrer Park / Serangoon Road",
              "D09 Orchard / River Valley",
              "D10 Tanglin / Holland / Bukit Timah",
              "D11 Newton / Novena",
              "D12 Balestier / Toa Payoh",
              "D13 Macpherson / Potong Pasir",
              "D14 Eunos / Geylang / Paya Lebar",
              "D15 East Coast / Marine Parade",
              "D16 Bedok / Upper East Coast",
              "D17 Changi Airport / Changi Village",
              "D18 Pasir Ris / Tampines",
              "D19 Hougang / Punggol / Sengkang",
              "D20 Ang Mo Kio / Bishan / Thomson",
              "D21 Clementi Park / Upper Bukit Timah",
              "D22 Boon Lay / Jurong / Tuas",
              "D23 Dairy Farm / Bukit Panjang / Choa Chu Kang",
              "D24 Lim Chu Kang / Tengah",
              "D25 Admiralty / Woodlands",
              "D26 Mandai / Upper Thomson",
              "D27 Sembawang / Yishun",
              "D28 Seletar / Yio Chu Kang"
            ],
            "default": "any",
            "prefill": "any"
          },
          "minPrice": {
            "title": "Minimum price",
            "type": "integer",
            "description": "Minimum asking price in the market's local currency (SGD, MYR or THB).",
            "minimum": 0,
            "maximum": 1000000000
          },
          "maxPrice": {
            "title": "Maximum price",
            "type": "integer",
            "description": "Maximum asking price in the market's local currency (SGD, MYR or THB).",
            "minimum": 0,
            "maximum": 1000000000
          },
          "bedrooms": {
            "title": "Bedrooms",
            "type": "array",
            "description": "Return any of these exact bedroom counts. 0 means studio. Leave empty for all.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "0",
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "Studio",
                "1 bedroom",
                "2 bedrooms",
                "3 bedrooms",
                "4 bedrooms",
                "5+ bedrooms"
              ]
            },
            "default": [],
            "prefill": []
          },
          "bathrooms": {
            "title": "Bathrooms",
            "type": "array",
            "description": "Return any of these exact bathroom counts. Leave empty for all.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 bathroom",
                "2 bathrooms",
                "3 bathrooms",
                "4 bathrooms",
                "5+ bathrooms"
              ]
            },
            "default": [],
            "prefill": []
          },
          "minSize": {
            "title": "Minimum floor area",
            "type": "integer",
            "description": "Minimum floor area in square feet for Singapore and Malaysia, square metres for Thailand.",
            "minimum": 0,
            "maximum": 1000000
          },
          "maxSize": {
            "title": "Maximum floor area",
            "type": "integer",
            "description": "Maximum floor area in square feet for Singapore and Malaysia, square metres for Thailand.",
            "minimum": 0,
            "maximum": 1000000
          },
          "tenure": {
            "title": "Tenure",
            "type": "string",
            "description": "Freehold or leasehold (mode=search, sale only).",
            "editor": "select",
            "enum": [
              "any",
              "freehold",
              "leasehold"
            ],
            "enumTitles": [
              "Any tenure",
              "Freehold",
              "Leasehold"
            ],
            "default": "any",
            "prefill": "any"
          },
          "furnishing": {
            "title": "Furnishing",
            "type": "string",
            "description": "Furnishing level of the property (mode=search).",
            "editor": "select",
            "enum": [
              "any",
              "unfurnished",
              "partially",
              "fully"
            ],
            "enumTitles": [
              "Any furnishing",
              "Unfurnished",
              "Partially furnished",
              "Fully furnished"
            ],
            "default": "any",
            "prefill": "any"
          },
          "floorLevel": {
            "title": "Floor level",
            "type": "string",
            "description": "Floor level of the unit (mode=search).",
            "editor": "select",
            "enum": [
              "any",
              "ground",
              "low",
              "mid",
              "high",
              "penthouse"
            ],
            "enumTitles": [
              "Any floor",
              "Ground floor",
              "Low floor",
              "Mid floor",
              "High floor",
              "Penthouse"
            ],
            "default": "any",
            "prefill": "any"
          },
          "availability": {
            "title": "Available from",
            "type": "string",
            "description": "Move-in availability (mode=search, rent only).",
            "editor": "select",
            "enum": [
              "any",
              "immediate",
              "within1Month",
              "oneToTwoMonths",
              "twoToThreeMonths",
              "afterThreeMonths"
            ],
            "enumTitles": [
              "Any availability",
              "Immediately",
              "Within 1 month",
              "1-2 months",
              "2-3 months",
              "After 3 months"
            ],
            "default": "any",
            "prefill": "any"
          },
          "maxDistanceToMrt": {
            "title": "Maximum distance to MRT",
            "type": "string",
            "description": "Maximum walking distance to an MRT/LRT station (Singapore and Thailand).",
            "editor": "select",
            "enum": [
              "any",
              "250m",
              "500m",
              "750m",
              "1km",
              "1.5km"
            ],
            "enumTitles": [
              "Any distance",
              "Under 250 m",
              "Under 500 m",
              "Under 750 m",
              "Under 1 km",
              "Under 1.5 km"
            ],
            "default": "any",
            "prefill": "any"
          },
          "sort": {
            "title": "Sort order",
            "type": "string",
            "description": "Order of the results (mode=search).",
            "editor": "select",
            "enum": [
              "recommended",
              "newest",
              "priceAsc",
              "priceDesc",
              "psfAsc",
              "psfDesc",
              "sizeAsc",
              "sizeDesc"
            ],
            "enumTitles": [
              "Recommended",
              "Newest first",
              "Price: low to high",
              "Price: high to low",
              "Price per area: low to high",
              "Price per area: high to low",
              "Size: low to high",
              "Size: high to low"
            ],
            "default": "recommended",
            "prefill": "recommended"
          },
          "maxItems": {
            "title": "Maximum listings",
            "type": "integer",
            "description": "Stop after this many listings.",
            "minimum": 1,
            "maximum": 100000,
            "default": 100,
            "prefill": 2
          },
          "maxPages": {
            "title": "Maximum search pages",
            "type": "integer",
            "description": "Stop after this many search-result pages. The site's own last page also stops the run.",
            "minimum": 1,
            "maximum": 10000,
            "default": 50,
            "prefill": 1
          },
          "includeDetails": {
            "title": "Include detail enrichment",
            "type": "boolean",
            "description": "Open each listing page for description, agent mobile, coordinates, transit, schools, amenities and media. One extra request per listing.",
            "default": true,
            "prefill": false
          },
          "startUrls": {
            "title": "Search, listing or project URLs",
            "type": "array",
            "description": "Paste PropertyGuru SG/MY or DDProperty TH search-result, listing or project URLs (mode=byUrl).",
            "editor": "requestListSources",
            "items": {
              "type": "object",
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL",
                  "description": "PropertyGuru or DDProperty URL."
                }
              }
            },
            "default": [],
            "prefill": []
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "PropertyGuru & DDProperty Listings Scraper Output",
        "description": "Property listings from Singapore, Malaysia and Thailand with prices, property details, agent or developer contact, transit, schools, project unit types and media. accessMethod and dataFreshness identify the live source or archived fallback.",
        "properties": {
          "listings": {
            "type": "string",
            "title": "Property listings",
            "description": "Dataset containing all scraped property listings, including enriched detail fields when enabled.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "defaultMemoryMbytes": 1024,
      "minMemoryMbytes": 1024,
      "exampleRunInput": {
        "mode": "search",
        "country": "SG",
        "listingType": "sale",
        "propertyType": "condo",
        "district": "D20",
        "bedrooms": [
          2
        ],
        "maxItems": 2,
        "includeDetails": false
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Listings",
              "transformation": {
                "fields": [
                  "listingId",
                  "title",
                  "price",
                  "priceText",
                  "currency",
                  "propertyType",
                  "bedrooms",
                  "bathrooms",
                  "floorArea",
                  "floorAreaUnit",
                  "address",
                  "district",
                  "country",
                  "agentName",
                  "agentMobile",
                  "projectName",
                  "listingUrl",
                  "accessMethod",
                  "dataFreshness"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.3",
    "imageDigest": "45a234700a5327a0dfe3bacccf2aee2395b0182ff03b753a5337d50dd2f6ff2c",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.011556666666666666
    }
  }
}