Brazil Property Listings Scraper
Pricing
Pay per event
Brazil Property Listings Scraper
Export normalized public sale, long-term rental, and short-stay listings from OLX Brazil, QuintoAndar, and Airbnb searches.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Export normalized public property listings from OLX Brazil, QuintoAndar, and Airbnb search URLs. The Actor turns sale, long-term rental, and short-stay cards into one typed dataset for Brazil property inventory comparison. It is designed for analysts who need repeatable snapshots rather than three incompatible exports.
What does the Brazil Property Listings Scraper do?
Supply one or more public search-result URLs from the supported marketplaces. The Actor visits each search, extracts listing cards, normalizes shared fields, removes duplicate source IDs, and writes rows to the default Apify dataset.
Supported workflows are:
- OLX Brazil property and apartment search pages;
- QuintoAndar sale and long-term rental search pages;
- Airbnb Brazil home-search pages;
- one-source exports;
- mixed-source datasets for asking-price and inventory comparison;
- scheduled snapshots for downstream change analysis.
The Actor does not invent missing values.
A field is null when a marketplace does not expose it on its public search card.
Who is it for?
- Property analysts comparing public asking prices across market segments.
- Investment researchers building repeatable city or neighbourhood snapshots.
- Property managers reviewing nearby long-term and short-stay supply.
- Real-estate teams feeding public listing records into spreadsheets or BI tools.
- Data engineers who need one stable schema instead of source-specific parsers.
This is a data-export Actor. It does not contact owners, estimate investment returns, appraise properties, or provide legal advice.
Why normalize several property marketplaces?
Each source serves a different part of the Brazil property market. OLX includes broad classified inventory, QuintoAndar focuses on residential sale and long-term rental, and Airbnb represents short stays. Their page structures and field names differ.
This Actor aligns the useful shared fields:
- marketplace and stable listing ID;
- sale, long-term rental, or short-stay classification;
- displayed asking price and currency;
- city, state, and neighbourhood when exposed;
- property type, rooms, parking, and area when exposed;
- canonical listing and source-search URLs;
- extraction timestamp for snapshot comparison.
What Brazil property data can you extract?
| Field | Meaning |
|---|---|
platform | olx, quintoandar, or airbnb |
listingId | Stable ID from the source marketplace |
url | Public property or accommodation URL |
sourceUrl | Search URL used to find the record |
listingType | sale, long_term_rental, short_stay, or unknown |
title | Listing title or normalized property label |
price | Numeric displayed asking price |
priceText | Source display text for the price |
currency | Currency code when available |
city, state | Public location fields when exposed |
neighbourhood | Public neighbourhood or region |
propertyType | Apartment, house, room, or other displayed type |
bedrooms, bathrooms | Displayed room counts |
parkingSpaces | Displayed parking count |
areaSquareMeters | Displayed floor area |
condoFee | QuintoAndar condo/IPTU amount when exposed |
imageUrls | Public search-card images when exposed |
latitude, longitude | Approximate public coordinates when exposed |
scrapedAt | UTC extraction timestamp |
How to run a Brazil property search
- Open the Actor in Apify Console.
- Copy a public OLX Brazil, QuintoAndar, or Airbnb search URL from your browser.
- Add it to Property search URLs.
- Add other supported searches if you want a mixed dataset.
- Set Maximum listings.
- Click Start.
- Open the Property listings dataset view.
- Export JSON, CSV, Excel, XML, or RSS, or consume the dataset through the API.
A practical first run is:
{"startUrls": [{ "url": "https://www.quintoandar.com.br/alugar/imovel/sao-paulo-sp-brasil" },{ "url": "https://www.airbnb.com/s/Rio-de-Janeiro--Brazil/homes?currency=BRL" }],"maxItems": 20}
Input parameters
startUrls
Required array of public HTTPS search URLs.
Supported hosts are olx.com.br, quintoandar.com.br, and airbnb.com, including their subdomains.
Unsupported domains, non-HTTPS URLs, and malformed URLs fail before extraction.
Use search-result pages rather than home pages. Filters already present in the URL remain part of the request.
maxItems
Maximum normalized rows across all supplied searches. The default is 50 and the allowed range is 1–1,000. Capacity is shared across URLs so mixed-source runs retain representation from each source when results exist.
maxRequestRetries
Retries temporary network, challenge, or server failures with a fresh bounded session. The default is 2 and the allowed range is 0–4. A persistent challenge or unrecognized structured payload fails the run instead of returning a false empty dataset.
Example output
A current QuintoAndar search produces rows shaped like this:
{"platform": "quintoandar","listingId": "893042311","url": "https://www.quintoandar.com.br/imovel/893042311","sourceUrl": "https://www.quintoandar.com.br/alugar/imovel/sao-paulo-sp-brasil","listingType": "long_term_rental","title": "Apartamento in Vila Olímpia in São Paulo","price": 6600,"priceText": "R$ 6.600","currency": "BRL","city": "São Paulo","state": null,"neighbourhood": "Vila Olímpia","propertyType": "Apartamento","bedrooms": 2,"bathrooms": 2,"parkingSpaces": 1,"areaSquareMeters": 60,"condoFee": 1557,"imageUrls": [],"latitude": null,"longitude": null,"scrapedAt": "2026-08-14T14:44:58.000Z"}
Values change as marketplaces update their inventory. Treat the example as a schema illustration, not a promise that a particular listing remains available.
How much does it cost to extract Brazil property listings?
The Actor uses pay-per-event pricing. Each run has a $0.005 start event, followed by a tiered charge for each accepted listing written to the dataset. The current FREE-tier listing rate is $0.0092 per listing and the BRONZE rate is $0.008 per listing; higher tiers decrease further.
At the FREE tier, illustrative Actor charges are:
| Useful output | Calculation | Actor charge |
|---|---|---|
| 10 listings | $0.005 + 10 × $0.0092 | $0.0970 |
| 100 listings | $0.005 + 100 × $0.0092 | $0.9250 |
| 1,000 listings | $0.005 + 1,000 × $0.0092 | $9.2050 |
Only accepted dataset rows trigger the listing event. Rejected, duplicate, empty, and failed records are not charged as listing items. Platform usage and proxy terms follow the active Apify pricing configuration shown in Console.
Build recurring inventory snapshots
Create an Apify Task with stable search URLs and schedule it daily or weekly.
Every run receives its own dataset and scrapedAt timestamp.
Send each completed dataset to your database, warehouse, or spreadsheet.
Compare rows by platform plus listingId to identify additions, removals, or asking-price changes downstream.
The Actor does not maintain a cross-run history table or emit alerts itself. Apify schedules, webhooks, and your destination system provide that workflow.
Export to a spreadsheet or data pipeline
Useful integration patterns include:
- download the dataset as CSV or Excel for a one-time market review;
- send run-finished webhooks to Make, Zapier, or n8n;
- append normalized rows to Google Sheets;
- load JSON into BigQuery, Snowflake, PostgreSQL, or a data lake;
- join snapshots by
platformandlistingId; - group by
city,neighbourhood,listingType, orpropertyType; - calculate price-per-square-metre only where both price and area are present.
Do not compare incompatible price periods without normalizing them first. An Airbnb card can represent a stay price, while a long-term rental card represents a monthly asking price.
Run through the Apify API with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~brazil-multi-platform-property-listings/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls": [{"url": "https://www.quintoandar.com.br/comprar/imovel/rio-de-janeiro-rj-brasil"}],"maxItems": 25}'
Use the returned run ID to inspect status and retrieve the default dataset. Keep your Apify token in a secret or environment variable.
Run with JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/brazil-multi-platform-property-listings').call({startUrls: [{ url: 'https://www.quintoandar.com.br/alugar/imovel/sao-paulo-sp-brasil' },],maxItems: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Run with Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("automation-lab/brazil-multi-platform-property-listings").call(run_input={"startUrls": [{"url": "https://www.airbnb.com/s/Rio-de-Janeiro--Brazil/homes?currency=BRL"}],"maxItems": 25,})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(items)
Use the Actor with MCP and AI assistants
Add the Apify MCP server in Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/brazil-multi-platform-property-listings"
Use the same server URL for Claude Desktop, Cursor, and VS Code MCP settings:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/brazil-multi-platform-property-listings"}}}
Example prompts:
- “Run the Brazil Property Listings Scraper for this QuintoAndar Rio sale URL and return 25 rows.”
- “Export these OLX and Airbnb searches, then group the results by platform.”
- “Schedule this São Paulo comparison input weekly and send the dataset to my webhook.”
Source-specific behavior and limitations
- OLX Brazil currently requires Brazilian residential proxy access and browser-grade TLS.
- QuintoAndar is extracted from structured public server-rendered state.
- Airbnb uses a cookie warmup and a bounds-constrained public search request.
- Search cards do not expose every detail shown on a listing page.
- Pagination beyond the source's initial public search payload is not currently promised.
- Marketplace layouts, access controls, and public inventory can change.
- Location and image fields can be absent on a source card.
maxItemsis a total cap, not a guarantee that every source returns the same count.
Empty results, retries, and troubleshooting
A valid search with no current inventory can complete with zero rows. A challenge page or missing structured state is different: the Actor retries and then fails clearly.
If a run fails:
- Open the source URL in a normal browser and confirm it is a public search page.
- Check that the URL uses a supported host and HTTPS.
- Reduce the number of URLs to identify the affected source.
- Keep
maxRequestRetriesat the default unless diagnosing a persistent source change. - Re-run later if the source is experiencing a temporary outage.
Do not repeatedly retry a deterministic unsupported URL.
Responsible and legal use
This Actor extracts data displayed on public marketplace pages. You are responsible for complying with applicable laws, contractual terms, privacy obligations, database rights, and marketplace policies. Collect only data needed for a legitimate purpose. Do not use the output for harassment, discrimination, unlawful profiling, spam, or attempts to bypass private access.
The Actor does not log in, solve human CAPTCHAs, or access private owner information. Review retention and sharing practices before storing long-running snapshots.
Frequently asked questions
Can I search by city or neighbourhood?
Yes. Configure the desired location and filters on the supported marketplace, then supply that resulting public search URL.
Does it scrape listing detail pages?
No. The initial product normalizes fields exposed by public search cards and hydration state, avoiding expensive detail-page fan-out.
Can it compare Airbnb nightly prices with monthly rent automatically?
It exports the displayed values and identifies the listing type. Your analysis must normalize price periods, dates, guest counts, fees, and stay length before comparing unlike markets.
Why are some room, area, or image fields null?
Sources expose different card fields. Null means the value was not available in the structured public search payload used for that record.
Can I monitor changes?
Schedule repeated Tasks and compare each run's dataset downstream by platform and listingId.
The Actor supplies timestamped snapshots; it does not maintain change history or alert state internally.
Why did an OLX URL fail locally?
OLX commonly requires the configured Apify Brazilian residential proxy and browser-grade TLS route. Ensure your local Apify CLI is authenticated with an account that can create that proxy connection.
Related automation-lab Actors
- OLX Brazil Classifieds Scraper for broader single-source OLX classified extraction.
- Airbnb Scraper for deeper Airbnb listing, pricing, and availability workflows.
- Airbnb Host Portfolio Scraper for public host-level listing portfolios.
Choose the dedicated Actor when you need deeper source-specific fields. Choose this Actor when the main job is one normalized Brazil property inventory dataset across market segments.