# Caixa Imóveis Leilão Scraper - Brazil Property Auctions (`dami_studio/caixa-imoveis-leilao-scraper`) Actor

Every repossessed property Caixa Econômica Federal has for sale, across all 27 Brazilian states. Minimum bid, appraisal, discount, auction dates, occupancy, payment rules, matrícula and edital PDF links. Filter by state, city, sale type, property type, price and minimum discount.

- **URL**: https://apify.com/dami\_studio/caixa-imoveis-leilao-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 property returneds

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?

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

## Caixa Imóveis Leilão Scraper

Caixa Econômica Federal is the largest seller of repossessed property in Brazil. On any given day it
has something like fifteen thousand houses, flats, plots and shops listed, spread across 26 of the
27 states, sold four different ways, with the good ones gone in a week.

The site will show you all of it. What it will not do is let you compare it. There is no export, no
sort by discount, no "everything under R$ 150,000 in Goiás that takes financing". You click a state,
click a city, click through ten cards at a time, and open each property to find out when the auction
is and whether somebody is still living in it.

This actor does that clicking for you and hands back a table.

### What you get

One row per property. Every field below comes off Caixa's own pages. Nothing is estimated, nothing
is filled in from elsewhere.

**Money**

| Field | What it is |
|---|---|
| `appraisedValueBrl` | Caixa's own valuation of the property |
| `minimumBidBrl` | the least you can pay. On a Leilão SFI this is the first-round figure |
| `minimumBidSecondRoundBrl` | the second-round figure, usually a long way below the first |
| `discountPercent` | how far the minimum sits under the appraisal |
| `discountPercentSecondRound` | the same for the second round |

**When and how it sells**

`saleMode`, `auctionDate`, `secondAuctionDate`, `onlineSaleEndsAt`, `auctionNoticeNumber` (the
edital), `itemNumber`, `auctioneer`, `auctioneerSite`.

**The property**

`propertyType`, `bedrooms`, `garageSpaces`, `totalAreaSqm`, `privateAreaSqm`, `landAreaSqm`,
`description`, `city`, `neighbourhood`, `addressFull`, `postalCode`, `state`, `photoUrls`.

**The paperwork**

`registrationNumber` (matrícula), `judicialDistrict` (comarca), `registryOffice` (ofício),
`municipalRegistration` (inscrição imobiliária), `negativeAuctionNote` (averbação dos leilões
negativos), `occupancyStatus`.

**What you are allowed to pay with**

`paymentMethods` as Caixa words it, plus `acceptsFgts`, `acceptsFinancing`, `acceptsConsortium` and
`cashOnly` derived from it. Also `condoFeeRule` and `propertyTaxRule`: who picks up the arrears,
which on an occupied flat with three years of unpaid condomínio is not a small question.

**Links**

`listingUrl`, `deedPdfUrl` (the matrícula), `noticePdfUrl` (the edital and its annexes),
`noticePublishedAt`.

### The four ways Caixa sells

You will see all four in the `saleMode` field, and they are not interchangeable.

- **Leilão SFI - Edital Único.** A public auction with two rounds on two dates. The first round
  usually opens at the full appraisal, which is why so many rows show a 0% first-round discount; the
  second round is where the 30–50% cuts appear. Both dates and both minimums are in the row.
- **Licitação Aberta.** Competing offers on a single date, above a stated minimum. One date, one
  minimum.
- **Venda Online.** A fixed price with a deadline. No hammer, no rounds. `onlineSaleEndsAt` is when
  it closes. This is the largest group by volume.
- **Venda Direta Online.** Direct purchase, also at a fixed price.

There is a fifth, *Exercício de Direito de Preferência*, which Caixa keeps in its filter list. It is
almost always empty.

### Input

```json
{
  "states": ["SP", "RJ"],
  "cities": ["Campinas", "Niteroi"],
  "saleMode": "leilao-sfi",
  "propertyType": "apartamento",
  "minBedrooms": "2",
  "priceBand": "ate-100k",
  "acceptsFinancing": "S",
  "minDiscountPercent": 30,
  "maxPriceBrl": 250000,
  "includeAuctionDetails": true,
  "maxItems": 200
}
```

Only `states` is really required, and you can drop even that if you paste specific properties into
`propertyUrls` instead: either the full page URL or the bare property number off the listing.

City names are matched loosely: case and accents are ignored, so `sao jose do rio preto` finds
`SAO JOSE DO RIO PRETO`. If a city you asked for has nothing for sale today, the run says so and
names the cities in that state that do, rather than silently returning a short list.

`minDiscountPercent` and `maxPriceBrl` are applied after each listing is read, and anything they drop
is not charged.

### Two levels of detail

`includeAuctionDetails` is on by default and opens every property's own page. That is where the
auction dates, the occupancy, the registry details, the payment rules and the two PDF links live.
It costs the same per property either way.

Turn it off and the actor reads the result list only. Measured on a 120-property run: 21 seconds
instead of 30. What you lose is real, though: no auction dates, no PDFs, no occupancy, no comarca or
CEP, and the appraisal and discount only come through on the fixed-price listings, because Caixa's
auction cards show the price alone. Use it when you want a fast inventory sweep and will open the
interesting ones afterwards.

### Sample row

```json
{
  "propertyId": "8787704299058",
  "propertyNumber": "878770429905-8",
  "state": "SP",
  "city": "ITUPEVA",
  "neighbourhood": "COND RES RESERVA MONT SERRAT",
  "addressFull": "EST. MUN. VEREADOR WALDOMIRO FREGNHANI,N. 551 APTO. 01 BL 08 TIPO B, MONTE SERRAT - CEP: 13299-000, ITUPEVA - SAO PAULO",
  "postalCode": "13299-000",
  "propertyType": "Apartamento",
  "occupancyStatus": "Ocupado",
  "bedrooms": 2,
  "garageSpaces": 1,
  "totalAreaSqm": 105.42,
  "privateAreaSqm": 45.91,
  "appraisedValueBrl": 255000,
  "minimumBidBrl": 255000,
  "minimumBidSecondRoundBrl": 153000,
  "discountPercent": 0,
  "discountPercentSecondRound": 40,
  "saleMode": "Leilão SFI",
  "auctionNoticeNumber": "0048/0226 - CPA/RE",
  "itemNumber": "473",
  "auctioneer": "CIRLEI FREITAS BALBINO DA SILVA",
  "auctionDate": "2026-10-14T10:00:00",
  "secondAuctionDate": "2026-10-20T10:00:00",
  "registrationNumber": "172088",
  "judicialDistrict": "JUNDIAI-SP",
  "registryOffice": "01",
  "paymentMethods": ["Recursos próprios.", "Permite utilização de FGTS. Consulte condições e enquadramento."],
  "acceptsFgts": true,
  "acceptsFinancing": false,
  "cashOnly": false,
  "condoFeeRule": "Condomínio: Sob responsabilidade do comprador.",
  "propertyTaxRule": "Tributos: Sob responsabilidade do comprador.",
  "deedPdfUrl": "https://venda-imoveis.caixa.gov.br/editais/matricula/SP/8787704299058.pdf",
  "noticePdfUrl": "https://venda-imoveis.caixa.gov.br/editais/EL00480226CPARE.PDF",
  "listingUrl": "https://venda-imoveis.caixa.gov.br/sistema/detalhe-imovel.asp?hdnimovel=8787704299058"
}
```

That is a real row from a real run. Note the first-round minimum sitting at the full appraisal and the
second round 40% below it. That pattern is the whole reason people watch this stock.

### What this does not do

Read this part before you buy anything.

- **It does not tell you whether the property is a good idea.** It reports what Caixa published. The
  matrícula and the edital are the documents that matter, and the links are in every row for exactly
  that reason. Occupied properties, properties with unpaid condomínio, and properties where eviction
  is the buyer's problem all look identical in a spreadsheet.
- **`occupancyStatus` needs checking.** Caixa still puts the value in the page but no longer shows it
  to visitors. The actor reports what is there. Treat it as a hint and confirm it against the edital,
  because "Ocupado" versus "Desocupado" is the single biggest swing in what a lot is actually worth.
- **Listings vanish without notice.** Caixa removes a property the moment it sells or is pulled. An id
  from last week's export can stop answering, and when that happens you get an uncharged diagnostic
  row saying so rather than a guess.
- **Blank fields are usually blank at the source.** Land and commercial units have no bedroom count.
  Plenty of listings have no photo. Some descriptions are a single full stop. None of that is
  invented or filled in.
- **Bedroom and garage filters quietly exclude land.** Caixa only records those for houses and flats,
  so asking for two bedrooms removes every terreno from the result.
- **The two fixed-price sale types look identical on a property page.** Venda Online and Venda Direta
  Online carry no heading and the same rules link, so an unfiltered run reports both as
  `Venda Online`. Set `saleMode` if you need them told apart; then the label is exact.
- **There is no square-metre filter.** Caixa's own area filter does not behave consistently. One of
  its bands returns the entire state, so it is not exposed here rather than offered and wrong. Filter
  on `totalAreaSqm` in your own sheet.
- **It does not bid, watch or notify.** It returns the state of the listings at the moment it runs.
  Schedule it daily if you want to see what changed.
- **It does not download the PDFs.** You get the URLs; the files are large and most people only want
  two or three of them.
- **Prices are in reais**, exactly as Caixa states them. No conversion.

### A note on the numbers

`discountPercent` is Caixa's own figure where Caixa prints one, and is otherwise computed as
`(appraisal − minimum) ÷ appraisal`. On a Leilão SFI, Caixa prints no discount line at all, so both
round figures are computed the same way from the appraisal.

A first-round discount of 0% is normal and not a bug. It means the auction opens at the valuation.

### Billing

You are charged once per property returned.

Free, every time: the sample row you get when the input is empty, every diagnostic row, and any
property dropped by `minDiscountPercent` or `maxPriceBrl`. A run that finds nothing returns a
diagnostic row explaining why and charges for no properties.

### FAQ

**How many properties does Caixa have listed?**
Measured on 19 September 2026: 15,739 across the country, with São Paulo at 2,132 and Rio de Janeiro
at 4,554. Amapá had none at all. The total moves every day.

**Does it cover the whole country?**
Yes. All 27 state codes are accepted, and the actor takes whichever of them currently hold stock.

**Can I get only the heavily discounted ones?**
Set `minDiscountPercent`. Properties below your threshold are dropped and not charged. Bear in mind
that on a Leilão SFI the discount you want is usually `discountPercentSecondRound`, not the first.

**Does it need a login or a Caixa account?**
No. Everything it reads is public.

**How current is the data?**
It reads the live listings at the moment the run starts, not a daily export, so a property added this
morning is in the result.

**Can I watch one property over time?**
Put its page URL or its property number in `propertyUrls` and run it on a schedule. The same row comes
back each time with whatever has changed: new dates, a new minimum, or a diagnostic once it is gone.

**Why do some rows have two auction dates and others have one?**
Sale type. Leilão SFI runs two rounds, Licitação Aberta runs one, and the online sales have a closing
deadline in `onlineSaleEndsAt` instead of an auction date.

**What is `negativeAuctionNote`?**
The averbação dos leilões negativos, Caixa's note on whether the failed-auction record has been
registered against the title. You will see "Averbado", "Em tratamento" or "Não se aplica".

**Can I filter by neighbourhood?**
Not on Caixa's side. Filter `neighbourhood` in your own sheet after the run.

# Actor input Schema

## `states` (type: `array`):

Two-letter Brazilian state codes, one per line: SP, RJ, MG, GO, BA and so on. Caixa holds stock in 26 of the 27 states on any given day. Leave empty only if you are pasting property pages below.

## `cities` (type: `array`):

City names to narrow the search inside the states above, one per line. Accents and case do not matter — "sao jose do rio preto" matches. Caixa only lists cities that have property for sale today; if none of yours does, the run says so and names the cities that do.

## `saleMode` (type: `string`):

Caixa sells the same repossessed stock four ways. Leilão SFI is the public auction with a first and second round. Licitação Aberta takes sealed competing offers on one date. Venda Online and Venda Direta Online are fixed-price sales that close on a deadline instead of a hammer.

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

Caixa's own three buckets. "Others" holds land, shops, sheds, rural plots and everything that is not a house or a flat.

## `priceBand` (type: `string`):

Caixa's own bands, applied on its side before anything is fetched. For an exact ceiling use "Maximum price" further down instead.

## `minBedrooms` (type: `string`):

Caixa records bedrooms only for houses and flats, so setting this drops land and commercial units.

## `garageSpaces` (type: `string`):

Minimum parking spaces.

## `acceptsFinancing` (type: `string`):

Most of this stock is cash-only. Set this to "Yes" to see just the properties Caixa will finance — on a typical day that is well under a tenth of a state's listings.

## `minDiscountPercent` (type: `integer`):

Keep only properties whose minimum bid is at least this far under Caixa's own appraisal. 0 keeps everything. Properties dropped here are not charged.

## `maxPriceBrl` (type: `integer`):

Exact ceiling on the minimum bid, in reais. 0 means no ceiling. Properties dropped here are not charged.

## `includeAuctionDetails` (type: `boolean`):

On (recommended): opens every property's own page and returns the auction dates, the appraisal and discount, occupancy, the registry details, the accepted payment methods and links to the matrícula and edital PDFs. Off: reads the result list only — about ten times faster, but you get no auction dates, no PDFs, no occupancy, and appraisal and discount only on the fixed-price listings.

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

Hard cap on properties returned across every state and city in this run. You are charged per property returned.

## `propertyUrls` (type: `array`):

Paste Caixa property pages (https://venda-imoveis.caixa.gov.br/sistema/detalhe-imovel.asp?hdnimovel=8787704299058) or bare property numbers (878770429905-8), one per line. Works on its own or alongside a search.

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

Optional. Leave this alone unless you need the run to go out through a particular network. Your own proxy servers are used exactly as given.

## Actor input object example

```json
{
  "states": [
    "SP"
  ],
  "cities": [],
  "includeAuctionDetails": true,
  "maxItems": 50,
  "propertyUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One row per property: id and property number, state, city, neighbourhood, full address and CEP, type, occupancy, bedrooms, garage spaces, the three area figures, Caixa's appraisal, the minimum bid (both rounds for a Leilão SFI), the discount, the sale type, edital and item number, auctioneer, auction dates or the online-sale deadline, matrícula, comarca, registry office, municipal registration, accepted payment methods, who pays the condo fees and taxes, links to the matrícula and edital PDFs, photos and the listing URL. Empty input, an unknown state or a property Caixa has withdrawn writes an uncharged sample or diagnostic row instead.

# 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 = {
    "states": [
        "SP"
    ],
    "cities": [],
    "saleMode": "",
    "propertyType": "",
    "priceBand": "",
    "minBedrooms": "",
    "garageSpaces": "",
    "acceptsFinancing": "",
    "minDiscountPercent": 0,
    "maxPriceBrl": 0,
    "includeAuctionDetails": true,
    "maxItems": 50,
    "propertyUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/caixa-imoveis-leilao-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 = {
    "states": ["SP"],
    "cities": [],
    "saleMode": "",
    "propertyType": "",
    "priceBand": "",
    "minBedrooms": "",
    "garageSpaces": "",
    "acceptsFinancing": "",
    "minDiscountPercent": 0,
    "maxPriceBrl": 0,
    "includeAuctionDetails": True,
    "maxItems": 50,
    "propertyUrls": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/caixa-imoveis-leilao-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 '{
  "states": [
    "SP"
  ],
  "cities": [],
  "saleMode": "",
  "propertyType": "",
  "priceBand": "",
  "minBedrooms": "",
  "garageSpaces": "",
  "acceptsFinancing": "",
  "minDiscountPercent": 0,
  "maxPriceBrl": 0,
  "includeAuctionDetails": true,
  "maxItems": 50,
  "propertyUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call dami_studio/caixa-imoveis-leilao-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/caixa-imoveis-leilao-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/jlIOuhaShHqZiLsle/builds/9LoKO4lnp8rbVKfxd/openapi.json
