# How do I find properties with price reductions, especially repeated cuts?

> **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).

Every price change is recorded in Casafari's property graph. With New Market Leads, create a feed with `POST /alerts-api/feeds` or query `POST /api/v1/listing-alerts/search` for price-cut alerts in your area. Then fetch each property with `GET /api/v1/properties/search/{property_id}` and count consecutive reductions in `sale_price_history` to spot repeated cuts.

Products: [New Market Leads](/docs/alerts), [Property Sourcing](/docs/property-sourcing), [Area Insights](/docs/area-insights), [Comparables & Valuation](/docs/comparables-valuation).

## Short answer

The property graph records every price change of every property, with dates. It keeps them in `sale_price_history`, and in `rent_price_history` for rentals.

A New Market Leads feed turns each price cut in your area into an alert. Repeated cuts are not a search filter: you count them from a property's history. Area Insights and comparables then show whether the whole area is moving or only that seller.

## Steps

### Create a feed for price cuts in your area (alert_subtypes) or search alerts with alert_date_from

1. For a standing feed: create a feed with `POST /alerts-api/feeds` (`feed_name`, `filters`) for your area, property type and price cuts. Put `alert_subtypes` set to `price_decreased` in `filters`, with `location_ids`, `types` and `business_type`. The other keys are on the [Create feed](/docs/rest/alerts/create-feed) page. Set a webhook with `PUT /alerts-api/webhooks` before the first feed: without one, creating a feed answers `409` with `No webhook configured`. `price_decreased` combines with `private`, `bank` and `auction`.
2. Casafari client accounts: call `POST /api/v1/listing-alerts/search` with `location_ids`, `operation`, `types`, `alert_subtypes` set to the price-decrease subtype, and `alert_date_from` / `alert_date_to` (`YYYY-MM-DD`). Note the property each alert refers to.

### Shortlist with `POST /api/v2/properties/search` using days_on_market_from and updated_date_from

3. Casafari client accounts: search the same area with `location_ids`, `types`, `days_on_market_from` and `updated_date_from` (`YYYY-MM-DDTHH:mm:ss`). For example, `days_on_market_from` 180 keeps properties on the market for about six months or more. `updated_date_from` keeps those whose record changed recently. Add `price_from` / `price_to` to match a budget.

### Fetch each property with `GET /api/v1/properties/search/{property_id}` and count consecutive reductions in sale_price_history

4. For each candidate, call `GET /api/v1/properties/search/{property_id}`.
5. Sort `sale_price_history` by date and count how many changes in a row lowered the price. The entry fields are on the [Get property by ID (v1)](/docs/rest/property-sourcing/get-property-by-id-v1) page.
6. Two or more consecutive reductions mark a repeated-cut lead.

### Check the area with ma_get_time_series_data, data_point price_down

7. Over MCP: resolve the area with `ma_get_location_typeahead`.
8. Call `ma_get_time_series_data` with `custom_location_boundary.location_ids`, `type_group`, `business_type` `sale`, `data_point` `price_down`, `date_interval` `month`, `date_range.min` and an `alias`.

If cuts are rising across the whole area, one seller's cuts say less about that seller.

### On a target, read total_sale_price_change and last_sale_price_reduction from comps_get-comparables

9. Over MCP: call `comps_get-comparables` with these inputs:
   - `location_boundary.circle.target_point.address` and a `distance` in kilometres
   - `operation` `sale`
   - `comparables_types`
   - `comparables_count` (1 to 50)
   - `sold_or_rented_after: null`, so only active properties are considered
10. Read the price fields of each result: `total_sale_price_change` and `last_sale_price_reduction` (both in percent) and `sale_price_last_change`. This covers the neighbours, and the target itself if it appears among the results.
11. Compare the asking price with the response's `estimated_prices`.

## Example: houses in Marbella with two or more cuts

A Casafari client account first pulls this year's price-cut alerts for houses in Marbella. Replace `<MARBELLA_LOCATION_ID>` with the location id. Replace `<PRICE_DECREASE_SUBTYPE>` with the value listed on the [Search alerts (v1)](/docs/rest/alerts/search-alerts-v1) page.

```json
{
  "operation": "sale",
  "location_ids": [<MARBELLA_LOCATION_ID>],
  "types": ["house", "villa", "townhouse"],
  "alert_subtypes": [<PRICE_DECREASE_SUBTYPE>],
  "alert_date_from": "2026-01-01"
}
```

Next, it calls `GET /api/v1/properties/search/{property_id}` for each property in the alerts. It keeps those whose `sale_price_history` shows two or more consecutive reductions.

For context, ask an assistant connected to the Casafari MCP server: *"How many price cuts were there on houses for sale in Marbella each month this year? Among comparable houses within 2 km of Avenida Ricardo Soriano, Marbella, which have cut their price?"* It calls:

1. `ma_get_location_typeahead` with Marbella.
2. `ma_get_time_series_data` with `type_group` `house`, `data_point` `price_down` and `date_interval` `month`.
3. `comps_get-comparables` with the address, `distance` 2, `operation` `sale`, `comparables_types` ["house", "villa", "townhouse"], `comparables_count` 20 and `sold_or_rented_after` null.

## How to read the result

### sale_price_last_change: change_date, old_value, new_value

`sale_price_last_change` gives the date of the last price change (`change_date`) and the price before and after it (`old_value`, `new_value`). If `new_value` is lower, the last change was a cut. `last_sale_price_reduction` gives the size of that cut in percent, and `total_sale_price_change` gives the total change in percent.

### Several cuts plus long days on market: a negotiable seller

A property with two or more consecutive cuts that has also stayed on the market a long time points to a seller ready to negotiate. It is a signal, not proof. Check it against the area's `price_down` trend and against `fair_market_price` from `estimated_prices` before you make an offer or pitch a new strategy.

## Limits

### No search filter for the number of cuts: count them from the history

No operation in the sources filters by the number of price cuts. You count them yourself from `sale_price_history` or `rent_price_history`.

`/alerts-api/*` feeds, `POST /api/v1/listing-alerts/search`, `POST /api/v2/properties/search` and `GET /api/v1/properties/search/{property_id}` are for Casafari client accounts. `ma_get_time_series_data` and `comps_get-comparables` are available over MCP to Casafari clients with MCP access. For the feeds, the property search and fetch, and these two tools, self-serve access for new users is coming soon.

### The alert_subtypes values

`alert_subtypes` in a feed's `filters` accepts `new`, `price_increased`, `price_decreased`, `reserved`, `delisted` and `sold`. A feed has no key for the number of consecutive cuts either, so every `price_decreased` alert is one cut and you count repeats yourself.

The history shows what the price did, not why. No refresh frequency, quotas or prices are published; ask [Casafari](https://www.casafari.com/).

## Questions

### Can I get price-cut alerts over MCP?

No. Price-cut alerts belong to New Market Leads, which is offered over the REST API only. Over the Casafari MCP server, two tools help. `ma_get_time_series_data` with `data_point` `price_down` counts price decreases in an area over time. `comps_get-comparables` returns `total_sale_price_change`, `last_sale_price_reduction` and `sale_price_last_change` for properties around a point. Both are available to Casafari clients with MCP access.

### Does a price cut alert fire once per property or once per advertisement?

Alerts follow the property graph, where every advertisement of a property is merged into one record with its full history. A price change is therefore reported for the property, not once for each agency or portal advertising it. This is why Casafari counts properties, not advertisements, and why a lead list built from alerts does not repeat the same home.

### Can I see rent price cuts too?

Yes. The graph keeps `rent_price_history` alongside `sale_price_history`. With `operation` `rent`, `comps_get-comparables` returns `total_rent_price_change`, `last_rent_price_reduction` and `rent_price_last_change`. `ma_get_time_series_data` with `business_type` `rent` and `data_point` `price_down` gives the area trend. `POST /api/v1/listing-alerts/search` also takes an `operation` field for rent alerts.

### How do I combine price cuts with below-market pricing?

Run `comps_get-comparables` around the property and compare its asking price with `fair_market_price` in `estimated_prices`. Set `exclude_outliers` to false so underpriced properties stay in the results, then read `is_outlier`. A property with repeated cuts that now sits below the fair market price is both a motivated seller and a possible bargain. `ma_get_price_distribution` adds the area's price bands.

All use cases: [Use cases](/docs/use-cases#leads).
