Platform
Get started

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 by description

POSThttps://platform.casafari.com/v1/property-sourcing/searches/describe
API key100 units per page12 parameters

Send Authorization: Bearer $CASAFARI_API_KEY: a platform API key or OAuth access token; see platform sign-in. Costs 100 units per page (1 unit = EUR 0.04).

Over MCP: none; this product is REST only.

Description

Plain-language search: say what you look for as tags (up to 20 phrases) or one description (split into phrases at commas, semicolons and "and"), in the places named by location_ids, optionally within a price or price-per-m² range. Each result lists the phrases it matched in matched_tags. Structured filters (types, bedrooms, features) belong to POST /v1/property-sourcing/searches. 100 units per page.

Request body

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

location_idsinteger[]required
1 to 100 location ids, from GET /v1/locations/search?query=<place>.
1–100 items
countrystring
ISO 3166-1 alpha-2 code, e.g. "ES".
operationstring
For sale or for rent.
sale rent
default "sale"
tagsstring[]
Up to 20 phrases, e.g. ["close to the beach", "sea views"]. Send tags or description, not both.
1–20 itemsat most 200 characters
descriptionstring
What you look for in plain words, split into phrases at commas, semicolons and "and" (at most 20).
at most 1000 characters
priceobject
Asking price range.
2 properties
mininteger
Lowest value, inclusive.
maxinteger
Highest value, inclusive.
price_per_sqmobject
Asking price per m² range.
2 properties
mininteger
Lowest value, inclusive.
maxinteger
Highest value, inclusive.
page_sizeinteger
Results per page: up to 100 (25 on Free).
1–100default 25

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/describe" \
  -H "Authorization: Bearer $CASAFARI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "location_ids": [
    12345
  ],
  "country": "ES",
  "operation": "sale",
  "description": "close to the beach, sea views and a garden",
  "price": {
    "max": 900000
  },
  "page_size": 25
}'

Responses

200 One page of properties, each with the phrases it matched.

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) (long arrays shortened)
JSON
{
  "results": [
    {
      "id": "prop_2Lm9xQ4rT6vB1nC8kD5wZa",
      "type": "villa",
      "operation": "sale",
      "price": {
        "amount": 870000,
        "currency": "EUR",
        "per_sqm": 4142
      },
      "bedrooms": 4,
      "living_area_sqm": 210,
      "location": {
        "id": 12345,
        "name": "Sample town",
        "coordinates": {
          "lat": 36.51,
          "lon": -4.88
        }
      },
      "first_seen": "2026-08-14",
      "listings_count": null,
      "matched_tags": [
        "close to the beach",
        "sea views"
      ]
    }
  ],
  "total": 48,
  "next": "https://platform.casafari.com/v1/property-sourcing/searches/cur_SAMPLE"
}

400 Invalid request: the problem names each field to fix (`invalid_request`).

Type: object.

Show the response shape (10 fields)
typestring
The problem's documentation URL.
titlestring
statusinteger
detailstring
What happened and how to fix it.
instancestring
codestring
e.g. invalid_request, payment_required, not_entitled, not_found, page_depth_exceeded, request_limit_reached.
request_idstring
errorsobject[]
One entry per field to fix.
2 properties
fieldstring
messagestring

401 Missing or unknown API key or token.

Type: object.

Show the response shape (10 fields)
typestring
The problem's documentation URL.
titlestring
statusinteger
detailstring
What happened and how to fix it.
instancestring
codestring
e.g. invalid_request, payment_required, not_entitled, not_found, page_depth_exceeded, request_limit_reached.
request_idstring
errorsobject[]
One entry per field to fix.
2 properties
fieldstring
messagestring

402 No units left to fund the call (`payment_required`).

Type: object.

Show the response shape (10 fields)
typestring
The problem's documentation URL.
titlestring
statusinteger
detailstring
What happened and how to fix it.
instancestring
codestring
e.g. invalid_request, payment_required, not_entitled, not_found, page_depth_exceeded, request_limit_reached.
request_idstring
errorsobject[]
One entry per field to fix.
2 properties
fieldstring
messagestring

403 The account is not entitled to this product or country (`not_entitled`).

Type: object.

Show the response shape (10 fields)
typestring
The problem's documentation URL.
titlestring
statusinteger
detailstring
What happened and how to fix it.
instancestring
codestring
e.g. invalid_request, payment_required, not_entitled, not_found, page_depth_exceeded, request_limit_reached.
request_idstring
errorsobject[]
One entry per field to fix.
2 properties
fieldstring
messagestring

429 A request limit of the plan was reached (`request_limit_reached`).

Type: object.

Show the response shape (10 fields)
typestring
The problem's documentation URL.
titlestring
statusinteger
detailstring
What happened and how to fix it.
instancestring
codestring
e.g. invalid_request, payment_required, not_entitled, not_found, page_depth_exceeded, request_limit_reached.
request_idstring
errorsobject[]
One entry per field to fix.
2 properties
fieldstring
messagestring

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