Brazil Property Listings Scraper avatar

Brazil Property Listings Scraper

Pricing

Pay per event

Go to Apify Store
Brazil Property Listings Scraper

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

Stas Persiianenko

Maintained by Community

Actor 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?

FieldMeaning
platformolx, quintoandar, or airbnb
listingIdStable ID from the source marketplace
urlPublic property or accommodation URL
sourceUrlSearch URL used to find the record
listingTypesale, long_term_rental, short_stay, or unknown
titleListing title or normalized property label
priceNumeric displayed asking price
priceTextSource display text for the price
currencyCurrency code when available
city, statePublic location fields when exposed
neighbourhoodPublic neighbourhood or region
propertyTypeApartment, house, room, or other displayed type
bedrooms, bathroomsDisplayed room counts
parkingSpacesDisplayed parking count
areaSquareMetersDisplayed floor area
condoFeeQuintoAndar condo/IPTU amount when exposed
imageUrlsPublic search-card images when exposed
latitude, longitudeApproximate public coordinates when exposed
scrapedAtUTC extraction timestamp
  1. Open the Actor in Apify Console.
  2. Copy a public OLX Brazil, QuintoAndar, or Airbnb search URL from your browser.
  3. Add it to Property search URLs.
  4. Add other supported searches if you want a mixed dataset.
  5. Set Maximum listings.
  6. Click Start.
  7. Open the Property listings dataset view.
  8. 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 outputCalculationActor 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 platform and listingId;
  • group by city, neighbourhood, listingType, or propertyType;
  • 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 os
from apify_client import ApifyClient
client = 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().items
print(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.
  • maxItems is 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:

  1. Open the source URL in a normal browser and confirm it is a public search page.
  2. Check that the URL uses a supported host and HTTPS.
  3. Reduce the number of URLs to identify the affected source.
  4. Keep maxRequestRetries at the default unless diagnosing a persistent source change.
  5. Re-run later if the source is experiencing a temporary outage.

Do not repeatedly retry a deterministic unsupported URL.

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.

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.