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

Property Sourcing · REST API

Search properties

POSThttps://platform.casafari.com/v1/property-sourcing/searches
API key50 tokens a call26 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 50 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 MCP tool property-sourcing_search's input; response 200: the hub's fragment from the platform's contract.

Over MCP: property-sourcing_search (equivalent). See MCP and REST compared.

Description

Costs 50 tokens a call. Each page is a call. Page size: page_size in the body, at most 100 (a Free plan account is capped lower). One search reaches at most 1000 results. A structured search: location_ids (from Location Lookup), country, operation (sale or rent), types, price, price_per_sqm, bedrooms, bathrooms, living_area_sqm, plot_area_sqm, features, exclude_features, below_market_pct (percent below our market value), days_on_market, private, exclusive, rental_yield (rent only), first_seen_after, changed_after, sort and page_size. Each result's id is a prop_ id and carries days_on_market, market_value, below_market and seller flags. Prices are asking prices.

Request body

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

location_idsinteger[]required
1 to 100 location ids, from locations_search (a city, district or neighbourhood).
1–100 items≥ 1
countrystring
ISO country code, e.g. "ES". Optional: the location ids say their country.
pattern ^[A-Za-z]{2}$
operationstring
Homes for "sale" (default) or for "rent".
sale rent
typesstring[]
Property types, lower case, e.g. ["apartment", "penthouse", "house", "villa"].
1–40 itemsat most 40 characterspattern ^[a-z][a-z_]*$
priceobject
Asking price in the country's currency (monthly rent when operation is rent): {"min": n, "max": n}, whole numbers from 1; either may be left out.
2 properties
mininteger
≥ 1
maxinteger
≥ 1
price_per_sqmobject
Asking price per square metre: {"min": n, "max": n}, whole numbers from 1; either may be left out.
2 properties
mininteger
≥ 1
maxinteger
≥ 1
bedroomsobject
Bedrooms: {"min": n, "max": n}, whole numbers from 0; either may be left out.
2 properties
mininteger
≥ 0
maxinteger
≥ 0
bathroomsobject
Bathrooms: {"min": n, "max": n}, whole numbers from 1; either may be left out.
2 properties
mininteger
≥ 1
maxinteger
≥ 1
living_area_sqmobject
Living area in square metres: {"min": n, "max": n}, whole numbers from 1; either may be left out.
2 properties
mininteger
≥ 1
maxinteger
≥ 1
plot_area_sqmobject
Plot area in square metres: {"min": n, "max": n}, whole numbers from 1; either may be left out.
2 properties
mininteger
≥ 1
maxinteger
≥ 1
featuresstring[]
Features every result must have.
balcony elevator garage garden parking storage swimming_pool terrace rental_license furniture no_elevator rented_out life_annuity business_transfer smoke_outlet
1–15 items
exclude_featuresstring[]
Features no result may have.
balcony elevator garage garden parking storage swimming_pool terrace rental_license furniture no_elevator rented_out life_annuity business_transfer smoke_outlet
1–15 items
sortstring
Order of the results. newest: most recently on the market first.
newest oldest recently_updated price_asc price_desc price_per_sqm_asc price_per_sqm_desc largest
page_sizeinteger
Results per page, 1 to 100 (default 25; the plan may allow fewer). Every page costs the same.
1–100

Example request

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

curl
curl -X POST "https://platform.casafari.com/v1/property-sourcing/searches" \
  -H "Authorization: Bearer $CASAFARI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "location_ids": [
    12345
  ],
  "country": "ES",
  "operation": "sale",
  "types": [
    "apartment"
  ],
  "price": {
    "max": 450000
  },
  "bedrooms": {
    "min": 2
  },
  "features": [
    "terrace",
    "elevator"
  ],
  "sort": "newest",
  "page_size": 25
}'

Responses

200 Success.

Type: object.

Show the response shape (21 fields)
resultsobject[]
10 properties
idstring
Opaque property id, prop_....
typestringnullable
Property type.
operationstring
sale rent
priceobject
3 properties
amountnumbernullable
Asking price; null when the price is on request.
currencystringnullable
ISO 4217 currency code.
per_sqmnumbernullable
Asking price per m².
bedroomsnumbernullable
living_area_sqmnumbernullable
locationobject
3 properties
idintegernullable
Location id.
namestringnullable
Location name.
coordinatesobjectnullable
Latitude and longitude.
2 properties
latnumber
lonnumber
first_seenstringnullable
When the property came on the market for this operation.
listings_countintegernullable
How many listings advertise it; known on a property read with expand=listings, null in search results.
matched_tagsstring[]nullable
The phrases of a plain-language search this property matched; null for structured searches.
totalintegernullable
How many properties match, when known.
nextstringnullable
URL of the next page (valid one hour), or null.
Example with sample values (ids and figures are illustrative)
JSON
{
  "results": [
    {
      "id": "prop_7Hq2pZk1vY0sW4nB8cR3tL",
      "type": "apartment",
      "operation": "sale",
      "price": {
        "amount": 425000,
        "currency": "EUR",
        "per_sqm": 4474
      },
      "bedrooms": 3,
      "living_area_sqm": 95,
      "location": {
        "id": 12345,
        "name": "Sample district",
        "coordinates": {
          "lat": 39.462,
          "lon": -0.376
        }
      },
      "first_seen": "2026-09-28",
      "listings_count": null,
      "matched_tags": null
    }
  ],
  "total": 312,
  "next": "https://platform.casafari.com/v1/property-sourcing/searches/cur_SAMPLE"
}

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.