Dils APIdils.pt ↗
Access all Dils Portugal (Castelhana) real estate developments, unit fractions, prices, and amenities across Lisboa, Porto, Algarve, and more via 3 API endpoints.
What is the Dils API?
The Dils Portugal API exposes 3 endpoints covering real estate developments listed on dils.pt (formerly Castelhana), including paginated development summaries, full detail records, and individual unit fractions. The get_development_fractions endpoint returns per-unit data such as typology, floor, useful area, gross area, bathrooms, energy certification, and availability status across regions including Lisboa, Porto, Algarve, Oeiras, Cascais, and Comporta.
curl -X GET 'https://api.parse.bot/scraper/5cefcd8e-a310-4e05-8ee4-1a7be6a36759/list_developments?page=1&page_size=10' \ -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 dils-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: Dils Portugal Real Estate SDK — browse developments, drill into fractions."""
from parse_apis.dils_portugal_real_estate_developments_api import (
DilsPortugal, IncludeFractions, DevelopmentNotFound
)
client = DilsPortugal()
# List developments — limit caps total items fetched across pages.
for dev in client.developments.list(page_size=10, limit=5):
print(dev.name, dev.district, dev.min_price, dev.status)
# Drill into one development's fractions via sub-resource navigation.
dev = client.developments.list(limit=1).first()
if dev:
for frac in dev.fractions.list(limit=3):
print(frac.typology, frac.useful_area, frac.energy_certification, frac.availability)
# Fetch full detail by ID with enum — typed error handling for missing developments.
if dev:
try:
detail = client.developments.get(id=str(dev.id), include_fractions=IncludeFractions.TRUE)
print(detail.name, detail.municipality, detail.available_fractions)
except DevelopmentNotFound as exc:
print(f"Development gone: {exc.development_id}")
print("exercised: developments.list / developments.get / fractions.list")
List all real estate developments with pagination. Returns development summaries including name, location, typologies, price ranges, availability, features, images, and agent contacts. Paginates via integer page number; each page returns up to page_size developments.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (1-indexed). |
| page_size | integer | Number of results per page. |
{
"type": "object",
"fields": {
"page": "integer - current page number",
"total": "integer - number of developments returned on this page",
"page_size": "integer - requested page size",
"developments": "array of development summary objects with id, name, description, type, status, location fields, typologies, price range, features, agents, and images"
},
"sample": {
"data": {
"page": 1,
"total": 2,
"page_size": 10,
"developments": [
{
"id": 25956371,
"name": "Penha Longa Edition",
"type": "Prédio",
"year": null,
"zone": "Penha Longa",
"agents": [
{
"name": "John Doe",
"email": "[email protected]",
"phone": "+1 (555) 012-3456"
}
],
"images": [
{
"original": "https://images.egorealestate.com/ZOriginal/...",
"thumbnail": "https://images.egorealestate.com/Z512x384/...",
"description": "Fachada"
}
],
"parish": "S.Maria e S.Miguel",
"status": "Em construção",
"address": "",
"country": "Portugal",
"gps_lat": 38.761,
"gps_lon": -9.398,
"district": "Lisboa",
"features": [
"AREAS",
"AREA_T",
"CHILDREN_PLAYGROUND"
],
"zip_code": "",
"max_price": "4 650 000 €",
"min_price": "1 870 000 €",
"reference": "37031",
"thumbnail": "https://images.egorealestate.com/Z512x384/...",
"area_range": [
224,
568
],
"price_info": null,
"typologies": [
"T2",
"T3",
"T4"
],
"description": "Entre Lisboa e Cascais...",
"availability": "Disponível",
"municipality": "Sintra",
"last_modified": "2026-06-10T08:59:42",
"typology_range": [
"T2",
"T5"
],
"total_fractions": 16,
"available_fractions": 8
}
]
},
"status": "success"
}
}About the Dils API
Development Listings
The list_developments endpoint returns paginated summaries of all active real estate developments on dils.pt. Each result includes the development id, name, type, status, location fields, typologies, price range, features tags, images, and agent contacts. Use the page and page_size parameters to control pagination. The total field reflects the count of developments returned on the current page, not the full catalog size.
Development Detail and Fractions
The get_development_detail endpoint accepts a development_id (sourced from list_developments) and returns the full development record: district, status, min_price, max_price, features array, and an images array with thumbnail, original, and description fields for each image. Set include_fractions=true to embed all unit fractions directly in the response rather than making a separate call.
Individual Unit Data
The get_development_fractions endpoint returns every individual unit (fraction) for a given development. Each fraction object includes typology, floor, bathrooms, useful_area, gross_area, availability, energy_certification, images, and blueprints. The total field in the response reports the number of fractions found. This is the most granular data the API exposes — suitable for unit-level price tracking or inventory monitoring.
The Dils API is a managed, monitored endpoint for dils.pt — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when dils.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 dils.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?+
- Track price range changes across Lisboa and Porto developments by periodically calling
list_developmentsand comparingmin_price/max_pricefields. - Build a unit availability dashboard by polling
get_development_fractionsforavailabilitystatus across multiple development IDs. - Filter developments by
typologiesandfeaturesto surface properties matching specific buyer criteria such as number of rooms or amenities. - Aggregate energy certification grades across fractions from
get_development_fractionsto compare sustainability metrics across developments. - Pull
imagesandblueprintsfrom fraction records to populate a property listing interface with floor plans and unit-level photography. - Monitor construction
statuschanges across developments in Algarve or Cascais by comparingget_development_detailresponses over time. - Compile a regional inventory report by paginating through all developments and summing fraction counts by district.
| 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 Dils Portugal (dils.pt) offer an official developer API?+
What does `get_development_detail` return beyond what `list_developments` provides?+
images array with per-image thumbnail, original, and description fields, a district string, and formatted min_price/max_price strings. When include_fractions=true is passed, it also embeds the full fractions array, equivalent to what get_development_fractions returns separately.Does the API cover secondary market (resale) listings or only new developments?+
Are asking prices per fraction exposed, or only development-level price ranges?+
min_price and max_price are returned by get_development_detail. Individual fraction records from get_development_fractions include area and typology data but individual per-unit asking prices are not currently a named field in the fraction object. You can fork this API on Parse and revise it to surface per-fraction pricing if the source exposes it.How does pagination work in `list_developments`?+
page integer parameter alongside page_size. The response includes the current page, page_size, and a total representing the count of developments on that page — not a global total. To determine the full catalog size, you need to iterate until a page returns fewer results than the requested page_size.