Idealista Scraper — Block-Resistant (ES, PT, IT)
Pricing
from $1.80 / 1,000 listing scrapeds
Idealista Scraper — Block-Resistant (ES, PT, IT)
Scrape real estate listings from Idealista Spain, Portugal and Italy.
Pricing
from $1.80 / 1,000 listing scrapeds
Rating
5.0
(1)
Developer
viralanalyzer
Maintained by CommunityActor stats
0
Bookmarked
17
Total users
3
Monthly active users
13 days ago
Last modified
Categories
Share
Idealista Spain, Portugal & Italy Real Estate Scraper 🏠 Sale, Rent & Rooms
English
Extract real estate listings from Idealista.com (Spain), Idealista.pt (Portugal), and Idealista.it (Italy). Houses, apartments, commercial locals, land plots, or shared rooms: the search URL is built from your filters, the result pages are read card by card, and pagination follows the "next" link until your limit is reached.
This Actor uses Pay-Per-Event (PPE) pricing — you pay per listing written to your dataset, with no monthly subscription and no upfront fee.
What each listing carries
Data comes from the search result cards, not from opening each property page. That is what makes a run fast, and it is also what sets the boundary: a field that the card does not print is not in the output. The full field list is 17 items, shown below.
Features
- 🌐 Multi-Country Support: Idealista Spain, Portugal, and Italy, each with its own URL grammar and
Accept-Languageheader. - 🏢 All Property Types: Apartments, Houses, Shared Rooms, Land, and Commercial offices.
- 🔑 Transaction Modes: buying (Sale), renting, and roommate sharing (Rooms).
- 💰 Pay-Per-Event Billing: charged per listing saved. A blocked run saves a diagnostic row and charges nothing.
- 🛡️ Anti-Bot Handling: stealth launch flags, cookie-consent click, randomized settle, plus screenshot and HTML dumps to the Key-Value Store on every block.
- ⚡ Card Fields: ID, title, formatted and numeric price, price per m², area, bedrooms, floor, lift, advertiser, location text, image list, listing URL, country.
Input Parameters
| Field | Type | Description | Default |
|---|---|---|---|
url | String | Direct Idealista search URL. Overrides other filters. | "" |
country | String | Country site to scrape (es, pt, it). | "es" |
transactionType | String | sale (Buy), rent (Rent), or share (Shared rooms). Shapes the URL; not copied into the output item. | "sale" |
propertyType | String | all, apartments, houses, rooms, commercial, land. Shapes the URL; not copied into the output item. | "all" |
location | String | City or region slug (e.g. madrid, lisboa, porto). | "madrid" |
priceMin | Integer | Minimum price in Euros. | None |
priceMax | Integer | Maximum price in Euros. | None |
maxListings | Integer | Maximum number of listings to extract. | 100 |
proxyConfiguration | Object | Proxy configuration. Residential proxy highly recommended. | {"useApifyProxy": true} |
Output Example
Every item has exactly these 17 fields:
{"id": "104859384","title": "Piso en venta en calle de Alcalá, Goya, Madrid","priceFormatted": "450.000 €","area": 85,"bedrooms": 2,"floor": "3º","hasLift": true,"advertiser": "Altea Real Estate","location": "Goya, Madrid","images": ["https://img3.idealista.com/blur/web_gallery-m-d/0/id.pro.es.image.bundle.webp"],"imageCount": 12,"url": "https://www.idealista.com/inmueble/104859384/","source": "Idealista","country": "ES","price": 450000,"pricePerSqm": 5294.12,"scrapedAt": "2026-05-23T06:20:00.000Z"}
| Field | Type | How it is produced |
|---|---|---|
id | string | Digits from the /inmueble/, /imovel/ or /immobile/ path. When the link has no such segment, a random idealista-xxxxxxxxx placeholder is used instead |
title | string | Text of the card's title link |
priceFormatted | string | Price text exactly as printed on the card |
area | number | null | First number in the card detail containing m² |
bedrooms | number | null | First number in the detail containing hab / quarto / stanza / dorm |
floor | string | null | Raw text of the detail containing º, planta, piano, bajo or r/c |
hasLift | boolean | null | true / false from the ascensor / elevador / ascensore detail; null when the card says nothing about it |
advertiser | string | Alt/title text of the agency logo. Defaults to the literal "Private Owner" when no logo is on the card |
location | string | Raw text of the card's description block, truncated at 300 characters |
images | string[] | http image sources on the card, logos filtered out |
imageCount | number | Length of images — photos visible on the card, not the total in the gallery |
url | string | Absolute listing URL |
source | string | Constant Idealista |
country | string | ES, PT or IT, from your country input |
price | number | null | priceFormatted with every non-digit stripped |
pricePerSqm | number | null | price / area, rounded to 2 decimals; null when either side is missing |
scrapedAt | string | ISO-8601 extraction timestamp |
Use Cases
- 📊 Market Valuation: track asking prices and €/m² across Spanish, Portuguese and Italian cities.
- 🎯 Lead Generation: separate agency listings from
"Private Owner"cards and follow the listing URL. - 💼 Investment Analysis: compare €/m² between sale and rent runs for the same location slug.
✅ Capabilities & Limits
Stated up front, so you do not pay a run to find out.
Built here: Datadome serves its challenge with HTTP 200, so status codes cannot detect the block. The actor flags it by <title> — exactly idealista.com means blocked. That path ends SUCCEEDED with a DIAGNOSTIC_GUIDE row and no PPE charge, while zero listings on a genuinely clean page hard-fails. A "successful" run holding one diagnostic item means you were blocked and paid nothing.
| Input / feature | Supported | Notes |
|---|---|---|
url | ✅ | Direct search URL from Idealista.com, Idealista.pt, or Idealista.it. If provided, the filters below are ignored. |
country | ✅ | Idealista site to scrape from. Echoed into the item as country. |
transactionType | ⚠️ | Selects the URL path (venta/alquiler, comprar/arrendar, vendita/affitto). It is not written into the output item. |
propertyType | ⚠️ | Selects the URL path (pisos, chalets, habitaciones, locales, terrenos, …). It is not written into the output item. |
location | ✅ | Slug of the location. Examples: madrid, barcelona, lisboa, porto, milano, roma. Defaults to madrid. |
priceMin / priceMax | ✅ | Price filter in Euros, applied in the search URL. |
Result volume (maxListings) | ⚠️ | Each result page holds about 30 listings; the actor follows "next" until the cap. |
| Proxy | ⚠️ | Apify RESIDENTIAL proxy strongly recommended. A WEB_UNLOCKER_PROXY_URL secret, when configured, takes priority over the input proxy. |
| Bathroom count | ❌ | Not emitted. There is no bathrooms field. Idealista search cards print area, bedrooms and floor — the bathroom count lives on the property detail page, which this actor does not open. |
| Energy certificate | ❌ | Not emitted. There is no energyCertificate field. The efficiency rating is a detail-page attribute, not a search-card one. |
| City as a separate field | ❌ | Not emitted. Use location (raw card text) or the location input you sent. |
| Advertiser phone / e-mail | ❌ | Never collected. |
| Description, full gallery, floor plan | ❌ | Not emitted. images holds only what the card renders, and imageCount counts those. |
| Listing publication date | ❌ | Not emitted. scrapedAt is the extraction time, not the posting time. |
FAQ
Q: Do I need a proxy to run this scraper?
A: Yes. Idealista uses heavy anti-bot protections. Use Apify Residential Proxies or a Web Unlocker endpoint in the proxy configuration settings.
Q: How does the Pay-Per-Event model work?
A: You are charged per listing saved to your dataset. A run that returns zero results because of a block costs nothing.
Q: Why is there no bathroom count or energy rating?
A: Both live on the individual property page. This actor reads search result cards, which keeps runs fast and cheap but caps the field list at the 17 above.
Português
Extraia anúncios imobiliários do Idealista.com (Espanha), Idealista.pt (Portugal) e Idealista.it (Itália). Casas, apartamentos, escritórios comerciais, terrenos ou quartos partilhados: a URL de pesquisa é montada a partir dos seus filtros, as páginas de resultados são lidas card a card, e a paginação segue o link "seguinte" até ao seu limite.
Este Actor utiliza cobrança Pay-Per-Event (PPE) — paga por anúncio gravado no seu dataset, sem subscrição mensal e sem taxa inicial.
O que cada anúncio traz
Os dados vêm dos cards da página de resultados, não da página individual de cada imóvel. É isso que torna o run rápido, e é também o que define a fronteira: campo que o card não imprime não sai no output. A lista completa tem 17 campos.
Funcionalidades
- 🌐 Suporte Multi-País: portais de Espanha, Portugal e Itália, cada um com a sua gramática de URL e cabeçalho
Accept-Language. - 🏢 Todos os Tipos de Propriedade: Apartamentos, Casas, Quartos Partilhados, Terrenos e Escritórios/Lojas.
- 🔑 Modos de Transação: Compra (Venda), Arrendamento e Quartos (Partilhar).
- 💰 Cobrança Pay-Per-Event: cobrada por anúncio gravado. Run bloqueado grava um diagnóstico e não cobra nada.
- 🛡️ Tratamento Anti-Bot: flags de camuflagem no launch, clique no consentimento de cookies, espera aleatória, mais screenshot e HTML no Key-Value Store a cada bloqueio.
- ⚡ Campos do Card: ID, título, preço formatado e numérico, preço por m², área, quartos, andar, elevador, anunciante, texto de localização, lista de imagens, URL do anúncio, país.
Parâmetros de Entrada
| Campo | Tipo | Descrição | Padrão |
|---|---|---|---|
url | String | URL direta de pesquisa do Idealista. Ignora outros filtros. | "" |
country | String | Portal de país a extrair (es, pt, it). | "es" |
transactionType | String | sale (Venda), rent (Arrendamento) ou share (Quartos). Define a URL; não é copiado para o item de saída. | "sale" |
propertyType | String | all, apartments, houses, rooms, commercial, land. Define a URL; não é copiado para o item de saída. | "all" |
location | String | Termo ou slug da localidade (ex: lisboa, porto, madrid). | "madrid" |
priceMin | Integer | Preço mínimo em Euros. | Nenhum |
priceMax | Integer | Preço máximo em Euros. | Nenhum |
maxListings | Integer | Número máximo de anúncios a extrair. | 100 |
proxyConfiguration | Object | Configurações de proxy. Proxy residencial recomendado. | {"useApifyProxy": true} |
Exemplo de Saída
Cada item tem exatamente estes 17 campos:
{"id": "104859384","title": "Piso en venta en calle de Alcalá, Goya, Madrid","priceFormatted": "450.000 €","area": 85,"bedrooms": 2,"floor": "3º","hasLift": true,"advertiser": "Altea Real Estate","location": "Goya, Madrid","images": ["https://img3.idealista.com/blur/web_gallery-m-d/0/id.pro.es.image.bundle.webp"],"imageCount": 12,"url": "https://www.idealista.com/inmueble/104859384/","source": "Idealista","country": "ES","price": 450000,"pricePerSqm": 5294.12,"scrapedAt": "2026-05-23T06:20:00.000Z"}
| Campo | Tipo | Como é produzido |
|---|---|---|
id | string | Dígitos do caminho /inmueble/, /imovel/ ou /immobile/. Sem esse segmento, entra um marcador aleatório idealista-xxxxxxxxx |
title | string | Texto do link de título do card |
priceFormatted | string | Preço tal como impresso no card |
area | number | null | Primeiro número no detalhe que contém m² |
bedrooms | number | null | Primeiro número no detalhe que contém hab / quarto / stanza / dorm |
floor | string | null | Texto bruto do detalhe com º, planta, piano, bajo ou r/c |
hasLift | boolean | null | true / false a partir do detalhe ascensor / elevador / ascensore; null quando o card nada diz |
advertiser | string | Alt/title do logo da agência. Vira o literal "Private Owner" quando não há logo no card |
location | string | Texto bruto do bloco de descrição do card, cortado em 300 caracteres |
images | string[] | Fontes de imagem http do card, com logos filtrados |
imageCount | number | Tamanho de images — fotos visíveis no card, não o total da galeria |
url | string | URL absoluta do anúncio |
source | string | Constante Idealista |
country | string | ES, PT ou IT, vindo do seu input country |
price | number | null | priceFormatted sem nenhum caractere não-numérico |
pricePerSqm | number | null | price / area, arredondado a 2 casas; null quando falta um dos lados |
scrapedAt | string | Timestamp ISO-8601 da extração |
Casos de Uso
- 📊 Avaliação de Mercado: acompanhe preços pedidos e €/m² em cidades de Espanha, Portugal e Itália.
- 🎯 Geração de Leads: separe anúncios de agência dos cards
"Private Owner"e siga a URL do anúncio. - 💼 Análise de Investimento: compare €/m² entre um run de venda e um de arrendamento para a mesma localidade.
✅ Capacidades e Limites
Declarado antes da compra, para não gastar um run a descobrir.
Como funciona aqui: o Datadome serve o desafio com HTTP 200, então o código de status não deteta o bloqueio. O actor sinaliza pelo <title> — exatamente idealista.com significa bloqueado. Esse caminho termina SUCCEEDED com uma linha DIAGNOSTIC_GUIDE e sem cobrança PPE, enquanto zero anúncios numa página genuinamente limpa falha de forma dura. Um run "bem-sucedido" com um único item de diagnóstico significa que foi bloqueado e não pagou nada.
| Entrada / recurso | Suportado | Observações |
|---|---|---|
url | ✅ | URL direta do Idealista.com, Idealista.pt ou Idealista.it. Quando preenchida, os filtros abaixo são ignorados. |
country | ✅ | Portal a extrair. Volta no item como country. |
transactionType | ⚠️ | Escolhe o caminho da URL (venta/alquiler, comprar/arrendar, vendita/affitto). Não é gravado no item de saída. |
propertyType | ⚠️ | Escolhe o caminho da URL (pisos, chalets, habitaciones, locales, terrenos, …). Não é gravado no item de saída. |
location | ✅ | Slug da localidade: madrid, barcelona, lisboa, porto, milano, roma. Padrão madrid. |
priceMin / priceMax | ✅ | Filtro de preço em Euros, aplicado na URL de pesquisa. |
Volume (maxListings) | ⚠️ | Cada página tem cerca de 30 anúncios; o actor segue o "seguinte" até ao teto. |
| Proxy | ⚠️ | Proxy RESIDENCIAL da Apify fortemente recomendado. O segredo WEB_UNLOCKER_PROXY_URL, quando configurado, tem prioridade sobre o proxy do input. |
| Número de casas de banho | ❌ | Não é emitido. Não existe campo bathrooms. O card de pesquisa do Idealista imprime área, quartos e andar — o número de casas de banho fica na página de detalhe do imóvel, que este actor não abre. |
| Certificado energético | ❌ | Não é emitido. Não existe campo energyCertificate. A classificação energética é atributo da página de detalhe, não do card de pesquisa. |
| Cidade como campo próprio | ❌ | Não é emitida. Use location (texto bruto do card) ou o input location que enviou. |
| Telefone / e-mail do anunciante | ❌ | Nunca são recolhidos. |
| Descrição, galeria completa, planta | ❌ | Não são emitidas. images traz só o que o card renderiza, e imageCount conta essas. |
| Data de publicação do anúncio | ❌ | Não é emitida. scrapedAt é a hora da extração, não a da publicação. |
FAQ
P: Preciso de proxy para rodar este scraper?
R: Sim. O Idealista implementa bloqueios rígidos. Use os Proxies Residenciais da Apify ou um endpoint Web Unlocker.
P: Porque não há número de casas de banho nem certificado energético?
R: Ambos vivem na página individual do imóvel. Este actor lê os cards da página de resultados, o que mantém o run rápido e barato, mas limita a lista aos 17 campos acima.
💰 Pricing / Preços
This actor uses Pay Per Event (PPE) pricing. The rate depends on your Apify plan tier:
| Plan tier | Per listing scraped | Per 1,000 |
|---|---|---|
| Free | $0.003 | $3.00 |
| Bronze | $0.0025 | $2.50 |
| Silver | $0.002 | $2.00 |
| Gold | $0.0018 | $1.80 |
| Platinum | $0.0014 | $1.40 |
| Diamond | $0.001 | $1.00 |
You are never charged for a run that returned nothing. When the source blocks and nothing is extracted, the actor returns a labeled diagnostic and charges no PPE event.
Related Actors / Atores Relacionados
Changelog
- 2026-08-27: Documentação alinhada ao output real — o exemplo de saída passou a listar os 17 campos efetivamente gravados;
bathroomseenergyCertificateforam marcados como não emitidos na tabela de limites. - v1.0.0 (2026-05-23): Lançamento oficial do Idealista Multi-Country Scraper com cobrança PPE direta e suporte a Espanha, Portugal e Itália.