Casavo APIcasavo.it ↗
Access Casavo.it property listings, photos, details, and location data across Italian cities via 6 endpoints. Search by city, get full listing details, and retrieve photos.
What is the Casavo API?
The Casavo.it API gives developers structured access to Italian real estate listings across all major cities through 6 endpoints. Use search_listings to query properties by city slug with pagination, get_listing_detail to retrieve full property data including coordinates, room count, and street address, and get_listing_photos to pull every photo URL associated with a specific listing.
curl -X GET 'https://api.parse.bot/scraper/589ef79a-5ad5-4d3c-b45f-944b8fd70afa/search_listings?city=milano&page=1' \ -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 casavo-it-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: Casavo.it SDK — search Italian property listings, drill into details."""
from parse_apis.casavo_it_real_estate_api import Casavo, ListingNotFound
client = Casavo()
# Browse all listings across Italy, capped at 5 total items.
for listing in client.listingsummaries.all(limit=5):
print(listing.title, listing.city, listing.price)
# Search by city — take one item and navigate to full details.
hit = client.listingsummaries.by_city(city="milano", limit=1).first()
if hit:
detail = hit.details()
print(detail.title, detail.price, detail.surface, detail.street)
# Get photos for the listing
photos = detail.photos()
print(photos.count, photos.listing_id)
for photo in photos.photos[:2]:
print(photo.url, photo.is_main)
# Search locations for boundary polygons
for loc in client.locations.search(address="Roma", limit=3):
print(loc.name, loc.type, loc.id)
# Typed error handling for a non-existent listing
try:
bad = client.listingsummaries.search(city="milano", limit=1).first()
if bad:
bad.details()
except ListingNotFound as exc:
print(f"listing gone: {exc.listing_id}")
print("exercised: listingsummaries.all / by_city / search / details / photos / locations.search")
Search for property listings with optional city filter and pagination. Returns paginated results sorted by publication date. Each page contains up to 18 listings. When city is omitted, returns listings from all cities.
| Param | Type | Description |
|---|---|---|
| city | string | City slug in lowercase (e.g. 'milano', 'roma', 'bologna'). Omitting returns listings from all cities. |
| page | integer | Page number for pagination (1-based). |
{
"type": "object",
"fields": {
"listings": "array of listing summary objects",
"total_count": "integer total number of matching listings",
"total_pages": "integer total number of pages",
"current_page": "integer current page number (1-based)"
}
}About the Casavo API
Searching and Browsing Listings
The search_listings and search_listings_by_city endpoints both return paginated arrays of listing summary objects. Each summary includes objectID, titre, typeBien, ville, codePostal, surface, prix, nbPieces, and nbBedrooms. Results are sorted by publication date. The city parameter accepts Italian city slugs such as milano, roma, bologna, and genova. To browse the entire catalogue without a city filter, use get_all_listings with an optional page parameter. All three endpoints return total_count, total_pages, and current_page alongside the listings array.
Listing Detail and Photos
get_listing_detail accepts a listing_id (the objectID from search results) and returns a richer set of fields: city, type (villa, flat, etc.), price in euros, title, street, nbRooms, surface in m², latitude, and a pictures array with dir and name fields. For full-resolution image URLs, get_listing_photos returns an array of photo objects each containing a url string and an is_main boolean flag identifying the primary photo, along with a count of total photos.
Location Search
get_property_valuation accepts an address string — a city or municipality name such as Milano or Roma — and returns an array of location objects. Each object includes an id, name, type (either municipality or submunicipality), and a geom field containing encoded polygon geometries representing the boundary of that location. This is useful for mapping coverage areas or resolving location IDs for further queries.
The Casavo API is a managed, monitored endpoint for casavo.it — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when casavo.it 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 casavo.it 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?+
- Aggregate Italian property listings by city to build a regional market overview using
prixandsurfacefields. - Display listing photo galleries by calling
get_listing_photosand filtering results whereis_mainis true for thumbnail selection. - Map property locations using
latitudecoordinates returned byget_listing_detail. - Track inventory changes by monitoring
total_countacross repeated calls tosearch_listings_by_city. - Resolve municipality boundary polygons via
get_property_valuationfor choropleth map overlays. - Filter listings by property type using the
typeBienfield from search results to separate villas from flats. - Build a price-per-square-meter calculator using
prixandsurfacefields from listing summaries.
| 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 Casavo have an official public developer API?+
What is the difference between `search_listings` and `search_listings_by_city`?+
search_listings accepts an optional city parameter, so omitting it returns listings across all cities. search_listings_by_city requires a city slug and is purpose-built for single-city queries. Both return the same listing summary fields and the same pagination metadata (total_count, total_pages, current_page).Does the API return rental listings or only properties for sale?+
Is longitude data available for mapping listing locations?+
get_listing_detail currently returns latitude but the response spec does not include a separate longitude field. For polygon-level geography, get_property_valuation returns encoded boundary geometries per municipality. You can fork this API on Parse and revise it to surface longitude if it appears in the source data.How current is the listing data, and are sold or removed properties accessible?+
search_listings and related endpoints reflect currently published listings sorted by publication date. The API does not expose a history of delisted or sold properties. You can fork it on Parse and revise it to add a historical tracking endpoint if that data becomes available on the source.