# `property-sourcing_search`

> **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. Every property is one record with its full price and market history. [How the property graph is built](/docs/property-graph).

Search homes for sale or rent. Product: [Property Sourcing](/docs/property-sourcing). Annotations: Read-only.

Call it as `property-sourcing_search` on the Property Sourcing MCP server, `https://platform.casafari.com/mcp/property-sourcing` ([how to connect](/docs/connect)).

Over REST: [`POST /v1/property-sourcing/searches`](/docs/rest/property-sourcing/search-properties) (equivalent). [MCP and REST compared](/docs/parity#property-sourcing).

## What does Search homes for sale or rent do?

Homes for sale or rent in one country, merged into one record per home across portals and agency websites. Give location_ids from locations_search, and optionally operation (sale or rent), types, ranges for price, price_per_sqm, bedrooms, bathrooms, living_area_sqm and plot_area_sqm ({"min", "max"}), features and exclude_features, sort and page_size. Each result has a prop_ id, type, asking price (and per square metre), bedrooms, living area, location and the date first seen; total is how many homes match. When next is not null, pass it to property-sourcing_next_page. There is no plain-language filter.

## Which parameters does property-sourcing_search take?

- `location_ids` (integer[], required): 1 to 100 location ids, from locations_search (a city, district or neighbourhood). 1–100 items; ≥ 1.
- `country` (string, optional): ISO country code, e.g. "ES". Optional: the location ids say their country. pattern `^[A-Za-z]{2}$`.
- `operation` (string, optional): Homes for "sale" (default) or for "rent". Values: `sale`, `rent`.
- `types` (string[], optional): Property types, lower case, e.g. ["apartment", "penthouse", "house", "villa"]. 1–40 items; at most 40 characters; pattern `^[a-z][a-z_]*$`.
- `price` (object, optional): 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.
  - `min` (integer, optional) ≥ 1.
  - `max` (integer, optional) ≥ 1.
- `price_per_sqm` (object, optional): Asking price per square metre: {"min": n, "max": n}, whole numbers from 1; either may be left out.
  - `min` (integer, optional) ≥ 1.
  - `max` (integer, optional) ≥ 1.
- `bedrooms` (object, optional): Bedrooms: {"min": n, "max": n}, whole numbers from 0; either may be left out.
  - `min` (integer, optional) ≥ 0.
  - `max` (integer, optional) ≥ 0.
- `bathrooms` (object, optional): Bathrooms: {"min": n, "max": n}, whole numbers from 1; either may be left out.
  - `min` (integer, optional) ≥ 1.
  - `max` (integer, optional) ≥ 1.
- `living_area_sqm` (object, optional): Living area in square metres: {"min": n, "max": n}, whole numbers from 1; either may be left out.
  - `min` (integer, optional) ≥ 1.
  - `max` (integer, optional) ≥ 1.
- `plot_area_sqm` (object, optional): Plot area in square metres: {"min": n, "max": n}, whole numbers from 1; either may be left out.
  - `min` (integer, optional) ≥ 1.
  - `max` (integer, optional) ≥ 1.
- `features` (string[], optional): Features every result must have. Values: `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_features` (string[], optional): Features no result may have. Values: `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.
- `sort` (string, optional): Order of the results. newest: most recently on the market first. Values: `newest`, `oldest`, `recently_updated`, `price_asc`, `price_desc`, `price_per_sqm_asc`, `price_per_sqm_desc`, `largest`.
- `page_size` (integer, optional): Results per page, 1 to 100 (default 25; the plan may allow fewer). Every page costs the same. 1–100.

## How do I call property-sourcing_search?

Required arguments only, with placeholder values; see the parameters above for real ones.

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "property-sourcing_search",
    "arguments": {
      "location_ids": [
        1
      ]
    }
  }
}
```

## Related pages

- [Next page of a home search (property-sourcing_next_page)](/docs/property-sourcing/next_page)
- [One home with its listings and history (property-sourcing_get_property)](/docs/property-sourcing/get_property)
- [Find the home behind a listing link (property-sourcing_resolve_listing)](/docs/property-sourcing/resolve_listing)
- [Property Sourcing: all its MCP tools and REST operations](/docs/property-sourcing)
- [Connect an MCP client](/docs/connect)
- [All Casafari MCP tools](/docs/tools)
