Batdongsan $1💰 Search By URLs and Keywords avatar

Batdongsan $1💰 Search By URLs and Keywords

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Batdongsan $1💰 Search By URLs and Keywords

Batdongsan $1💰 Search By URLs and Keywords

From $1/1K. Scrape Batdongsan.com.vn property listings into clean JSON. Search by listing type, property category, and city, or paste a search URL. Automatically paginates and can extract GPS, specs, agent details, dates, and high-resolution photos.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

4

Monthly active users

2 days ago

Last modified

Share

Batdongsan.com.vn Property Scraper

Scrape property listings from Batdongsan.com.vn, Vietnam's largest property portal, in clean structured JSON. Pick a listing type, property category and city in Search mode, or paste any batdongsan.com.vn search URL in URL mode. The scraper walks pagination automatically and can open each listing's detail page to pull GPS coordinates, the full specification table, the agent's name and profile, posted and expiry dates, and the high-resolution photo gallery.

Why this scraper

  • Two input modes. Search mode (listing type + property category + city) for quick setups, or URL mode to paste a fully filtered batdongsan.com.vn URL straight from your browser.
  • 30+ fields per listing. Title, price, area, bedrooms, bathrooms, location, GPS, agent, photos, posted/expiry dates, and the complete Vietnamese spec table preserved verbatim.
  • Detail enrichment toggle. Turn it on for GPS + description + agent + specs, or off for fast, low-cost runs with just the listing-card fields.
  • Auto forward pagination. Give it a city and a page budget; it walks page by page until the budget or the result set is exhausted.
  • Vietnamese price parsing. "2 tỷ", "1,5 tỷ" and "25 triệu/tháng" are parsed into numeric VND alongside the original text.
  • Deduplicated. Listings are de-duplicated by ID across pages and across multiple cities in one run.

Data you get

Example values below are taken from a real listing scraped from the site.

FieldExample
id45763512
urlhttps://batdongsan.com.vn/ban-can-ho-chung-cu-duong-tran-hung-dao-...-pr45763512
listingTypeBuy
propertyTypeApartment
titleCăn hộ cao cấp view trực diện sông Hàn Symphony 5, Giá chỉ từ 2 Tỷ
priceTextThỏa thuận
priceValuenull (negotiable; numeric VND when a price is shown, e.g. 3000000000)
priceUnitThỏa thuận
area34
bedrooms1
bathrooms1
directionĐông - Nam
furnitureKhông nội thất
locationTextĐà Nẵng
cityĐà Nẵng
districtnull
latitude16.0894295200889
longitude108.228379644058
cityCodeDDN
projectSymphony 5
listingTierTin VIP Kim Cương
postedDate20/05/2026
expiryDate04/06/2026
listingCode45763512
agentNameBảo Bảo SRT Miền Trung
agentId5181335
agentProfileUrlhttps://guru.batdongsan.com.vn/pa/baobaosrtmientrung
agentPhonenull (revealed on the site via a click; see notes below)
specs{ "Diện tích": "34 m²", "Số phòng ngủ": "1 phòng", "Hướng nhà": "Đông - Nam", ... }
imageCount24
images[ "https://file4.batdongsan.com.vn/resize/1275x717/.../...-ca65_wm.jpg", ... ]
scrapedAt2026-05-26T00:00:00.000Z

The full Vietnamese specification table is preserved verbatim under specs, so any field batdongsan adds in the future flows through without code changes.

How to use

1. Search mode, basic (apartments for sale in Ho Chi Minh City)

{
"mode": "search",
"listingType": "Buy",
"propertyType": "Apartment",
"locations": ["tp-hcm"],
"maxPages": 5,
"fetchDetails": true,
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "VN" }
}

2. Search mode, multiple cities, fast (no detail pages)

{
"mode": "search",
"listingType": "Buy",
"propertyType": "PrivateHouse",
"locations": ["ha-noi", "da-nang", "can-tho"],
"maxPages": 3,
"fetchDetails": false,
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "VN" }
}

3. Search mode, rentals

{
"mode": "search",
"listingType": "Rent",
"propertyType": "Apartment",
"locations": ["tp-hcm"],
"maxPages": 5,
"maxListings": 100,
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "VN" }
}

4. URL mode, paste browser-filtered URLs (multiple)

Apply price, area or bedroom filters on batdongsan.com.vn in your browser, then paste the resulting URLs here. Each URL is paginated forward from where it points.

{
"mode": "url",
"urls": [
"https://batdongsan.com.vn/ban-can-ho-chung-cu-tp-hcm",
"https://batdongsan.com.vn/cho-thue-van-phong-ha-noi/p2"
],
"maxPages": 4,
"fetchDetails": true,
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "VN" }
}

Resume & recurring updates

There are two different things here — pick the one that matches what you're doing:

NeedUse
A crawl stopped and should continueresumeFromRunId / automatic checkpoint recovery
Run the same search every day and receive only changesincrementalMode
Keep separate daily campaigns for similar searchesdistinct stateKey values
Run a normal full snapshotleave both off

Resume (resumeFromRunId) continues one specific interrupted or previous large crawl: paste a run ID or dataset ID and this run skips listings already collected there, returning only the remaining new ones. An automatic same-run checkpoint also protects against platform migrations/resurrects without any input needed.

Incremental mode (incrementalMode) is for a schedule (for example, daily): the actor remembers the previous run of the same search by itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED listings by default — duplicates and unchanged listings are suppressed (and not charged). Turn on emitUnchanged or emitExpired only when you also want those rows returned (and billed for). State is isolated automatically per mode/listing type/property type/location(s)/URL(s) and detail-fetch setting; set stateKey to name or deliberately share a monitoring campaign.

Scheduled-run example — same search, run daily:

Day 1 (first run ever for this search):

{ "mode": "search", "listingType": "Buy", "propertyType": "Apartment", "locations": ["tp-hcm"], "incrementalMode": true }

→ every listing comes back with "changeType": "NEW".

Day 2 (the schedule fires again, identical input):

{ "mode": "search", "listingType": "Buy", "propertyType": "Apartment", "locations": ["tp-hcm"], "incrementalMode": true }

→ listings that vanished or reappeared come back as "changeType": "REAPPEARED", listings whose price/area/status/etc. changed come back as "changeType": "UPDATED" with changedFields listing what changed, brand-new listings come back as "changeType": "NEW" — and listings that are still there, unchanged, are not returned at all (suppressed, not charged) unless emitUnchanged is on.

What counts as a change. Two fields are deliberately excluded from the change fingerprint because they vary on every scrape/render regardless of whether the listing itself changed, and including them would make every listing look UPDATED on every run:

  • scrapedAt — the crawl timestamp, always different.
  • agentPhoneToken — the encrypted KYC-gate token batdongsan mints fresh per page render (not a stable per-listing value), so re-scraping the exact same unchanged listing yields a different token every time.

Everything else — priceValue, area, listingTier, postedDate, expiryDate, specs, etc. — is real data and correctly triggers UPDATED when it changes.

Input parameters

ParameterTypeDefaultDescription
modestringsearchsearch = pick type + category + city below. url = paste batdongsan.com.vn URLs.
listingTypestringBuyBuy (Bán) or Rent (Cho thuê). Search mode only.
propertyTypestringApartmentAll, Apartment, PrivateHouse, TownHouse, Villa, Land, ProjectLand, Office, Shop, Warehouse. Search mode only.
locationsarray["tp-hcm"]Province slugs (tp-hcm, ha-noi, da-nang) or common names (Ho Chi Minh, Hanoi), slugified automatically. Empty = nationwide. Search mode only.
urlsarray(example)Full batdongsan.com.vn search URLs. URL mode only. A trailing /pN starts at page N.
maxPagesinteger0Result pages to walk per city / URL. Roughly 20 to 30 listings per page. 0 (default) means unlimited: the walk stops naturally once a page comes back empty or repeats listings already collected, or sooner once maxListings is reached. Set a number only for an explicit page cap below that natural stop.
maxListingsinteger20The sole soft cap on the run: stop after this many listings across all cities/URLs. Defaults to 20 so a run stays small unless you raise it. 0 = unlimited (bounded only by the natural stop on maxPages).
resumeFromRunIdstring(empty)Continue one specific previous run/dataset: listings already saved there are loaded before scraping starts and skipped, so this run only appends new listings. For recurring daily monitoring of the same search, use incrementalMode instead — see "Resume & recurring updates" above.
incrementalModebooleanfalseDaily/recurring monitoring of this same search. First run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED by default. See "Resume & recurring updates" above.
stateKeystring(empty)Incremental mode only. Name this monitoring campaign, or deliberately share state across differently-configured runs. Leave empty to derive a key automatically from mode/listing type/property type/location(s)/URL(s)/fetchDetails.
emitUnchangedbooleanfalseIncremental mode only. Also return listings unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have.
emitExpiredbooleanfalseIncremental mode only. Also return listings from a previous run no longer found, marked EXPIRED, once a run has fully scanned the search (not capped, not a resume). Adds and bills extra synthetic rows.
fetchDetailsbooleantrueVisit each detail page for GPS, description, agent, specs, dates. Turn off for faster, cheaper runs.
proxyobjectVN residentialProxy configuration. Vietnam residential is required for reliable results.

Notes on filters and the agent phone

  • Price, area, bedroom and sort filters are applied on batdongsan.com.vn through a form, not through the address bar, so they cannot be set as Search-mode fields. To use them, apply them in your browser and paste the resulting URL in URL mode.
  • Agent phone numbers are revealed on the site through a click action rather than printed in the page, so agentPhone is often null. The agentName, agentId and agentProfileUrl fields are always captured when present, and the agentProfileUrl page lists the agent's other contact details.

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 example

{
"id": "45763512",
"url": "https://batdongsan.com.vn/ban-can-ho-chung-cu-duong-tran-hung-dao-phuong-nai-hien-dong-symphony-5/so-huu-view-song-han-chi-2-ty-tien-inh-cao-10-nam-du-an-5-pr45763512",
"listingType": "Buy",
"propertyType": "Apartment",
"title": "Căn hộ cao cấp view trực diện sông Hàn Symphony 5, Giá chỉ từ 2 Tỷ, Khai Thác Dòng Tiền 12%/Năm.",
"priceText": "Thỏa thuận",
"priceValue": null,
"priceUnit": "Thỏa thuận",
"area": 34,
"bedrooms": 1,
"bathrooms": 1,
"direction": "Đông - Nam",
"furniture": "Không nội thất",
"locationText": "Đà Nẵng",
"city": "Đà Nẵng",
"latitude": 16.0894295200889,
"longitude": 108.228379644058,
"cityCode": "DDN",
"project": "Symphony 5",
"listingTier": "Tin VIP Kim Cương",
"postedDate": "20/05/2026",
"expiryDate": "04/06/2026",
"listingCode": "45763512",
"agentName": "Bảo Bảo SRT Miền Trung",
"agentId": "5181335",
"agentProfileUrl": "https://guru.batdongsan.com.vn/pa/baobaosrtmientrung",
"specs": {
"Khoảng giá": "Thỏa thuận",
"Diện tích": "34 m²",
"Số phòng ngủ": "1 phòng",
"Số phòng tắm, vệ sinh": "1 phòng",
"Hướng nhà": "Đông - Nam"
},
"imageCount": 24,
"images": ["https://file4.batdongsan.com.vn/resize/1275x717/2026/05/25/20260525224254-ca65_wm.jpg"],
"scrapedAt": "2026-05-26T00:00:00.000Z"
}

Plan requirement

Batdongsan.com.vn only serves traffic from Vietnam-reachable connections, so a Vietnam residential proxy is required. The default proxy configuration uses Apify Residential pinned to country VN.

  • Paid Apify plans (Starter and above) include residential proxy access; keep the default and the actor runs as-is.
  • Free Apify plans do not include residential proxy. Either upgrade your plan, or uncheck "Use Apify proxy" and paste your own Vietnam residential proxy URLs in the proxy field.

If a run returns zero items, the exit IP was likely flagged: re-run for a fresh IP, and keep the proxy country pinned to VN.