591.com.tw Scraper at a glance
591.com.tw Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, section, change type (incremental mode), title and url, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Real Estate, Automation, Developer Tools
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 25 options
- Run success
- 100.0% of completed public runs in the last 30 days
Extract property listings from 591房屋交易網 591.com.tw, Taiwan’s largest real estate marketplace. Search by city or use 591 URLs. Covers rentals, sales, land, and commercial properties. Returns 50–60 fields, including price, area, GPS coordinates, nearby transit, and agent/owner contact details.
What 591.com.tw Scraper can do
- Four sections in one actor. Switch between Rent, Sale, Land, and Commercial, each returning that section's own native fields.
- Deep records. Up to 50 to 60 populated fields per listing when detail fetching is on, including contact name, mobile, phone, LINE and email, full GPS coordinates, nearby bus and metro stops with distances, lease rules, deposit, fees, and the full photo gallery.
- Two ways to search. Pick a section, regions, and filters, or paste 591 list URLs you already refined in your browser; pasted URLs keep every filter they carry.
- Complete pagination by default. A search or URL walks the whole result set until the storefront naturally runs out, bounded only by your Max total listings cap, so you decide the size of a run instead of an artificial page limit.
- Built for monitoring. Turn on Incremental mode to get only NEW and UPDATED listings on every scheduled run, or resume one specific interrupted walk with resumeFromRunId.
- Resilient delivery. Records are written one at a time as they're collected, so an interrupted run still keeps everything gathered so far, and the run automatically retries with a different connection when one is refused.
Choose what to collect
These inputs let you configure 591.com.tw Scraper - Rentals, Sales, Land & Commercial Listings. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Search mode = pick a property section + regions + filters below. URL mode = paste 591 list URLs you already refined in a browser. |
sectionstring | Which 591 marketplace to scrape. Rent = 租屋 (rentals). Sale = 中古屋/新建案 (resale + new homes). Land = 土地 (plots). Commercial = 店面/辦公/廠房 (shops, offices, factories). |
regionsarray | One or more Taiwan cities/counties to search. Maps to 591 region codes automatically. |
rentKindstring | Only applies when Section = Rent. Narrows by dwelling type. Applies in Search mode and URL mode (rent listings only). |
minPriceinteger | Minimum price. Rent = TWD/month, Sale/Land/Commercial = TWD total (萬 are converted automatically). Leave blank for no minimum. Applies in Search mode and URL mode, including a pasted list URL (a pasted single-listing URL is always returned). |
maxPriceinteger | Maximum price. Same unit as Min price. Leave blank for no maximum. Applies in Search mode and URL mode, including a pasted list URL (a pasted single-listing URL is always returned). |
minAreainteger | Minimum floor area in 坪 (ping, 1 ping ≈ 3.3 m²). Leave blank for no minimum. Applies in Search mode and URL mode. |
Show 18 more inputs
| Input | What it controls |
|---|---|
maxAreainteger | Maximum floor area in 坪 (ping). Leave blank for no maximum. Applies in Search mode and URL mode. |
layoutstring | Rent only, Search mode. Number of bedrooms (591 layout filter). Probe-verified on the rent list. |
keywordstring | Rent only, Search mode. Free-text keyword matched by 591 (for example a metro station or district name, Chinese works best). |
sortBystring | Order of rent list results, in Search mode and applied to pasted rent list URLs. Other sections keep the site default order. Newest = most recently posted first. |
urlsarray | One or more 591 URLs. Supported: rent list pages (region, page and filter/sort parameters are honoured), the rent site root, rent listing pages, sale list pages (the sale list address or its list endpoint), land list and land detail pages, commercial list and commercial detail pages, and new-build project pages (newhouse.591.com.tw). A detail page returns exactly one row. Pagination starts at the page in the URL and walks forward. Unsupported shapes (for example the mobile host or the old business search form) are skipped with a warning in the log. In URL mode the rental type, price and area filters and Sort by (rent lists) still apply to pasted list pages; a pasted single-listing page always returns that one listing; Rooms and Keyword are Search-mode only. Left untouched in URL mode, this field scrapes the example URLs below (the rent site root is offered as a prefill example only, because it resolves to the first rent list). Also accepted under the name startUrls: when startUrls is given and this field is left at its example default, only your startUrls are scraped. |
fetchDetailsboolean | Adds the rich detail fields: full description, agent/owner name + mobile + phone + LINE, lease rules, deposit, fees, nearby transit (bus/MRT) with distances, full high-res photo gallery, and certificate info. Turn OFF for a faster, cheaper run with the list-level fields only (title, price, area, layout, address, primary photos). |
maxListingsinteger | The main hard cap across the whole run. Default 20. Set 0 for unlimited (then the run is bounded only by Max pages). 591 returns ~30-50 listings per page. |
maxItemsPerUrlinteger | URL mode only. Caps the rows taken from each pasted URL (in addition to Max listings). Empty = no per-URL cap. |
maxPagesinteger | Safety bound on how many result pages to walk per region (or per URL). 0 (default) means unlimited, the walk stops naturally once a page comes back empty or keeps repeating listings already collected, or sooner once Max total listings is reached. Set a number only for an explicit page cap below that natural stop. |
maxResidentialRequestsinteger | Caps how many requests may use the (expensive) Residential tier during automatic fallback. 0 = never use residential (datacenter + backup only). Default 200. Has no effect if you do not enable residential and datacenter keeps working. |
resumeFromRunIdstring | Optional. Paste a previous run ID or dataset ID to continue a large walk-all pull: listings already saved by that run are loaded before scraping starts and skipped, so this run only appends new listings. Leave empty for a normal fresh run. For recurring daily/weekly monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring of the same search. The first run returns every matching listing as NEW. Later runs return only NEW, UPDATED, and REAPPEARED listings; unchanged listings are suppressed (not returned, not billed). What is compared: every output field of the listing (price, title, area, address, photos, contact, tags and the rest, including nested values). What is excluded from comparison but still kept in the output: scrapedAt, sourceUrl, pageIndex, the view counters (browseCount, browsePc, browseMobile), the site's own updatedAt and refreshedAt stamps, and the rotating photo-server number (img1/img2) in photo URLs; add more with "Ignore fields when detecting changes" below. Turn on "Emit expired listings" below only if you also want listings that disappeared marked EXPIRED. State is kept separately per section/region/URL/filter combination; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a prior run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the section, regions/URLs, and filters, different searches then never mix state with each other. |
emitExpiredboolean | Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max listings capped it or when Resume was used. This returns and bills extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names to leave out of change detection, so a change in them alone does not make a listing UPDATED. The fields stay in the output. A bare name such as description matches that field at any depth; a dotted path such as nearbyTransit.distance matches exactly that nested field. Already excluded by default: scrapedAt, sourceUrl, pageIndex, browseCount, browsePc, browseMobile, updatedAt, refreshedAt and the photo-server number. Only used when Incremental changes is on. |
mcpConnectorsarray | 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). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idIDsectionSectionchangeTypeChange type (incremental mode)titleTitleurlURL (link)pricePricepriceUnitUnitkindNameTyperoomLayoutareaArea (ping)regionNameRegionsectionNameDistrictShow 26 more fields
addressAddresslatitudeLatlongitudeLngcontactNameContactcontactRoleRolecontactMobileMobilecontactPhonePhonephotoCountPhotoscoverPhotoCover (image)postedAtPostedchangedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)priceTextpriceTextdepositdepositfloorfloorcommunityNamecommunityNamedescriptionDescriptioncontactLinecontactLinecontactEmailcontactEmailnearbyTransitNearby transit (array)facilitiesFacilities (array)feesFees (array)leaseMinTermleaseMinTermrulerulescrapedAtScraped (date)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": 99999999,
"section": "rent",
"listingType": "rent",
"url": "https://rent.591.com.tw/99999999",
"title": "Sample Listing Title",
"description": "Full listing description appears here when fetchDetails is on.",
"price": 18000,
"priceText": "18,000",
"priceUnit": "元/月",
"deposit": "押金二個月",
"kindName": "整層住家",
"room": "2房1廳",
"area": 18,
"floor": "5F",
"regionName": "台北市",
"sectionName": "中山區",
"address": "中山區 Sample Rd",
"latitude": 25.06,
"longitude": 121.53,
"communityName": "Sample Community",
"facilities": [
"冰箱",
"洗衣機",
"冷氣",
"網路"
],
"nearbyTransit": [
{
"type": "subway",
"name": "Sample Station",
"distance": 300
}
],
"tags": [
"新上架",
"可開伙"
],
"photoCount": 12,
"coverPhoto": "https://img1.591.com.tw/house/0000/000000000.jpg",
"postedAt": "此房屋在3天前發佈",
"contactName": "Sample Agent",
"contactRole": "仲介",
"contactMobile": "0900000000",
"contactLine": "sample-line-id",
"isAgent": true,
"scrapedAt": "2026-01-01T00:00:00.000Z"
}Ways to use this data
- Property portals and lead generation: aggregate rent and sale listings with agent or owner contact details to build your own listing feed or lead pipeline.
- Market research and appraisal: track price, unit price, and area across regions and property types to build comparable-sales datasets.
- Relocation and rental search tools: filter by region, price, and area to power a rental matching app or alert bot.
- Land and commercial site scouting: search plots and commercial units by region for feasibility and investment screening.
- Recurring monitoring: watch a saved search on a schedule and forward only new or changed listings into your own alerting system.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does 591.com.tw Scraper return?
The documented output for 591.com.tw Scraper includes id, section, change type (incremental mode), title, url, price, unit and type. Availability of each field depends on the source page and the selected mode.
How much does 591.com.tw Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only NEW and UPDATED listings; unchanged ones are suppressed and not billed. Turn on Emit expired too, and once a run has scanned the whole search end to end, a listing that reappears afterward comes back as REAPPEARED.
What is the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues one specific interrupted run, so you don't re-scrape what it already saved. Incremental mode is for running the exact same search again and again, for example daily, and getting back only what changed since last time; it remembers state itself, so you never paste a run ID.
Why did my run return no listings?
Check your filters and region first. If 591.com.tw refused the connection for the whole run, the log says so and the run still finishes with an empty dataset rather than failing; run it again in a few minutes, or switch to the more robust connection tier if you are consistently blocked.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each listing into Notion, Linear, or Airtable.
