Fotocasa Price History — First Seen & Drops
Pricing
from $6.00 / 1,000 price histories
Fotocasa Price History — First Seen & Drops
Fotocasa historico for Spain ads: first seen, precio anterior piso, price drops and delisted status. Snapshot Fotocasa Madrid/Barcelona URLs; scheduled runs build history when the portal hides the first publication date. Not escrituras. RESIDENTIAL ES.
Pricing
from $6.00 / 1,000 price histories
Rating
0.0
(0)
Developer
Noah Adler
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Fotocasa Price History — First Seen, Drops & Delisted
Fotocasa historico for Spain property ads: track first seen, precio anterior piso, price drops and delisted listings on Fotocasa.es.
This is not another Fotocasa search dump (that Actor already exists). It is the Keepa-style watch that Forocoches, Burbuja and Rankia threads asked for: the first publication date is hidden when an ad is renewed; the same listing ID often comes back when the ad is relisted.
Honest limit: Fotocasa rarely publishes a full camelcamelcamel chart. Run 1 is a snapshot. Schedule the Actor on the same
snapshotKey/ URLs and you get the history. This Actor never invents escrituras or notary prices (Idealista sells those at €2400+VAT / 500 records).
Input: property URLs (…/d) and/or search URLs (…/l, Madrid / Barcelona).
Output: one Dataset row per listing check.
Proxy: RESIDENTIAL ES.
Table of contents
- What this Actor does
- What is real vs snapshot
- What you get
- Features
- Input
- Output example
- Output fields
- Quick start (API)
- Use cases
- Limitations
- FAQ
- Keywords
What this Actor does
| Step | Action |
|---|---|
| 1 | Open Fotocasa search pages and/or property URLs you pass |
| 2 | Read listing JSON (price, id, city, portal date) — same HTTP pattern as the Fotocasa listings Actor |
| 3 | If the page exposes a price chart / original price, copy it into priceHistory with source=site |
| 4 | Diff against the previous KV snapshot (or previousSnapshot JSON) → lastPriceChange, firstSeenAt, delisted |
| 5 | Save the snapshot so the next scheduled run extends the history |
What is real vs snapshot
| You asked for | What you actually get |
|---|---|
| Current asking price | Real — currentPrice + currency=EUR from Fotocasa |
| Stable id | Real — propertyId from the ad (Burbuja: same ID when relisted) |
| Fecha de primera publicación | Only if Fotocasa still shows it. Portal date is usually the last renew. Otherwise firstSeenAt = first time this Actor saw the id |
| Precio anterior / drops | Site if a previous/original price is in the JSON; otherwise snapshot diff after run 2+ |
| Escrituras / precio de compraventa | Never. Rankia-style notary files are a different product |
historySource is site, snapshot, or mixed so you can filter.
What you get
Identity
propertyId,url,title,city,status(active/delisted/unknown)
Price
currentPrice,currency(always EUR when a price exists)lastPriceChange(fromPrice,toPrice,dropEur,dropPct,at)priceHistory[](price,seenAt,source)
Time
firstSeenAt,portalPublishedAt,daysOnPortal,scrapedAt
Features
| Capability | Detail |
|---|---|
| Property URLs | Watch specific pisos (…/d) |
| Search snapshot | Madrid / Barcelona /l pages up to maxItems |
| KV diff | Same Actor storage + optional previousSnapshot |
| Delisted | 404/tombstone, or id missing from the same search vs last snapshot |
| No escrituras | Asking prices only |
| RES ES | Residential Spain injected if country is empty |
Input
| Field | Required | Description |
|---|---|---|
propertyUrls | Cond. | Fotocasa detail URLs |
searchUrls | Cond. | Fotocasa list URLs (…/l) |
maxItems | No | Default 10 (max 80). Each row is a listing check (PPE Price history, not a cheap dump) |
snapshotKey | No | Reuse on a schedule |
previousSnapshot | No | Paste prior JSON if you keep history outside Apify |
persistSnapshot | No | Default true |
proxyConfiguration | No | RESIDENTIAL + ES |
Need propertyUrls or searchUrls.
Example — Madrid sale snapshot
{"searchUrls": ["https://www.fotocasa.es/es/comprar/viviendas/madrid-capital/todas-las-zonas/l"],"maxItems": 8,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "ES"}}
Example — Barcelona listing URL
Paste a live …/comprar/vivienda/barcelona-capital/…/{id}/d URL in propertyUrls. The Store Try it example is the Madrid search snapshot below.
Output example
{"propertyId": "189717534","url": "https://www.fotocasa.es/es/comprar/vivienda/madrid-capital/lista/id/189717534/d","title": "Piso en Barrio de Salamanca","currentPrice": 650000,"currency": "EUR","city": "Madrid","firstSeenAt": "2026-09-24T17:00:00Z","lastPriceChange": null,"priceHistory": [{ "price": 650000, "currency": "EUR", "seenAt": "2026-09-24T17:00:00Z", "source": "snapshot" }],"status": "active","daysOnPortal": 12,"portalPublishedAt": "2026-09-12T10:00:00Z","historySource": "snapshot","scrapedAt": "2026-09-24T17:00:00Z"}
On a later run, if the asking price dropped to 625000, lastPriceChange.dropEur is 25000 and priceHistory has both points. That drop is your snapshot, unless Fotocasa also showed an original price (source=site).
Output fields
| Group | Fields |
|---|---|
| Identity | propertyId, url, title, city, status |
| Price | currentPrice, currency, lastPriceChange, priceHistory |
| Time | firstSeenAt, portalPublishedAt, daysOnPortal, scrapedAt |
| Provenance | historySource |
| Errors | error, errorMessage |
Quick start (API)
from apify_client import ApifyClientclient = ApifyClient("<YOUR_TOKEN>")run = client.actor("noahadler/fotocasa-price-history").call(run_input={"searchUrls": ["https://www.fotocasa.es/es/comprar/viviendas/madrid-capital/todas-las-zonas/l"],"maxItems": 8,"proxyConfiguration": {"useApifyProxy": True,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "ES",},})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["propertyId"], item["currentPrice"], item["firstSeenAt"], item["historySource"])
Schedule daily/weekly with the same snapshotKey (or the same URLs) so firstSeenAt stays stable and drops appear.
Use cases
- Buyer due diligence: did this piso sit and then drop?
- Investor comps: asking-price path without paying Idealista escrituras
- Agency watchlists: same Fotocasa id after a “new” ad (Burbuja pattern)
- Alerts:
status=delistedon a search you already snapshot - Cross-check vs the Fotocasa listings Actor (inventory vs history)
Limitations
- No notary / escritura prices. Asking prices on Fotocasa only.
- Portal “publication” date resets on renew — that is the whole Forocoches complaint. We store
portalPublishedAtas Fotocasa sent it andfirstSeenAtfrom the first snapshot when the site omits a true first-publish field. - Run 1
priceHistoryis usually a single snapshot point. History depth = how long you schedule. - Search snapshots only mark
delistedfor ids that were in this Actor’s previous snapshot of the same watch, not the whole Spanish inventory. - Respect Fotocasa Terms of Service. RESIDENTIAL ES if you see 403/empty JSON. WAF after that → drop, not infinite rewrites.
FAQ
Is this the Fotocasa listings scraper?
No. Listings = current ads. This Actor = first seen, precio anterior, drops, delisted.
Why is lastPriceChange null?
First run, or the price did not move vs the last snapshot.
Can I get fecha publicacion Idealista?
This build is Fotocasa. Idealista first-publish is the same product idea on another portal — not bundled here.
Do you scrape Rankia escrituras?
No.
Blocked?
RESIDENTIAL + apifyProxyCountry=ES.
Keywords
fotocasa historico, fotocasa historico precios, idealista historico precios, fecha publicacion idealista, precio anterior piso, fotocasa price history, first seen fotocasa, fotocasa delisted
Related listings Actor: fotocasa-spain-property-scraper.