Platform

Casafari is the AI agent-native real estate data intelligence platform. The most complete property index in Europe: a deduplicated, cleaned property graph of residential and commercial property, for sale and for rent, in 16 countries.The most complete property index in Europe: a deduplicated, cleaned property graph.

How the graph is built

Area Insights · REST API

Time on market distribution in an area

POSThttps://platform.casafari.com/v1/area-insights/distributions/time-on-market
API key25 tokens a call47 parameters

Send Authorization: Bearer $CASAFARI_API_KEY: a platform API key (cf_sk_...) from the console, or an OAuth access token; X-API-Key carries the key too. See platform API keys. Costs 25 tokens a call (1 token = EUR 0.04).

The platform's OpenAPI file leaves the shape open; what is shown comes from the same definitions the platform publishes elsewhere: request: the existing API's POST /market-analytics-api/distributions/time-on-market, the same backend; response 200: the existing API's POST /market-analytics-api/distributions/time-on-market.

Over MCP: area-insights_get_time_on_market_distribution (equivalent). See MCP and REST compared.

Description

Costs 25 tokens a call.

Request body

Content type application/json. Optional. Type: object.

typesstring[]required
The list of property types by type groups: apartment: ["apartment", "studio", "duplex", "penthouse", "dachgeschosswohnung", "etagenwohnung", "erdgeschosswohnung"] house: ["country_house", "house", "palace", "townhouse", "villa", "country_estate", "chalet", "bungalow", "family_house", "reihenhaus", "reihenendhaus", "reihenmittelhaus", "einfamilienhaus", "zweifamilienhaus", "landwirtschaftliche_betriebe"] room: ["room"] building: ["apartment_building", "office_building", "mix_use_building"] investment: ["retail", "office", "industrial", "warehouse", "hotel", "building", "other_commercial", "restaurant", "werkstatt"] development: ["apartment_development", "house_development"] plot: ["urban_plot", "rural_plot"] other: ["parking", "garage", "other"] Note that you can select multiple types only from one property type group. Some types exist only in some countries: Germany: dachgeschosswohnung, etagenwohnung, erdgeschosswohnung, family_house, reihenhaus, reihenendhaus, reihenmittelhaus, einfamilienhaus, zweifamilienhaus, landwirtschaftliche_betriebe, restaurant, werkstatt; France, Germany, Italy, Portugal, Spain: urban_plot, rural_plot.
42 allowed valuesapartment studio duplex penthouse dachgeschosswohnung etagenwohnung erdgeschosswohnung country_house house palace townhouse villa country_estate chalet bungalow family_house reihenhaus reihenendhaus reihenmittelhaus einfamilienhaus zweifamilienhaus landwirtschaftliche_betriebe retail office industrial warehouse hotel building other_commercial restaurant werkstatt urban_plot rural_plot room parking garage other apartment_building office_building mix_use_building apartment_development house_development
at least 1 item
business_typestringrequired
sale rent
price_rangeobjectnullable
2 properties
minintegernullable
1–2147483647
maxintegernullable
1–2147483647
price_per_sqm_rangeobjectnullable
2 properties
minintegernullable
1–2147483647
maxintegernullable
1–2147483647
rooms_rangeobjectnullable
2 properties
minintegernullable
1–15000
maxintegernullable
1–15000
bedrooms_rangeobjectnullable
2 properties
minintegernullable
0–15000
maxintegernullable
0–15000
bathrooms_rangeobjectnullable
2 properties
minintegernullable
1–15000
maxintegernullable
1–15000
total_area_rangeobjectnullable
2 properties
minintegernullable
1–1000000
maxintegernullable
1–1000000
plot_area_rangeobjectnullable
2 properties
minintegernullable
1–1000000
maxintegernullable
1–1000000
construction_year_rangeobjectnullable
2 properties
minintegernullable
1–3000
maxintegernullable
1–3000
characteristicsobjectnullable
2 properties
must_havestring[]
Include only properties that have all these characteristics.
balcony elevator no_elevator garage garden parking storage swimming_pool terrace rental_license furniture rented_out life_annuity
excludestring[]
Exclude properties that contain any of these characteristics.
balcony elevator no_elevator garage garden parking storage swimming_pool terrace rental_license furniture rented_out life_annuity
conditionsstring[]
Property conditions, as returned by the GET /api/v1/references/conditions endpoint.
used ruin very-good new other
at least 1 item
privateboolean
Whether the property is listed by a private individual, as opposed to an agent or a professional.
bankboolean
Whether the property is owned by the bank.
auctionboolean
Whether the property is the subject of an auction.
default false
exclude_outliersboolean
Exclude properties that are significantly underpriced or overpriced compared to similar properties.
default false
custom_location_boundaryobjectrequired
3 properties
location_idsinteger[]
List of location IDs.
1–10 items1–2147483647
polygonobject[]
List of geo-points to search within. Polygon must contain at least 4 points. First and last points must match.
at least 4 items
2 properties
latitudenumberrequired
-90–90
longitudenumberrequired
-180–180
circleobject
Circle boundary to search within.
2 properties
distanceintegerrequired
Maximum distance in meters from the requested target_point to the properties.
50–50000
target_pointobjectrequired
Target point coordinates to search around.
2 properties
latitudenumberrequired
-90–90
longitudenumberrequired
-180–180
date_rangeobject
Filter properties based on the start date of their last active period on the market.
2 properties
minstring (date)required
Start date in the format YYYY-MM-DD.
maxstring (date)nullable
End date in the format YYYY-MM-DD.

Example request

Placeholders only: replace the token and the values with your own.

curl
curl -X POST "https://platform.casafari.com/v1/area-insights/distributions/time-on-market" \
  -H "Authorization: Bearer $CASAFARI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "types": [
    "apartment"
  ],
  "business_type": "sale",
  "custom_location_boundary": {
    "location_ids": [
      11737
    ]
  }
}'

Responses

200 Success.

Type: object[].

Show the response shape (5 fields)
lower_boundintegerrequired
The lower price bound of the distribution unit.
upper_boundintegerrequired
The upper price bound of the distribution unit.
days_on_marketintegerrequired
The average days on the market.
months_on_marketnumberrequired
The average months on the market.
properties_countintegerrequired
The number of properties that participated in the distribution.
Example from a real call (Madrid, apartments for sale) (long arrays shortened)
JSON
[
  {
    "lower_bound": 1,
    "upper_bound": 50001,
    "days_on_market": 92,
    "months_on_market": 3.1,
    "properties_count": 465
  },
  {
    "lower_bound": 50001,
    "upper_bound": 100001,
    "days_on_market": 124,
    "months_on_market": 4.1,
    "properties_count": 7782
  }
]

Errors

Every error is an application/problem+json body (RFC 9457) with type (a page that explains it), title, status, detail (what to do), instance, code and request_id (what to quote to support). A 402 carries an upgrade_url, a 429 a Retry-After header. The codes each status can carry:

Tip: add .md to any URL to read it as Markdown.