# Chaves na Mão Scraper 💰$0.90/1K Brazil Real Estate + Phones (`memo23/chaves-na-mao-scraper`) Actor

Chaves na Mão scraper for Brazil property listings for sale, rent and new developments. Search a city, neighbourhood, street or coordinates, or paste URLs. Price, condo fee, IPTU, rooms, area, address, GPS, photos, amenities, plus agent phone, WhatsApp and CRECI. Past the 1,500 cap.

- **URL**: https://apify.com/memo23/chaves-na-mao-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.65 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Chaves na Mão Scraper: Brazil Real Estate with Agent Phones

Extract property listings for sale, for rent and new developments (lançamentos) from **ChavesNaMao.com.br**, one of Brazil's large real estate portals with over a million homes, offices and plots. Type a city, neighbourhood, zone or street, give coordinates, or paste any Chaves na Mão search or listing URL. You get one clean row per property: price, condo fee, IPTU, rooms, area, address, GPS, description, features, condominium facilities, nearby places and photos, plus the **advertiser's name, mobile and landline phones, WhatsApp, CRECI and Google rating**. Big cities go **past the website's 1,500-result limit**. No login or API key needed, **$0.90 per 1,000 listings**.

| Input | Rows emitted |
|---|---|
| Location (`"Pinheiros, São Paulo"`) | One row per listing in that place, for sale or for rent |
| Coordinates (`-23.55`, `-46.63`) | One row per listing in the nearest city |
| Search URL (`/apartamentos-para-alugar/sp-sao-paulo/`) | One row per listing in the search, its filters kept |
| Listing URL (`/imovel/.../id-43457908/`) | One row for that listing |

![How the Chaves na Mão Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-chavesnamao.png)

### Why use this scraper

- **Advertiser contacts on every row.** Agency or broker name, mobile, landline and commercial phones, the numbers that take WhatsApp, CRECI licence number, verified badge, profile page and Google rating with review count. Owners selling directly are marked `advertiserType: "owner"`.
- **Past the 1,500-result limit.** Chaves na Mão stops a search at 1,500 results. São Paulo alone lists over 960,000 homes for sale. The actor splits big searches into price ranges automatically, so `maxItems: 0` returns the whole search.
- **No URL needed.** Type `São Paulo`, `Pinheiros, São Paulo`, `Zona Sul, Rio de Janeiro`, `Avenida Paulista`, a state code (`SP`) or `Brasil`. Or give latitude and longitude.
- **Every website filter.** Sale, rent or both in one search, all 18 property types, price, area, bedrooms, bathrooms, parking, 32 amenities (pool, balcony, gym, furnished…), close to public transport, parks or a shopping centre, pets allowed, owner only or agencies only, and six sort orders including by area.
- **New developments.** Launches on plan, under construction or ready to move in, with their price, bedroom and area ranges and construction status.
- **Costs broken out.** Asking price or monthly rent, condo fee (condomínio) and IPTU as separate numbers in R$, plus price per m² (by plot size for land and farms).
- **Location detail.** Street and number when the advertiser publishes them, neighbourhood, zone, city, state, CEP, coordinates (with a flag saying whether they mark the address or the neighbourhood) and nearby bus stops, stations, schools, hospitals and parks with distances.
- **Change tracking for monitoring.** Give a scheduled search a project name and every row comes back marked `new`, `changed` or `unchanged` since the last run, with the previous price. Listings that disappeared from Chaves na Mão come back once as `removed`. Turn on **Only new or changed** and you get, and pay for, only what moved.
- **Advertiser list.** Every run also saves one record per agency, broker or owner in the results, with phones, WhatsApp, CRECI, Google rating, how many listings they have for sale and rent, price range and cities. JSON and CSV, free.
- **All the photos.** Search results carry each listing's first 5 photos in full size. One toggle adds every photo, at no extra charge.

### Supported inputs

| Type | Example |
|---|---|
| 📍 City | `São Paulo` · `Campinas` · `Curitiba` |
| 📍 Neighbourhood or zone | `Pinheiros, São Paulo` · `Copacabana, Rio de Janeiro` · `Zona Sul, Rio de Janeiro` |
| 📍 Street | `Avenida Paulista` |
| 📍 State or country | `SP` · `RJ` · `Brasil` |
| 🧭 Coordinates | `latitude: -22.9068`, `longitude: -43.1729` |
| 🔍 Search URL | `https://www.chavesnamao.com.br/apartamentos-para-alugar/sp-sao-paulo/pinheiros/` |
| 🔍 Search URL with filters | `https://www.chavesnamao.com.br/casas-para-alugar/pr-curitiba/?filtro=pmin:2000,pmax:5000` |
| 🏠 Single listing | `https://www.chavesnamao.com.br/imovel/apartamento-a-venda-1-quarto-com-garagem-sp-sao-paulo-bela-vista-RS580000/id-43457908/` |

### Use cases

- **Lead lists for real estate services**: agencies and brokers active in a neighbourhood, with phones, WhatsApp and CRECI, for mortgage brokers, photographers, portals and CRM vendors.
- **Owner-direct listings**: filter `listedBy: "owner"` to find homes sold or rented without an agency.
- **Market research**: asking prices, rents, condo fees and price per m² by city, zone and neighbourhood.
- **Price monitoring**: schedule a search with a change-tracking project and receive only new listings and price changes each day.
- **Data for models**: geocoded listings with rooms, area, features and nearby places for valuation and recommendation models.

### How it works

1. A location is matched against Chaves na Mão's own list of cities, zones, neighbourhoods and streets. When a name exists in several places, the one with the most listings wins, and a city or state after a comma picks another. Coordinates go to the nearest city.
2. Your filters are applied the way the website applies them. A pasted search URL keeps its own filters.
3. When a search holds more than 1,500 listings, the actor splits it by price until each part fits, and reads each part in turn.
4. Rows are deduplicated by listing ID and saved to the dataset. With **All photos** on, each listing's full photo list is added.

### Input configuration

| Field | Type | Default | Notes |
|---|---|---|---|
| `locations` | array | `São Paulo` | City, `Neighbourhood, City`, `Zone, City`, street, state code or `Brasil` |
| `placeType` | string | any | Force `city`, `zone`, `neighborhood`, `street` or `state` matching |
| `latitude`, `longitude` | number | none | Searches the nearest city |
| `startUrls` | array | none | Search and/or listing URLs, any mix |
| `dealType` | string | `sale` | `sale`, `rent`, `any` (both) or `new` (new developments), for locations and coordinates |
| `constructionStages` | array | all | With `new`: `on_plan`, `under_construction`, `ready` |
| `propertyTypes` | array | all | `apartment`, `house`, `condo_house`, `studio`, `flat`, `loft`, `penthouse`, `country_house`, `land`, `condo_land`, `office`, `commercial_house`, `shop`, `warehouse`, `commercial_land`, `building`, `garage`, `farm` |
| `minPrice`, `maxPrice` | integer | none | Asking price for sales, monthly rent for rentals, in R$ |
| `minArea`, `maxArea` | integer | none | m² |
| `minBedrooms`, `minBathrooms`, `minParkingSpaces` | integer | none | 2 means 2 or more |
| `listedBy` | string | `all` | `all`, `owner` (direto com o proprietário) or `agency`. Not used for new developments |
| `amenities` | array | none | `pool`, `gym`, `balcony`, `furnished`, `elevator`, `air_conditioning`, `doorman` and 25 more |
| `nearby` | array | none | `public_transport`, `parks`, `shopping` |
| `petFriendly` | boolean | false | Only listings that accept pets |
| `sortBy` | string | `relevance` | `relevance`, `newest`, `lowest_price`, `highest_price`, `smallest_area`, `largest_area` |
| `maxItems` | integer | 5,000 | Listings for the whole run. `0` = everything the searches match |
| `maxItemsPerSearch` | integer | none | Cap for each location or search URL on its own |
| `trackChangesProject` | string | none | Name for change tracking between runs; rows get `changeType`, `previousPrice`, `firstSeenAt` |
| `onlyNewOrChanged` | boolean | false | With a project: leave unchanged listings out (not charged) |
| `includeRemoved` | boolean | true | With a project: report listings that left Chaves na Mão as `removed` rows |
| `saveAdvertisers` | boolean | true | Save the advertiser list (`ADVERTISERS`, `ADVERTISERS.csv`) to the run's key-value store |
| `includeAllPhotos` | boolean | false | Every photo instead of the first 5. Slower, no extra charge |
| `includeRawData` | boolean | false | Adds `raw`: the listing exactly as the website returns it |
| `maxConcurrency` | integer | 4 | Result pages read in parallel |
| `proxy` | object | none | Leave empty. Only your own proxy URLs are used; Apify Proxy is ignored |

#### Example input: owner-direct apartments with a pool

```json
{
  "locations": ["São Paulo"],
  "dealType": "sale",
  "propertyTypes": ["apartment"],
  "listedBy": "owner",
  "amenities": ["pool"],
  "maxPrice": 900000,
  "maxItems": 200
}
```

#### Example input: rentals in two neighbourhoods, newest first

```json
{
  "locations": ["Pinheiros, São Paulo", "Copacabana, Rio de Janeiro"],
  "dealType": "rent",
  "minBedrooms": 2,
  "sortBy": "newest",
  "includeAllPhotos": true,
  "maxItems": 500
}
```

#### Example input: new developments under construction or ready

```json
{
  "locations": ["São Paulo"],
  "dealType": "new",
  "constructionStages": ["under_construction", "ready"],
  "propertyTypes": ["apartment"],
  "maxItems": 100
}
```

#### Example input: daily monitoring, only what changed

```json
{
  "locations": ["Pinheiros, São Paulo", "Vila Mariana, São Paulo"],
  "dealType": "rent",
  "maxItems": 0,
  "maxItemsPerSearch": 3000,
  "trackChangesProject": "sp-rentals-daily",
  "onlyNewOrChanged": true
}
```

#### Example input: search and listing URLs

```json
{
  "startUrls": [
    "https://www.chavesnamao.com.br/casas-para-alugar/pr-curitiba/?filtro=pmin:2000,pmax:5000",
    "https://www.chavesnamao.com.br/imovel/apartamento-a-venda-1-quarto-com-garagem-sp-sao-paulo-bela-vista-RS580000/id-43457908/"
  ],
  "maxItems": 300
}
```

### Output

One row per listing. Sample (phone numbers masked, arrays shortened):

```json
{
  "listingId": "27313295",
  "url": "https://www.chavesnamao.com.br/imovel/apartamento-para-alugar-2-quartos-com-garagem-sp-sao-paulo-pinheiros-106m2-RS22000/id-27313295/",
  "title": "Apartamento Residencial para venda e locação, Pinheiros, São Paulo - AP0206.",
  "transaction": "rent",
  "propertyType": "Apartamento",
  "category": "residential",
  "price": 22000,
  "priceText": "R$ 22.000",
  "condoFee": 1869,
  "iptu": 500,
  "currency": "BRL",
  "bedrooms": 2,
  "bathrooms": 3,
  "suites": 2,
  "parkingSpaces": 2,
  "usableAreaM2": 106,
  "totalAreaM2": 106,
  "neighborhood": "Pinheiros",
  "zone": "Zona Oeste",
  "city": "São Paulo",
  "state": "SP",
  "latitude": -23.5635787,
  "longitude": -46.6916068,
  "coordinatesPrecision": "address",
  "description": "Apartamento para venda e locação em São Paulo/SP…",
  "features": ["Área de serviço", "Cozinha"],
  "condoFeatures": ["Piscina", "Playground", "Salão de festas", "Sauna"],
  "nearbyPlaces": [{ "type": "bus_stop", "name": "Avenida Doutor Arnaldo", "distanceMeters": 30 }],
  "photoCount": 20,
  "photos": ["https://www.chavesnamao.com.br/imn/0000x0000/N/80/imoveis/236284/27313295/sp-sao-paulo-pinheiros-rua-oscar-freire-apartamento-para-alugar-2-quartos-676782fa-1.jpg"],
  "petFriendly": false,
  "acceptsTrade": true,
  "advertiserReference": "AP0206",
  "advertiserName": "GATO IMÓVEIS",
  "advertiserType": "agency",
  "advertiserId": "236284",
  "advertiserUrl": "https://www.chavesnamao.com.br/imobiliaria/gato-imoveis/id-236284/",
  "advertiserCreci": "25171",
  "advertiserVerified": false,
  "advertiserMobilePhone": "(11) 4407-XXXX",
  "advertiserLandlinePhone": "(11) 94140-XXXX",
  "advertiserWhatsapp": ["(11) 94140-XXXX"],
  "advertiserGoogleRating": 4.7,
  "advertiserGoogleReviews": 182,
  "contactOptions": ["message", "phone", "whatsapp", "visit", "video_visit"],
  "createdAt": "2024-12-20T12:29:52.000",
  "updatedAt": "2026-06-04T00:17:50.000",
  "scrapedAt": "2026-10-31T12:01:02.869Z"
}
```

#### Key output fields

| Field | Description |
|---|---|
| `listingId`, `url`, `title` | Chaves na Mão listing ID, page and headline |
| `transaction` | `sale` or `rent` |
| `propertyType`, `propertyTypeId`, `category` | Type as the website names it, its ID, `residential` or `commercial` |
| `price`, `priceText` | Asking price or monthly rent in R$, as a number and as displayed |
| `priceMax` | Top of the price range for new developments sold as a range |
| `priceHidden` | True when the advertiser hides the price ("Confira") |
| `pricePerM2` | Price divided by usable area, or by plot size for land, farms and country houses |
| `isNewDevelopment`, `constructionStatus`, `constructionStatusText` | Launches: `on_plan`, `under_construction` or `ready` |
| `condoFee`, `iptu` | Condomínio and IPTU in R$ |
| `bedrooms`, `bathrooms`, `suites`, `parkingSpaces`, `commercialRooms` | Rooms and parking |
| `bedroomsMax`, `bathroomsMax`, `suitesMax`, `parkingSpacesMax` | Top of the range when a development offers several unit sizes |
| `usableAreaM2`, `totalAreaM2`, `usableAreaM2Max`, `totalAreaM2Max` | Usable and total area, with the range top for developments |
| `street`, `streetNumber`, `addressComplement` | Published only when the advertiser shows the address |
| `neighborhood`, `zone`, `city`, `state`, `zipCode` | Location, CEP when published |
| `latitude`, `longitude`, `coordinatesPrecision` | `address` = the listing's own point, `neighborhood` = centre of the neighbourhood |
| `googleMapsUrl` | Google Maps link to those coordinates |
| `description` | Full text with line breaks |
| `features`, `condoFeatures` | Unit features and condominium facilities |
| `nearbyPlaces` | Bus stops, metro stations, schools, hospitals, parks, malls, supermarkets, pharmacies, gyms and restaurants, with distance in metres |
| `photos`, `photoCount` | Full-size photo URLs; `photoCount` is the listing's total |
| `videoUrl`, `virtualTourUrl` | When the listing has them |
| `advertiserName`, `advertiserType` | `agency`, `broker`, `developer`, `owner` or `other` |
| `advertiserMobilePhone`, `advertiserLandlinePhone`, `advertiserCommercialPhone`, `advertiserWhatsapp` | Phones as published on the listing |
| `advertiserCreci`, `advertiserVerified`, `advertiserUrl`, `advertiserLogo` | Licence, badge, profile page, logo |
| `advertiserGoogleRating`, `advertiserGoogleReviews`, `advertiserGoogleMapsUrl` | The agency's Google rating, review count and Maps page, when the website shows them |
| `advertiserSince` | Date the advertiser joined Chaves na Mão |
| `advertiserReference` | The advertiser's own reference code |
| `contactOptions` | Ways the listing accepts contact |
| `createdAt`, `updatedAt`, `daysOnMarket` | Listing dates and days since it was first published |
| `active`, `highlighted` | Listing flags |
| `changeType`, `previousPrice`, `firstSeenAt`, `lastSeenAt` | With a change-tracking project: `new`, `changed`, `unchanged` or `removed` since the earlier runs, the earlier price when it moved, the date the listing was first seen, and for removed listings the last day it was seen |

#### Advertiser list

Next to the dataset, each run saves `ADVERTISERS` (JSON) and `ADVERTISERS.csv` in its key-value store (the run's **Output** tab links both): one record per advertiser in the results with `advertiserName`, `advertiserType`, `advertiserCreci`, `mobilePhone`, `landlinePhone`, `commercialPhone`, `whatsapp`, `googleRating`, `googleReviews`, `listingsInResults`, `forSale`, `forRent`, `newDevelopments`, `minPrice`, `maxPrice`, `cities`, `neighborhoods`, `propertyTypes`, `advertiserUrl` and a sample listing. It is not charged.
| `raw` | With `includeRawData`: the original record |

### Pricing

| Event | When | Price |
|---|---|---|
| Apify plan | Per listing | Per 1,000 listings |
|---|---|---|
| Free | $0.0009 ($0.001 from 15 November 2026) | $0.90 ($1.00 from 15 November 2026) |
| Bronze | $0.0009 | $0.90 |
| Silver | $0.00075 | $0.75 |
| Gold, Platinum, Diamond | $0.00065 | $0.65 |

Plus one actor start per run: $0.0009 per GB of run memory. All photos, advertiser contacts and change tracking are included in the listing price. Unchanged listings left out by **Only new or changed** are not charged; a `removed` row is charged as a listing. The advertiser list is free.

### Free tier

| | Free Apify account |
|---|---|
| Listings per run | up to **100** |
| Searches per run | **1** (the first URL or location) |

Enough to check the fields against your own search. Paid plans lift both caps.

### FAQ

**Do I need a proxy?** No. The default works out of the box and retries failed requests automatically, at no extra cost to you. The proxy field takes your own proxy URLs if you prefer; Apify Proxy is not used.

**What do I type in Locations?** A city (`Belo Horizonte`), a neighbourhood or zone with its city (`Savassi, Belo Horizonte`, `Zona Norte, Rio de Janeiro`), a street (`Avenida Paulista`), a state code (`MG`) or `Brasil`. Accents and capitals do not matter. If a name exists in several places, the one with the most listings is used: `Pinheiros` alone is the São Paulo neighbourhood, and `Pinheiros, ES` is the city in Espírito Santo. The log shows which place each location matched.

**How long does a run take?** Measured on Apify on 31 October 2026: 2,000 São Paulo listings in 38 seconds and 3,000 Rio de Janeiro rentals in 53 seconds. **All photos** adds one request per listing and slows a run down.

**How do I get every listing in a city?** Type the city and set `maxItems` to `0`. The actor splits the search into price ranges that each fit under the website's 1,500-result limit. Listings without an asking price are picked up from the first 1,500 of the unsplit search.

**How do I get only new listings and price changes every day?** Schedule the actor with a `trackChangesProject` name and `onlyNewOrChanged: true`. The first run returns everything as `new`; each later run returns listings that appeared or whose price, fees, title, size, photos or construction stage changed, with `previousPrice` filled when the price moved, plus a `removed` row for each listing Chaves na Mão no longer has. Removed listings are only checked when a search is read to the end, so set `maxItems` to `0` (or high enough) on monitoring runs. The project's memory is kept in a key-value store named `chavesnamao-change-tracking` in your own Apify account.

**Why does a narrow search return fewer listings than the website shows?** When a search matches few listings, the website pads the page with "similar" listings that do not match your filters. The actor keeps only the exact matches.

**Why is the street empty on some listings?** The advertiser chose not to show the address. Neighbourhood, city and coordinates are still filled.

**Are owner phone numbers included?** Phones are included exactly as Chaves na Mão shows them on the listing. Many owners list through an agency; owners advertising directly appear with `advertiserType: "owner"`.

### Support

Found a bug or need a field? Open an issue on the actor's Issues tab.

### Additional services

Need a custom field, another Brazilian portal or a scheduled export to your database? Open an issue and describe what you need.

### Explore more scrapers

- [ZAP Imóveis Scraper](https://apify.com/memo23/zapimoveis-scraper)
- [VivaReal Property Scraper](https://apify.com/memo23/vivareal-property-scraper)
- [QuintoAndar Scraper](https://apify.com/memo23/quintoandar-scraper)
- [OLX Marketplace Scraper](https://apify.com/memo23/olx-marketplace-scraper)

### 🤖 For AI Agents & LLM Apps

**Purpose:** Turn a Brazilian place name, coordinates, or Chaves na Mão search or listing URLs into structured property listings for sale, rent or new developments, with the advertiser's phones and WhatsApp.

**Minimal input (tested):**

```json
{ "locations": ["Pinheiros, São Paulo"], "dealType": "rent", "maxItems": 20 }
```

or

```json
{ "startUrls": ["https://www.chavesnamao.com.br/apartamentos-para-alugar/sp-sao-paulo/pinheiros/"], "maxItems": 20 }
```

**Output fields (flat):** `listingId`, `url`, `title`, `transaction`, `propertyType`, `price`, `condoFee`, `iptu`, `bedrooms`, `bathrooms`, `suites`, `parkingSpaces`, `usableAreaM2`, `totalAreaM2`, `street`, `neighborhood`, `zone`, `city`, `state`, `zipCode`, `latitude`, `longitude`, `description`, `features[]`, `condoFeatures[]`, `nearbyPlaces[]`, `photos[]`, `advertiserName`, `advertiserType`, `advertiserMobilePhone`, `advertiserLandlinePhone`, `advertiserWhatsapp[]`, `advertiserCreci`, `advertiserGoogleRating`, `createdAt`, `updatedAt`.

**Behaviors agents should know:**

- `locations` take a city, `Neighbourhood, City`, `Zone, City`, a street, a state code or `Brasil`; `dealType` picks `sale`, `rent`, `any` or `new`.
- Filters (`minPrice`, `maxPrice`, `minArea`, `maxArea`, `minBedrooms`, `minBathrooms`, `minParkingSpaces`, `propertyTypes`, `amenities`, `nearby`, `listedBy`, `petFriendly`) apply to every search.
- `maxItems: 0` returns the full search, split past the 1,500-result limit by price.
- Prices are numbers in BRL. Phones are strings in Brazilian format.
- `trackChangesProject` + `onlyNewOrChanged: true` turns a scheduled run into a feed of new, changed and removed listings.
- Each run also stores a per-advertiser summary in its key-value store: `ADVERTISERS` (JSON) and `ADVERTISERS.csv`.
- Billing is per dataset row plus one actor start. Cap spend with `maxItems` and `maxItemsPerSearch`.
- No login, API key or proxy setup needed.

### ⚠️ Disclaimer

This actor collects publicly available listing data from ChavesNaMao.com.br, including the contact details advertisers publish on their listings. Use it in line with Chaves na Mão's Terms of Use and applicable law, including Brazil's LGPD: contact details of individual owners are personal data, and you need a lawful basis to store or use them. You are responsible for how you use the data. The actor does not bypass logins or access controls.

### SEO Keywords

Chaves na Mão scraper, chavesnamao scraper, lançamentos imobiliários, imóveis na planta, Chaves na Mão API, chavesnamao.com.br data, imóveis à venda scraper, imóveis para alugar scraper, apartamentos à venda São Paulo, Brazil real estate scraper, Brazil property data, real estate leads Brazil, imobiliárias contatos, corretores de imóveis telefone WhatsApp, CRECI lista, direto com o proprietário, Rio de Janeiro imóveis dados, Curitiba imóveis, Belo Horizonte imóveis, condomínio IPTU dados, real estate Brazil API, Chaves na Mão CSV, Chaves na Mão JSON, Apify Chaves na Mão.

# Actor input Schema

## `locations` (type: `array`):

Places to search, one per line. A city (<code>São Paulo</code>, <code>Campinas</code>), a neighbourhood or zone with its city (<code>Pinheiros, São Paulo</code>, <code>Zona Sul, Rio de Janeiro</code>), a street (<code>Avenida Paulista</code>), a state code (<code>SP</code>) or <code>Brasil</code> for the whole country. When a name exists in several places, the one with the most listings is used; add the city or state after a comma to pick another. Leave empty (with no URLs or coordinates) to search all of Brazil.

## `placeType` (type: `string`):

Optional. Forces how each location is matched, for names that are both a city and a neighbourhood (Pinheiros is a city in Espírito Santo and a neighbourhood of São Paulo). Leave on Any for the best match.

## `latitude` (type: `number`):

Optional. With longitude, searches the city nearest to this point. Example: -23.5505 (São Paulo).

## `longitude` (type: `number`):

Optional. Example: -46.6333 (São Paulo).

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

Optional. Pages copied from chavesnamao.com.br, any mix.<br><br>🔍 <b>Search</b>: run a search on the website with any filters and copy the address bar, e.g. <code>https://www.chavesnamao.com.br/apartamentos-para-alugar/sp-sao-paulo/pinheiros/</code>. The URL's own filters are kept.<br>🏠 <b>Listing</b>: <code>https://www.chavesnamao.com.br/imovel/.../id-43457908/</code><br><br>Each listing becomes one row.

## `dealType` (type: `string`):

Applies to Locations and coordinates. Pasted search URLs already say which. <b>Sale and rent</b> returns both in one search; <b>New developments</b> returns launches (lançamentos) on plan, under construction or ready to move in.

## `constructionStages` (type: `array`):

With Listing kind = New developments. Leave empty for every stage.

## `propertyTypes` (type: `array`):

Leave empty for every type.

## `minPrice` (type: `integer`):

Asking price for sales, monthly rent for rentals. Example: 300000.

## `maxPrice` (type: `integer`):

Example: 900000.

## `minArea` (type: `integer`):

Example: 50.

## `maxArea` (type: `integer`):

Example: 120.

## `minBedrooms` (type: `integer`):

Example: 2 keeps listings with 2 or more bedrooms.

## `minBathrooms` (type: `integer`):

Example: 2.

## `minParkingSpaces` (type: `integer`):

Example: 1.

## `listedBy` (type: `string`):

All advertisers, owners selling or renting directly (direto com o proprietário), or real estate agencies only. Not used for new developments.

## `amenities` (type: `array`):

Keeps listings that advertise these features. Leave empty for no restriction.

## `nearby` (type: `array`):

Keeps listings the website marks as within about 1 km of these.

## `petFriendly` (type: `boolean`):

Only listings that accept pets.

## `sortBy` (type: `string`):

Order of results. Decides which listings you get when Max listings is lower than the search total.

## `maxItems` (type: `integer`):

Maximum listings for the whole run, across all searches. Default 5,000. Set 0 for everything the searches match: large cities hold hundreds of thousands, and the actor splits a big search by price range so it is not stopped at the website's 1,500-result limit. Free Apify plans are capped at 100 listings and the first search per run.

## `maxItemsPerSearch` (type: `integer`):

Optional. Caps each location, coordinate search or search URL on its own, so the first big place does not use up Max listings. Example: 500.

## `includeAllPhotos` (type: `boolean`):

Search results carry each listing's first 5 photos. Turn on to get every photo (often 20-30). Slower, no extra charge.

## `includeRawData` (type: `boolean`):

Adds a raw field with the listing exactly as the website returns it, for fields this actor does not map. Makes rows larger.

## `saveAdvertisers` (type: `boolean`):

Saves one record per agency, broker or owner in the results (contacts, CRECI, Google rating, listings for sale and rent, price range, cities, neighbourhoods) to the run's key-value store as <code>ADVERTISERS</code> (JSON) and <code>ADVERTISERS.csv</code>. Not charged.

## `trackChangesProject` (type: `string`):

Optional. Any name, e.g. <code>sp-rentals-daily</code>. Each run with the same name marks every row <code>new</code>, <code>changed</code> (price, fees, title, size, photos or stage) or <code>unchanged</code> against the earlier runs, and adds <code>previousPrice</code> and <code>firstSeenAt</code>. Use one name per scheduled search.

## `onlyNewOrChanged` (type: `boolean`):

With a change-tracking project: leave unchanged listings out of the dataset. You are not charged for them.

## `includeRemoved` (type: `boolean`):

With a change-tracking project: when a search is read to the end, listings from earlier runs that Chaves na Mão no longer has come back once as rows with <code>changeType: "removed"</code>, their last price and the last day they were seen. Listings still online but no longer matching the search are not reported.

## `maxConcurrency` (type: `integer`):

Result pages read at the same time. Default 4.

## `proxy` (type: `object`):

Leave empty: the default works out of the box. To use your own proxies, add their URLs here. Apify Proxy is not used by this actor.

## Actor input object example

```json
{
  "locations": [
    "São Paulo"
  ],
  "placeType": "",
  "dealType": "sale",
  "listedBy": "all",
  "petFriendly": false,
  "sortBy": "relevance",
  "maxItems": 5000,
  "includeAllPhotos": false,
  "includeRawData": false,
  "saveAdvertisers": true,
  "onlyNewOrChanged": false,
  "includeRemoved": true,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

## `advertisers` (type: `string`):

No description

## `advertisersCsv` (type: `string`):

No description

# 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 = {
    "locations": [
        "São Paulo"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/chaves-na-mao-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 = { "locations": ["São Paulo"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/chaves-na-mao-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 '{
  "locations": [
    "São Paulo"
  ]
}' |
apify call memo23/chaves-na-mao-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/chaves-na-mao-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/gFQiaRugVSaYmJSgi/builds/mlO3f5Zg5xueaDPcN/openapi.json
