# Lugar Certo Property Extractor (`kawsar/lugar-certo-property-extractor`) Actor

Lugar Certo scraper that extracts property listings from any search URL, so you get price, area, bedrooms, location, and images as ready to use JSON, CSV, or Excel.

- **URL**: https://apify.com/kawsar/lugar-certo-property-extractor.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 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.
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

## Lugar Certo Property Extractor

Extract real estate listings from **Lugar Certo**, one of Brazil's largest property portals. Paste any search URL and get every listing back as clean, structured data: price, size, location, bedrooms, images, and a direct link to each property.

No login, no browser extensions, no manual copy and paste. Point it at a search, set a limit, and export to JSON, CSV, or Excel.

***

### What you can do with it

- **Build lead lists** of apartments, houses, land, and commercial units for sale or rent in any Brazilian city.
- **Compare prices** across neighborhoods and property types to spot under- or over-priced listings.
- **Track new launches** (Lançamentos) as they appear on the portal.
- **Monitor a market** by scheduling the actor to run daily or weekly on the same search.
- **Power your own product** by feeding a structured property dataset into a CRM, spreadsheet, dashboard, or model.

***

### How it works

1. On Lugar Certo, run a search and apply the filters you want (city, price range, bedrooms, sale vs. rent, and so on).
2. Copy the search results URL from your browser. It contains `/busca`, for example:
   `https://estadodeminas.lugarcerto.com.br/busca`
3. Paste it into the **Search URLs** field. You can add more than one search at a time.
4. Set **Max items** to cap how many listings you want per run.
5. Run the actor.

The scraper reads the results page, extracts the structured data behind each listing card, then follows the search's own pagination until it reaches your item limit or the end of the results. Listings that appear on more than one page are removed automatically, so every record in your dataset is unique.

***

### Input

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| `searchUrls` | array of strings | Yes | — | One or more Lugar Certo `/busca` search URLs to scrape. |
| `maxItems` | integer | No | 20 | Maximum number of listings to collect per run (across all URLs). Max 1000. |
| `requestTimeoutSecs` | integer | No | 30 | Per-request timeout in seconds. |

#### Example input

```json
{
    "searchUrls": [
        "https://estadodeminas.lugarcerto.com.br/busca"
    ],
    "maxItems": 20
}
```

#### Tips for building search URLs

- Any Lugar Certo regional subdomain works (for example `estadodeminas.`, `correiobraziliense.`, or `www.lugarcerto.com.br`).
- Apply your filters on the site first, then copy the resulting `/busca` URL. Whatever the site shows, the actor collects.
- To scrape several cities or filters in one run, add each search URL to the list.

***

### Output

Each property is one record in the dataset. Fields:

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | Unique Lugar Certo listing ID. |
| `listingTitle` | string | Short listing title (type, bedrooms, parking, suites). |
| `propertyDescription` | string | Full free-text description from the advertiser. |
| `price` | number | Price as a numeric value (BRL). |
| `priceFormatted` | string | Price formatted in Brazilian style (e.g. `2.782.000,00`). |
| `area` | number | Usable area in square meters. |
| `bedrooms` | number | Number of bedrooms (quartos). |
| `bathrooms` | number | Number of bathrooms. |
| `parkingSpaces` | number | Number of parking spaces (vagas). |
| `neighborhood` | string | Neighborhood (bairro). |
| `location` | string | City and state (e.g. `Belo Horizonte - MG`). |
| `street` | string | Street name, when published. |
| `address` | string | Full address, when published. |
| `section` | string | Listing section: sale, rent, or new launch (Lançamento). |
| `deliveryDeadline` | string | Delivery deadline for off-plan units, when published. |
| `advertiserCode` | string | Internal advertiser/agency code. |
| `photoCount` | number | Number of photos on the listing. |
| `imageUrl` | string | URL of the main listing image. |
| `listingUrl` | string | Direct link to the full listing page. |
| `sourceUrl` | string | The search URL this listing came from. |
| `scrapedAt` | string | UTC timestamp (ISO 8601) of when the record was collected. |

#### Example output record

```json
{
    "listingId": "10289949273",
    "listingTitle": "Apartamento, 4 Quartos, 4 Vagas, 2 Suites",
    "propertyDescription": "Aptos de 158 m2 com 4 quartos sendo 2 suites e 2 semissuites...",
    "price": 2782000,
    "priceFormatted": "2.782.000,00",
    "area": 158,
    "bedrooms": 4,
    "bathrooms": 1,
    "parkingSpaces": 4,
    "neighborhood": "Funcionarios",
    "location": "Belo Horizonte - MG",
    "street": null,
    "address": null,
    "section": "Lancamento",
    "deliveryDeadline": null,
    "advertiserCode": "ppc_coa_10000378635",
    "photoCount": 18,
    "imageUrl": "https://i.lugarcerto.com.br/.../10289949273_222964839_g.jpg",
    "listingUrl": "https://estadodeminas.lugarcerto.com.br/imovel/apartamento-4-quartos-...",
    "sourceUrl": "https://estadodeminas.lugarcerto.com.br/busca",
    "scrapedAt": "2026-09-02T08:31:32Z"
}
```

Some fields may be `null` when the advertiser did not publish that detail (street and full address are often withheld on the search page).

***

### Exporting your data

After a run finishes, open the run's **Storage** tab and export the dataset as:

- **JSON** for developers and APIs
- **CSV** or **Excel** for spreadsheets and analysts
- A live **API endpoint** to pull results into another system

You can also fetch results programmatically with the Apify API or any of the Apify client libraries.

***

### Running the actor

**From the Apify Console:** fill in the input form and click **Start**.

**On a schedule:** attach the actor to a Schedule to run it automatically (for example every morning) and keep a fresh dataset of a market you follow.

**Via API:** call the actor's run endpoint with your input JSON and read the dataset when the run completes.

***

### How much you get per run

- `maxItems` defaults to **20** so a quick test run stays fast and cheap. Raise it up to 1000 when you want a full sweep.
- The actor paginates in the same order the site shows, so the first results you get match the top of the search.
- If you add several search URLs, the item limit is shared across all of them for the run.

***

### Frequently asked questions

**Which Lugar Certo pages does it support?**
Any search results page, that is any URL containing `/busca` on a Lugar Certo domain or regional subdomain.

**Can I scrape a single property page directly?**
This actor is built for search results. Give it a `/busca` URL and it returns every matching property, each with its own `listingUrl` you can open.

**Does it handle sale and rental listings?**
Yes. Filter the search however you like on the site (sale, rent, or launches), and the `section` field tells you which category each listing belongs to.

**Why is a field empty?**
The search page only carries what the advertiser published there. Details like street and full address are frequently omitted at the search level.

**Will duplicates show up?**
No. Listings that repeat across pages are de-duplicated by their listing ID.

***

### Notes

- Text is returned in UTF-8, so Portuguese accents come through correctly (for example `Funcionários`).
- If a search returns no records, confirm the URL is a Lugar Certo `/busca` page and that the search itself has results on the site.

# Actor input Schema

## `searchUrls` (type: `array`):

One or more Lugar Certo search result pages (the /busca URL after you apply filters such as city, price, or number of bedrooms). The scraper paginates through each search and collects every listing until the item limit is reached.

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

Maximum number of property listings to collect per run across all search URLs.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## Actor input object example

```json
{
  "searchUrls": [
    "https://estadodeminas.lugarcerto.com.br/busca"
  ],
  "maxItems": 20,
  "requestTimeoutSecs": 30
}
```

# Actor output Schema

## `properties` (type: `string`):

Extract Lugar Certo real estate listings with price, area, bedrooms, location, and images from any search URL.

# 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 = {
    "searchUrls": [
        "https://estadodeminas.lugarcerto.com.br/busca"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/lugar-certo-property-extractor").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 = { "searchUrls": ["https://estadodeminas.lugarcerto.com.br/busca"] }

# Run the Actor and wait for it to finish
run = client.actor("kawsar/lugar-certo-property-extractor").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 '{
  "searchUrls": [
    "https://estadodeminas.lugarcerto.com.br/busca"
  ]
}' |
apify call kawsar/lugar-certo-property-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kawsar/lugar-certo-property-extractor"
        }
    }
}

```

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/BPtmwxiJQ051s8Sg8/builds/UIUViOAf4fettNRwa/openapi.json
