Casa Sapo APIcasasapo.pt ↗
Access property listings from Casa Sapo (casa.sapo.pt) via API. Search sales and rentals, get listing details, track new listings and price reductions in Portugal.
What is the Casa Sapo API?
The Casa Sapo API provides 5 endpoints for querying Portugal's casa.sapo.pt property portal, covering listings for sale and rent, full listing detail pages, newly published apartments, and price-reduced properties. The get_listing_detail endpoint returns structured fields including price, description, features, and location text from any listing URL retrieved through search.
curl -X GET 'https://api.parse.bot/scraper/52af7c6d-5eb4-49cd-9ec6-bbdb442268b0/search_listings_for_sale?pn=1&location=lisboa&max_area=200&min_area=50&typology=T0&max_price=500000&min_price=100000&property_type=apartamentos' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace casasapo-pt-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Casa Sapo real estate API — bounded, re-runnable; every call capped."""
from parse_apis.casa_sapo_api import CasaSapo, PropertyType, Typology, ListingNotFound
client = CasaSapo()
# Search for sale listings in Lisboa with price/area filters
for listing in client.listingsummaries.search_for_sale(
location="lisboa", property_type=PropertyType.APARTAMENTOS, typology=Typology.T2, limit=5
):
print(listing.title, listing.price, listing.area)
# Drill-down: take one listing and get full details
summary = client.listingsummaries.search_for_rent(location="porto", limit=1).first()
if summary:
detail = summary.details()
print(detail.title, detail.price, detail.description[:100])
# Fetch a listing directly by URL
try:
full = client.listings.get(url="https://casa.sapo.pt/comprar-apartamento-t2-lisboa-example.html")
print(full.title, full.price)
except ListingNotFound as exc:
print(f"Listing gone: {exc}")
# Browse new listings (last 8 days)
for item in client.listingsummaries.search_new(location="lisboa", limit=3):
print(item.title, item.price, item.area)
# Find price-reduced deals
for deal in client.listingsummaries.search_price_reduced(location="lisboa", limit=3):
print(deal.title, deal.price, deal.previous_price, deal.price_reduction)
print("exercised: search_for_sale / search_for_rent / details / listings.get / search_new / search_price_reduced")
Search for properties for sale on Casa Sapo. Filters include location, property type, price range, area range, and typology. Returns one page of listing summaries per call; advance with the pn parameter. Each page contains up to ~30 results.
| Param | Type | Description |
|---|---|---|
| pn | integer | Page number. |
| locationrequired | string | Location slug identifying the area to search in (e.g. 'lisboa', 'porto', 'faro', 'braga'). |
| max_area | integer | Maximum area in square meters. |
| min_area | integer | Minimum area in square meters. |
| typology | string | Typology (number of bedrooms) filter. |
| max_price | integer | Maximum price in Euros. |
| min_price | integer | Minimum price in Euros. |
| property_type | string | Property type filter. |
{
"type": "object",
"fields": {
"url": "string, the constructed search URL",
"page": "integer, current page number",
"listings": "array of listing summary objects with url, title, price, area (optional), previous_price (optional), price_reduction (optional)"
},
"sample": {
"data": {
"url": "https://casa.sapo.pt/comprar-apartamentos/lisboa/",
"page": 1,
"listings": [
{
"url": "https://casa.sapo.pt/comprar-apartamento-t3-lisboa-sao-vicente-centro-(santa-engracia)-f5fdc199-3e30-11f1-9a8d-060000000057.html?g3pid=1079121",
"area": "Renovado · 73m²",
"price": "560.000 €",
"title": "Apartamento T3",
"previous_price": "575.000 €",
"price_reduction": "-2,61%"
},
{
"url": "https://casa.sapo.pt/comprar-apartamento-t1-lisboa-avenidas-novas-c0f52385-63ea-11f1-ba38-060000000058.html?g3pid=1079006",
"area": "Novo · 73m²",
"price": "700.000 €",
"title": "Apartamento T1"
}
]
},
"status": "success"
}
}About the Casa Sapo API
Search and Filter Portuguese Properties
The search_listings_for_sale and search_listings_for_rent endpoints accept a required location slug (e.g. lisboa, porto, faro) alongside optional filters: property_type (apartamentos, moradias, terrenos, lojas, escritorios, predios, armazens, quintas-herdades), typology (T0 through T6-ou-superior), min_price/max_price in Euros, and min_area/max_area in m². Both return paginated results via the pn parameter, with each listing object containing url, title, price, area, and — when applicable — previous_price and price_reduction fields.
Listing Detail and Market Signals
Pass any listing URL from search results to get_listing_detail to retrieve the full record: price, title, description, location_text, and a features object containing key-value property attributes. The search_new_listings endpoint surfaces apartments published in the last 8 days and accepts an optional location filter. The search_price_reduced_listings endpoint targets listings with recent price cuts, returning previous_price and price_reduction alongside current price and area — useful for tracking market softening by location.
Pagination and Coverage Notes
All search endpoints expose a page field in the response and accept a pn input for walking through result sets. The search_price_reduced_listings endpoint notes limited inventory — typically fewer than 10 results — reflecting the actual volume of price-drop listings on the portal at any time. The search_listings_for_rent response may include mixed listing types, as the portal's own feed can surface varied property categories within a rental query.
The Casa Sapo API is a managed, monitored endpoint for casasapo.pt — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when casasapo.pt changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official casasapo.pt API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor price reductions on Porto apartments using
search_price_reduced_listingswith a location filter. - Build a new-listing alert system for Lisbon properties with
search_new_listingspolled on a schedule. - Aggregate sale listing counts by typology (T1, T2, T3) across multiple location slugs for market analysis.
- Enrich a CRM with full property descriptions and feature sets by passing listing URLs to
get_listing_detail. - Compare asking prices across property types (moradias vs. apartamentos) in the same location using
search_listings_for_sale. - Track area-to-price ratios by filtering
min_area/max_areaalongsidemin_price/max_pricein search queries. - Identify recently listed commercial properties (lojas, escritorios, armazens) in Faro using property_type filters.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Casa Sapo have an official developer API?+
What does `get_listing_detail` return beyond price and title?+
description string (the full property description text), a features object of key-value attribute pairs (room count, floor, energy rating, etc. when present on the listing page), and a location_text field. The features object may be empty if the listing page does not expose structured attributes.Do the search endpoints cover all property types for rent, including commercial?+
search_listings_for_rent endpoint accepts the same property_type values as the sale endpoint — including lojas, escritorios, and armazens — so commercial rentals are in scope. However, the endpoint notes that results may include mixed listing types from the portal's feed, so result composition can vary. You can fork the API on Parse and revise it to add a dedicated commercial-rental endpoint with stricter type filtering if that matters for your use case.Is there an endpoint for property valuations or historical price data?+
search_price_reduced_listings), and listing-level previous_price fields where the portal exposes them — but no valuation estimates or historical price series. You can fork the API on Parse and revise it to add an endpoint targeting any valuation or statistics pages the portal may offer.How does pagination work across the search endpoints?+
pn parameter to request a specific page. The response includes a page field confirming the current page and a url field showing the constructed search URL. There is no explicit total-page count returned, so you iterate until the listings array is empty or contains fewer results than a full page.