# Imovelweb Scraper (`parsebird/imovelweb-scraper`) Actor

Scrape property listings from Imovelweb.com.br — Brazil's leading real estate portal. Extract prices, rooms, area, location, features, seller contacts, and images for sale, rent, and auction listings.

- **URL**: https://apify.com/parsebird/imovelweb-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 property 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?

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

### Imovelweb Scraper

Imovelweb Scraper extracts property listings from [Imovelweb.com.br](https://www.imovelweb.com.br), Brazil's leading real estate portal, without writing a single line of scraping code.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search by deal type, location, property type/subtype, bedrooms, bathrooms, parking, price, area, 30+ condominium and in-unit features, and more — get clean, structured Brazilian real estate data ready for analysis, lead generation, or market monitoring.
</td>
</tr></table>

##### Copy to your AI assistant

```
Use the Apify Actor "parsebird/imovelweb-scraper" (Imovelweb Scraper) to extract property listings from imovelweb.com.br. Call it with the ApifyClient: `from apify_client import ApifyClient; client = ApifyClient("<APIFY_TOKEN>"); run = client.actor("parsebird/imovelweb-scraper").call(run_input={"deal_type": "sale", "location": "Sao Paulo, SP", "property_type": ["apartment"], "min_bedroom": "2", "max_price": 1200000, "limit": 100})`. Key inputs: deal_type (sale/rent/auction/temporary/newly_built, default sale), location (city/neighborhood/street, e.g. "Sao Paulo, SP"), property_type (array: apartment/house/land/commercial/rural), property_subtype (array of 22 subtypes), min_bedroom/max_bedroom/min_bathroom/min_parking (strings "1"-"5"), min_price/max_price (BRL integers), min_sqm/max_sqm/min_usable_sqm/max_usable_sqm (integers), common_feature_ids/private_feature_ids (arrays of 20/16 amenity IDs), near_transit (boolean), max_antiquity, publication_days, publisher_type (ALL/COMPANY/PARTICULAR), multimedia_types, and limit (max listings). Output is one JSON object per listing with record_type, record_id, source_context, entity, listing, pricing, availability, property, location, media, contact_details, relationships, metrics, and attributes fields. Full API spec: https://apify.com/parsebird/imovelweb-scraper/api. Get an API token at https://console.apify.com/account/integrations.
```

### What does Imovelweb Scraper do?

Imovelweb Scraper is an **Imovelweb.com.br API alternative** that crawls property search results and listing detail pages, then returns structured data: price, address, coordinates, bedrooms, bathrooms, parking, usable and total area, condominium/in-unit features, publication date, seller contact (including WhatsApp), and photo galleries.

- 🏠 Search **sale, rent, auction, seasonal (temporada), and newly built (lançamentos)** listings
- 📍 Search any Brazilian city, neighborhood, district, avenue, or street
- 🧱 Filter by **5 broad property types** and **22 specific subtypes** (apartment, studio, kitnet, penthouse, house, townhouse, farm, warehouse, and more)
- 🛏️ Filter by bedrooms, bathrooms, parking spaces, price, total area, and usable area
- 🏊 Filter by **20 condominium/building features** (pool, elevator, 24-hour concierge, playground…) and **16 private/in-unit features** (air conditioning, suites, pets allowed, home office…)
- 📅 Filter by recency (published today, this week, this month) and by advertiser type (agency vs. private owner)
- 📊 Runs on the Apify platform: schedule recurring runs, trigger via API or webhook, and export results as **JSON, CSV, Excel, or HTML**
- 🆓 New Apify accounts get a free-usage trial, enough to test Imovelweb Scraper before committing to a paid plan

### What data can you extract from Imovelweb.com.br?

| Field | Description |
|---|---|
| `record_id` | Stable Imovelweb listing ID, for dedupe/idempotent upserts |
| `entity.title` / `entity.description` | Listing title and marketing description |
| `pricing.amount` / `pricing.currency` | Asking price and currency (BRL) |
| `property.rooms` | Bedrooms, bathrooms, suites, parking spaces |
| `property.area` | Usable area and total area (m²) |
| `location` | Full address, neighborhood, city, state, and GPS coordinates |
| `media.images` | Photo gallery URLs |
| `contact_details.whatsapp` | Seller/agency WhatsApp number |
| `relationships.seller` | Advertiser name and tier (agency vs. private owner) |
| `listing.deal_type` / `listing.listed_at` | Sale/rent/auction type and publication date |
| `attributes.source_specific.raw_source_data` | Full preserved source payload for advanced use cases |

### How to scrape Imovelweb.com.br

1. Open Imovelweb Scraper in the [Apify Console](https://console.apify.com) and click **Try for free**.
2. Set `deal_type` (e.g. `sale`) and `location` (e.g. `Sao Paulo, SP` — including the state abbreviation gives the most accurate match).
3. Optionally narrow results with `property_type`, `property_subtype`, bedroom/bathroom/parking minimums, `min_price`/`max_price`, area filters, and the `common_feature_ids` / `private_feature_ids` amenity filters.
4. Set `limit` to cap how many listings to collect, and click **Start**.
5. Download results as JSON, CSV, or Excel from the **Storage** tab, or pull them via the [Dataset API](https://docs.apify.com/api/v2#/reference/datasets).

### How much does it cost to scrape Imovelweb.com.br?

Imovelweb Scraper uses [pay-per-event pricing](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-event-pricing) — you only pay for listings actually returned, no compute-unit math required.

| Plan | Price per listing | Price per 1,000 listings |
|---|---|---|
| Free | $0.0015 | **$1.50** |
| Bronze | $0.0014 | **$1.40** |
| Silver | $0.0013 | **$1.30** |
| Gold | $0.0012 | **$1.20** |

Example: collecting 1,000 apartment listings for sale in São Paulo costs $1.50 on the Free plan. New Apify accounts include free platform credit, enough to test Imovelweb Scraper at no cost.

### Input / Output

The input schema exposes every filter above through the Apify Console UI, or as JSON via the API — no need to hand-craft Imovelweb search URLs.

```json
{
  "deal_type": "sale",
  "location": "Sao Paulo, SP",
  "property_type": ["apartment"],
  "min_bedroom": "2",
  "max_price": 1200000,
  "publication_days": "up_to_7_days",
  "limit": 100
}
```

Output — one JSON object per listing:

```json
{
  "record_type": "property_listing",
  "record_id": "3011654662",
  "entity": {
    "title": "Casa com 3 dormitórios à venda, 336m² - Urbanova - SJCampos",
    "url": "https://www.imovelweb.com.br/propriedades/casa-com-3-dormitorios-a-venda-336m-urbanova-3011654662.html"
  },
  "pricing": { "amount": 1700000, "currency": "BRL" },
  "property": {
    "rooms": { "bedrooms": 4, "bathrooms": 3, "parking_spaces": 2 },
    "area": { "usable_area": 336, "total_area": 350 }
  },
  "location": { "city": "São José dos Campos", "state_code": "SP" }
}
```

Results can be downloaded as **JSON, CSV, Excel, or HTML** from the Storage tab, or fetched via the [Apify API](https://docs.apify.com/api/v2).

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("parsebird/imovelweb-scraper").call(run_input={
    "deal_type": "sale",
    "location": "Sao Paulo, SP",
    "property_type": ["apartment"],
    "limit": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["entity"]["title"], item["pricing"]["amount"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('parsebird/imovelweb-scraper').call({
    deal_type: 'sale',
    location: 'Sao Paulo, SP',
    property_type: ['apartment'],
    limit: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use cases

- **Market research** — track average price per m² by neighborhood or city over time.
- **Lead generation** — build a list of private-owner (`PARTICULAR`) listings for direct outreach.
- **Portfolio monitoring** — re-run on a schedule to catch new listings matching your investment criteria.
- **Feed a PropTech app** — combine with [Data Deduplicator](https://apify.com/parsebird/dataset-deduplicator) to keep a clean, de-duplicated property feed.
- **Competitive analysis** — compare listing counts and pricing across agencies (`publisher_type`).

### Is it legal to scrape Imovelweb.com.br?

Yes. Imovelweb Scraper only collects publicly available listing data, the same information any visitor sees on Imovelweb.com.br. Scraping publicly accessible data is generally legal, but you're responsible for complying with Imovelweb's terms of service and applicable data protection laws (such as Brazil's LGPD) for your specific use case. See Apify's [blog post on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) for more detail.

### Related Actors

- [Data Deduplicator](https://apify.com/parsebird/dataset-deduplicator) — remove duplicate listings across multiple scraper runs
- [HTTP Request Actor](https://apify.com/parsebird/http-request-actor) — call any REST API from your Apify workflow

### FAQ

**How fresh is the data?**
Every run fetches live data directly from Imovelweb.com.br at the time it executes — nothing is cached.

**Does this work for rent and auction listings, not just sales?**
Yes. Set `deal_type` to `rent`, `auction`, `temporary` (seasonal rentals), or `newly_built` (new developments).

**Can I search by neighborhood or street instead of a whole city?**
Yes — `location` accepts free text such as a neighborhood, district, avenue, or street name. For city-level searches, including the state (e.g. `"Sao Paulo, SP"`) gives the most reliable match.

**Can I schedule recurring runs?**
Yes. Use Apify's built-in [Scheduler](https://docs.apify.com/platform/schedules) to run daily, weekly, or at any interval, and trigger downstream automations via webhooks.

**Can I access this via API instead of the Console?**
Yes — every input field is available through the [Apify API](https://apify.com/parsebird/imovelweb-scraper/api), with client libraries for Python, JavaScript/Node.js, and more.

**Why is a field sometimes empty (e.g. exact title, WhatsApp, extra photos)?**
Imovelweb.com.br is protected by bot-detection that occasionally interrupts a detail page before every field loads. Core fields (price, rooms, area, address, features) come from the search results and are always populated; a handful of detail-only fields fall back to a generated value (e.g. a title built from property type and location) when the detail page can't be fully read on that attempt.

**Found a bug or missing field?**
Please open an issue on the Actor's **Issues** tab — feedback is reviewed regularly and helps prioritize fixes.

# Actor input Schema

## `deal_type` (type: `string`):

Overall listing intent to search for.

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

Place to search in Brazil — a city, neighborhood, district, avenue, or street. For best accuracy on cities, include the state, e.g. 'Sao Paulo, SP'.

## `property_type` (type: `array`):

Broad property categories to include. Leave empty to search all types.

## `property_subtype` (type: `array`):

More specific property formats to keep. Leave empty to include all subtypes.

## `min_bedroom` (type: `string`):

Minimum bedroom count.

## `max_bedroom` (type: `string`):

Maximum bedroom count.

## `min_bathroom` (type: `string`):

Minimum bathroom count.

## `min_parking` (type: `string`):

Minimum number of parking spaces.

## `min_price` (type: `integer`):

Minimum listing price in BRL. Leave empty for no minimum.

## `max_price` (type: `integer`):

Maximum listing price in BRL. Leave empty for no maximum.

## `min_sqm` (type: `integer`):

Minimum total area in square meters.

## `max_sqm` (type: `integer`):

Maximum total area in square meters.

## `min_usable_sqm` (type: `integer`):

Minimum usable (private) area in square meters.

## `max_usable_sqm` (type: `integer`):

Maximum usable (private) area in square meters.

## `common_feature_ids` (type: `array`):

Shared building or condominium features to require.

## `private_feature_ids` (type: `array`):

Private or in-unit features to require.

## `near_transit` (type: `boolean`):

Keep only listings marked as near a metro station or public transit.

## `max_antiquity` (type: `string`):

Maximum property age range.

## `publication_days` (type: `string`):

Recency filter for when the listing was published.

## `publisher_type` (type: `string`):

Restrict results by advertiser type.

## `multimedia_types` (type: `array`):

Require listings to include specific media.

## `limit` (type: `integer`):

Maximum number of listings to save. Leave empty to collect all matching results the Actor can reach.

## `proxyConfiguration` (type: `object`):

Imovelweb.com.br is protected by bot-detection. Brazil-based residential proxies are strongly recommended.

## Actor input object example

```json
{
  "deal_type": "sale",
  "location": "Sao Paulo",
  "property_type": [],
  "property_subtype": [],
  "min_bedroom": "",
  "max_bedroom": "",
  "min_bathroom": "",
  "min_parking": "",
  "common_feature_ids": [],
  "private_feature_ids": [],
  "near_transit": false,
  "max_antiquity": "",
  "publication_days": "",
  "publisher_type": "ALL",
  "multimedia_types": [],
  "limit": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "deal_type": "sale",
    "location": "Sao Paulo",
    "limit": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/imovelweb-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 = {
    "deal_type": "sale",
    "location": "Sao Paulo",
    "limit": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/imovelweb-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 '{
  "deal_type": "sale",
  "location": "Sao Paulo",
  "limit": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  }
}' |
apify call parsebird/imovelweb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/imovelweb-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/k1JzcRUbul60wPFqC/builds/vTKDMO6ufbGbSJbMf/openapi.json
