Batdongsan $1💰 Search By URLs and Keywords
Pricing
from $1.00 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
12
Total users
4
Monthly active users
2 days ago
Last modified
Categories
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.
| Field | Example |
|---|---|
id | 45763512 |
url | https://batdongsan.com.vn/ban-can-ho-chung-cu-duong-tran-hung-dao-...-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ỷ |
priceText | Thỏa thuận |
priceValue | null (negotiable; numeric VND when a price is shown, e.g. 3000000000) |
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 |
district | null |
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 |
agentPhone | null (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", ... } |
imageCount | 24 |
images | [ "https://file4.batdongsan.com.vn/resize/1275x717/.../...-ca65_wm.jpg", ... ] |
scrapedAt | 2026-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:
| Need | Use |
|---|---|
| A crawl stopped and should continue | resumeFromRunId / automatic checkpoint recovery |
| Run the same search every day and receive only changes | incrementalMode |
| Keep separate daily campaigns for similar searches | distinct stateKey values |
| Run a normal full snapshot | leave 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
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search = pick type + category + city below. url = paste batdongsan.com.vn URLs. |
listingType | string | Buy | Buy (Bán) or Rent (Cho thuê). Search mode only. |
propertyType | string | Apartment | All, Apartment, PrivateHouse, TownHouse, Villa, Land, ProjectLand, Office, Shop, Warehouse. Search mode only. |
locations | array | ["tp-hcm"] | Province slugs (tp-hcm, ha-noi, da-nang) or common names (Ho Chi Minh, Hanoi), slugified automatically. Empty = nationwide. Search mode only. |
urls | array | (example) | Full batdongsan.com.vn search URLs. URL mode only. A trailing /pN starts at page N. |
maxPages | integer | 0 | Result 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. |
maxListings | integer | 20 | The 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). |
resumeFromRunId | string | (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. |
incrementalMode | boolean | false | Daily/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. |
stateKey | string | (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. |
emitUnchanged | boolean | false | Incremental mode only. Also return listings unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have. |
emitExpired | boolean | false | Incremental 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. |
fetchDetails | boolean | true | Visit each detail page for GPS, description, agent, specs, dates. Turn off for faster, cheaper runs. |
proxy | object | VN residential | Proxy 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
agentPhoneis oftennull. TheagentName,agentIdandagentProfileUrlfields are always captured when present, and theagentProfileUrlpage 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.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto 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.