# QuintoAndar Scraper (`solidcode/quintoandar-scraper`) Actor

\[💰 $1.30 / 1K] Extract rent and buy property listings from QuintoAndar, Brazil's largest real-estate marketplace. Search by URL or build a search by city, operation, property type, price, bedrooms and area — get prices, fees, area, address with GPS, amenities and photos.

- **URL**: https://apify.com/solidcode/quintoandar-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 5 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## QuintoAndar Scraper

Pull rent and for-sale property listings from QuintoAndar — Brazil's largest digital real-estate marketplace — with all-in monthly costs, exact GPS coordinates, room counts, amenities, and photos for every apartment, house, condo-house, and studio. A single São Paulo search alone covers 40,000+ live listings. Built for Brazilian real-estate investors, proptech teams, and relocation services who need fresh listing data without copy-pasting from quintoandar.com.br one card at a time.

### Why This Scraper?

- **All-in monthly cost on every rental** — `totalCost` already bundles base rent + condominium fee + IPTU property tax + service fee into one number, so you compare what tenants actually pay, not a misleading headline rent.
- **40,000+ listings reachable per city search** — drains a full São Paulo or Rio de Janeiro result set across as many pages as you need, up to 50,000 listings in a single run.
- **Exact GPS coordinates on every listing** — `lat` and `lng` for each property, ready to drop straight onto a map or run radius and proximity analysis.
- **Rent and for-sale in one actor** — flip `operation` between "For Rent (Alugar)" and "For Sale (Comprar)"; roughly a third of a city's rentals are also on the market to buy, and every one of those rows is checked against QuintoAndar's live buy listings before it ships `forSale: true`, a real `salePrice` and an annual gross `yield` that is labelled `contract` or `estimate` so you can tell a measured return from a modelled one.
- **Four property types mirrored from QuintoAndar** — Apartment (Apartamento), House (Casa), House in condominium (Casa de condomínio), and Studio / Kitnet, or "Any type" to pull everything.
- **Eight live filters that match QuintoAndar's own search** — price range (BRL), bedroom counts, area range (m²), pet-friendly, furnished, and near-subway, all applied at the source so you never collect — or pay for — listings you filter out.
- **Amenities translated to clean English** — Portuguese codes like `SALAO_DE_FESTAS` and `PERTO_DE_METRO_OU_TREM` arrive as "Party room" and "Near subway or train", deduplicated and sorted.
- **No-code guided search or paste a URL** — describe a city and filters and the actor builds the QuintoAndar search for you, or paste one or more search URLs you already filtered on the site and get exactly those results.

### Use Cases

**Market Research**

- Track median and average all-in rent across São Paulo, Rio de Janeiro, and Belo Horizonte neighbourhoods
- Compare apartment vs. house vs. studio inventory across Brazilian cities
- Monitor how many furnished, pet-friendly, or near-metro listings exist in a given zone
- Build neighbourhood-level supply dashboards from `region` and address data

**Investment Analysis**

- Calculate price per square metre from `salePrice` and `area` across districts
- Compare rental `totalCost` against `salePrice` in the same area to estimate gross yield
- Map listings by GPS coordinates to spot under-supplied micro-markets
- Track IPTU property-tax burden by neighbourhood with the `iptu` field

**Lead Generation & Aggregation**

- Power a property comparison or aggregation site with normalized QuintoAndar inventory
- Feed a relocation or corporate-housing platform with furnished, near-subway rentals
- Surface new-development (primary market) units for buyer outreach
- Build alerting on listings matching a saved set of filters

**Relocation & Tenant Services**

- Shortlist pet-friendly, furnished apartments near a subway line for relocating employees
- Compare true monthly cost (not just rent) across candidate neighbourhoods
- Export listing photos, amenities, and addresses into a client-ready spreadsheet
- Filter by bedroom count and area to match family-size requirements

### Getting Started

#### Search a City (simplest)

Just say what you want and the actor builds the QuintoAndar search:

```json
{
    "operation": "rent",
    "location": "São Paulo, SP",
    "maxResults": 100
}
```

#### Filtered Search

Furnished, pet-friendly two-bedroom apartments near a subway, within a budget:

```json
{
    "operation": "rent",
    "location": "Rio de Janeiro, RJ",
    "propertyType": "apartment",
    "bedrooms": ["2", "3"],
    "priceMax": 5000,
    "areaMin": 60,
    "acceptsPets": true,
    "furnished": true,
    "nearSubway": true,
    "maxResults": 500
}
```

#### Paste Search URLs (advanced)

Filter directly on quintoandar.com.br, then paste the URLs — including full photo galleries:

```json
{
    "startUrls": [
        "https://www.quintoandar.com.br/alugar/imovel/sao-paulo-sp-brasil/apartamento/2-quartos/aceita-pets",
        "https://www.quintoandar.com.br/comprar/imovel/belo-horizonte-mg-brasil/casa"
    ],
    "includePhotos": true,
    "maxResults": 1000
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | array | `[]` | One or more QuintoAndar search-results URLs. The fastest path — when provided, the guided "Build a Search" fields are ignored. |

#### Build a Search

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `operation` | string | `"rent"` | "For Rent (Alugar)" or "For Sale (Comprar)". Used only when no Search URLs are provided. |
| `location` | string | `"São Paulo, SP"` | City, optionally with its state — e.g. "São Paulo, SP", "Rio de Janeiro, RJ", "Belo Horizonte, MG". Accents recommended. |
| `propertyType` | string | `"apartment"` | "Any type", "Apartment (Apartamento)", "House (Casa)", "House in condominium (Casa de condomínio)", or "Studio / Kitnet". |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `priceMin` | integer | `null` | Minimum price in BRL — monthly cost when renting, total price when buying. |
| `priceMax` | integer | `null` | Maximum price in BRL. |
| `bedrooms` | array | `[]` | Bedroom counts to include: "1 bedroom", "2 bedrooms", "3 bedrooms", "4 or more bedrooms". Combine several. |
| `areaMin` | integer | `null` | Minimum total area in square metres. |
| `areaMax` | integer | `null` | Maximum total area in square metres. |
| `acceptsPets` | boolean | `false` | Only pet-friendly listings. |
| `furnished` | boolean | `false` | Only furnished listings. |
| `nearSubway` | boolean | `false` | Only listings near a metro/subway station. |

#### Photos & Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `includePhotos` | boolean | `false` | Every listing already includes its cover photo. Turn this on to also collect the full gallery (up to 40 photos per listing). |
| `maxResults` | integer | `100` | Maximum listings to collect across all searches and URLs. An exact cap — you never receive more than you asked for. Set to `0` for no cap (a safety limit of 50,000 then applies). |

### Output

Each listing is one flat row. Example (rent):

```json
{
    "id": "894231007",
    "url": "https://www.quintoandar.com.br/imovel/894231007",
    "type": "Apartamento",
    "operation": "rent",
    "forRent": true,
    "forSale": false,
    "status": "ACTIVE",
    "totalCost": 4180,
    "salePrice": null,
    "iptu": 95,
    "area": 72,
    "bedrooms": 2,
    "bathrooms": 2,
    "suites": 1,
    "furnished": true,
    "isPrimaryMarket": false,
    "address": {
        "street": "Rua Augusta",
        "neighborhood": "Consolação",
        "city": "São Paulo",
        "state": "SP",
        "countryCode": "BR",
        "lat": -23.5523,
        "lng": -46.6621
    },
    "region": "Centro",
    "amenities": ["Air conditioning", "Gym", "Near subway or train", "Pool"],
    "specialConditions": ["FIRST_MONTH_DISCOUNT"],
    "categories": ["FURNISHED"],
    "parkingSpaces": 1,
    "coverPhoto": "https://www.quintoandar.com.br/img/abc123.jpg",
    "photos": ["https://www.quintoandar.com.br/img/abc123.jpg"],
    "yield": null,
    "yieldBasis": null,
    "sourceSearchUrl": "https://www.quintoandar.com.br/alugar/imovel/sao-paulo-sp-brasil/apartamento",
    "scrapedAt": "2026-05-30T14:02:11.482000+00:00"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | QuintoAndar internal listing id |
| `url` | string | Canonical listing URL on quintoandar.com.br |
| `type` | string | Property type in Portuguese (Apartamento, Casa, etc.) |
| `operation` | string | `"rent"` or `"buy"` — echoes the search you ran, and the reliable way to tell rent rows from sale rows |
| `forRent` | boolean | Available to rent. Always `true` on a rent run; on a buy run it marks a sale listing that is also live for rent right now, re-checked against QuintoAndar's rental listings row by row |
| `forSale` | boolean | Available to buy. Always `true` on a buy run; on a rent run it marks a rental that is also live for sale right now, re-checked against QuintoAndar's buy listings row by row |
| `status` | string | Listing/visit status |
| `isPrimaryMarket` | boolean | New development (primary market) unit |

#### Pricing (BRL)

| Field | Type | Description |
|-------|------|-------------|
| `totalCost` | number | All-in cost **per month**, in whole reais. On rent rows it bundles base rent + condominium fee + monthly IPTU + service fee; on buy rows there is no rent to include, so it is the monthly carrying cost (condominium fee + IPTU) and reads `0` where the building charges neither |
| `salePrice` | number | Asking sale price in whole reais (not cents), filled only where the property is genuinely on the market to buy today — sale runs plus the dual-listed share of any rent run. Empty everywhere else, including rentals whose owner has since pulled the sale listing, so a stale asking price never reaches you |
| `iptu` | number | IPTU property tax **per month**, in whole reais — the same monthly instalment QuintoAndar folds into `totalCost`, not the annual assessment; `0` when the listing reports none, `null` when unknown |
| `yield` | number | **Annual** gross rental yield, given as a fraction of the asking price: `0.078` means **7.8% per year** (multiply by 100 for a percentage). Filled in on the same rows as `salePrice`, and empty wherever there is no live asking price to compute it against |
| `yieldBasis` | string | What the `yield` was worked out from: `"contract"` means the rent on a real signed rental contract — a measured return; `"estimate"` means QuintoAndar's own estimated rent for the unit — a modelled one. Present on exactly the rows that carry a `yield`, empty elsewhere |

#### Property Details

| Field | Type | Description |
|-------|------|-------------|
| `area` | number | Total usable area in square metres (never square feet) |
| `bedrooms` | integer | Number of bedrooms |
| `bathrooms` | integer | Number of bathrooms |
| `suites` | integer | Number of en-suite bedrooms |
| `parkingSpaces` | integer | Number of parking spaces |
| `furnished` | boolean | Comes furnished |
| `amenities` | array | Building and unit amenities as clean English labels |
| `specialConditions` | array | Active promotions (e.g. first-month discount) |
| `categories` | array | QuintoAndar listing category tags |

#### Address & Location

| Field | Type | Description |
|-------|------|-------------|
| `address.street` | string | Street name |
| `address.neighborhood` | string | Neighbourhood |
| `address.city` | string | City (resolved server-side) |
| `address.state` | string | Two-letter Brazilian state code |
| `address.countryCode` | string | Always `"BR"` |
| `address.lat` | number | Latitude |
| `address.lng` | number | Longitude |
| `region` | string | Region / zone name |

#### Media & Provenance

| Field | Type | Description |
|-------|------|-------------|
| `coverPhoto` | string | Full URL of the main cover photo (always included) |
| `photos` | array | Full gallery URLs (up to 40 per listing) when `includePhotos` is on; otherwise just the cover |
| `sourceSearchUrl` | string | The search URL this listing came from |
| `scrapedAt` | string | ISO timestamp the row was collected |

### Tips for Best Results

- **`totalCost` is already the full monthly bill** — it bundles base rent, condominium fee, IPTU, and service fee, so there's no need to sum line items to compare listings.
- **Paste a URL with filters already applied** — filter on quintoandar.com.br until the results look right, then copy the browser URL into `startUrls` to mirror exactly what you see.
- **Start small, then scale** — run 50–100 results first to confirm the city and filters resolve, then raise `maxResults` (or set `0`) for the full drain.
- **Leave the cover photo and skip the gallery for big runs** — every listing already ships its `coverPhoto` for free; turning on `includePhotos` adds one request per listing and makes large runs noticeably slower.
- **Use accents in city names** — "São Paulo, SP" and "Rio de Janeiro, RJ" resolve most reliably; adding the state code disambiguates same-named cities.
- **Bedroom selection is a floor, not an exact match** — choosing "2 bedrooms" and "3 bedrooms" returns everything with two or more bedrooms, mirroring QuintoAndar's own minimum-bedroom search.
- **One rent run is usually enough for a yield study** — roughly a third of QuintoAndar rentals are dual-listed, and those rows arrive with `forSale: true`, a live `salePrice` and a ready-made annual `yield` you can rank on directly (`0.078` = 7.8% a year). An empty `salePrice` means the unit is rent-only, so filter on it — or on `forSale` — to isolate the investable stock. Sort the survivors by `yieldBasis` before you rank them: `"contract"` rows are priced off a signed lease, `"estimate"` rows off QuintoAndar's rent model, and on a typical for-sale city page the estimates are the large majority.

### Pricing

**From $1.30 per 1,000 results** — undercuts comparable QuintoAndar actors while returning a cleaner, normalized listing object. **No compute charges — you only pay per result returned.**

Your rate depends on your Apify discount tier, so the more you run, the less each listing costs:

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.15 | $0.14 | $0.14 | $0.13 |
| 1,000 | $1.55 | $1.45 | $1.40 | $1.30 |
| 10,000 | $15.50 | $14.50 | $14.00 | $13.00 |
| 100,000 | $155.00 | $145.00 | $140.00 | $130.00 |

Tiered rates take effect on **12 September 2026**; the Gold rate of $1.30 per 1,000 results is unchanged. A "result" is one property listing row in your dataset. Standard Apify platform fees may apply on top of the per-result price.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor collects publicly available property-listing data for legitimate research, analysis, and aggregation. You are responsible for using it in compliance with QuintoAndar's terms of service, applicable laws, and Brazil's data-protection regulations (LGPD). Do not use collected data to harass individuals, send unsolicited communications, or for any unlawful purpose. Always respect the rights of property owners, agents, and platform operators.

# Actor input Schema

## `startUrls` (type: `array`):

Paste one or more QuintoAndar search-results URLs (for example https://www.quintoandar.com.br/alugar/imovel/sao-paulo-sp-brasil/apartamento). This is the fastest way to get exactly the results you see on the site. When you provide URLs here, the guided 'Build a Search' fields below are ignored.

## `operation` (type: `string`):

Are you looking for properties to rent or to buy? Used only when no Search URLs are provided.

## `location` (type: `string`):

City to search, optionally with its state — for example 'São Paulo, SP', 'Rio de Janeiro, RJ', or 'Belo Horizonte, MG'. Accents are accepted and recommended.

## `propertyType` (type: `string`):

Filter by property category. Mirrors QuintoAndar's own categories. Choose 'Any' to include all types.

## `priceMin` (type: `integer`):

Only include listings at or above this price in Brazilian reais — monthly rent when renting, total price when buying. Leave empty for no minimum.

## `priceMax` (type: `integer`):

Only include listings at or below this price in Brazilian reais. Leave empty for no maximum.

## `bedrooms` (type: `array`):

Only include listings with these bedroom counts. Select several to combine. Leave empty for any number of bedrooms.

## `areaMin` (type: `integer`):

Only include properties with total area at or above this many square metres. Leave empty for no minimum.

## `areaMax` (type: `integer`):

Only include properties with total area at or below this many square metres. Leave empty for no maximum.

## `acceptsPets` (type: `boolean`):

Only include listings that allow pets.

## `furnished` (type: `boolean`):

Only include furnished listings.

## `nearSubway` (type: `boolean`):

Only include listings near a metro/subway station.

## `includePhotos` (type: `boolean`):

By default every listing already includes its main cover photo at no extra cost. Turn this on to also collect the full photo gallery (up to 40 photos per listing). This makes one extra request per listing, so a large run will take noticeably longer.

## `maxResults` (type: `integer`):

Maximum number of listings to collect across all searches and URLs. This is an exact cap — you get at most this many results, never more. Set to 0 for no cap (an internal safety limit of 50,000 is then applied).

## Actor input object example

```json
{
  "startUrls": [],
  "operation": "rent",
  "location": "São Paulo, SP",
  "propertyType": "apartment",
  "bedrooms": [],
  "acceptsPets": false,
  "furnished": false,
  "nearSubway": false,
  "includePhotos": false,
  "maxResults": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped listings with the key fields — type, operation, monthly total cost (R$), sale price (R$), area in square metres, bedrooms, address and listing URL.

## `details` (type: `string`):

Full per-listing fields including monthly total cost (R$), sale price (R$), monthly IPTU tax (R$), area in square metres, annual gross rental yield as a fraction of the asking price (0.078 = 7.8% a year) plus whether that yield came from a signed rental contract or an estimated rent, bedrooms/bathrooms/suites, address with GPS coordinates, amenities, photos and timestamps.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [],
    "operation": "rent",
    "location": "São Paulo, SP",
    "propertyType": "apartment",
    "bedrooms": [],
    "acceptsPets": false,
    "furnished": false,
    "nearSubway": false,
    "includePhotos": false,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/quintoandar-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [],
    "operation": "rent",
    "location": "São Paulo, SP",
    "propertyType": "apartment",
    "bedrooms": [],
    "acceptsPets": False,
    "furnished": False,
    "nearSubway": False,
    "includePhotos": False,
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/quintoandar-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [],
  "operation": "rent",
  "location": "São Paulo, SP",
  "propertyType": "apartment",
  "bedrooms": [],
  "acceptsPets": false,
  "furnished": false,
  "nearSubway": false,
  "includePhotos": false,
  "maxResults": 100
}' |
apify call solidcode/quintoandar-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/quintoandar-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ATvSYkNFLp63otLcf/builds/cOwkjHrdSHgYrpGre/openapi.json
