Screen investments · Use case
What gross rental yield can I expect in this area, and which properties beat it?
Casafari's tools do not return an area yield directly. You compute gross yield by dividing annualised rent per m² by sale price per m², both from Area Insights' area-insights_get_time_series_data on the same boundary. To find properties that beat it, filter POST /api/v2/properties/search by gross_yield_from, then check gross_yield on comparables_get_comparables results.
Products: Area Insights, References, Property Sourcing, Comparables & Valuation
Short answer
Area gross yield = annual rent per m² ÷ sale price per m² × 100. Compare like with like: same boundary, type group, bedroom range and period.
Area Insights gives you both inputs. Call area-insights_get_time_series_data with data_point avg_price_psqm twice: once with business_type rent, once with business_type sale.
At property level, gross_yield appears in two places:
- as a filter on
POST /api/v2/properties/search, throughgross_yield_fromandgross_yield_to - as a field on each
comparables_get_comparablesresult, described as gross yield in percentage
The property graph keeps one record per property, so a home advertised by several agencies is counted once on both the rent side and the sale side (The property graph).
Steps
Resolve the area
Call
locations_searchwith an English place name, for examplePorto. Checkadministrative_levelandbreadcrumbsto choose between a city and a district with the same name, and keep thelocation_id.You can use a
circleinstead: atarget_pointplus adistancein meters, from 50 to 50000. Note that the Area Insights tools measure the circle in meters, whilecomparables_get_comparablesuses kilometers.
area-insights_get_time_series_data with business_type rent and avg_price_psqm; repeat with business_type sale
- Call
area-insights_get_time_series_datawith:type_group:apartmentbusiness_type:rentdata_point:avg_price_psqmdate_interval:monthdate_range.minalias: for examplePorto rentcustom_location_boundary.location_ids
- Repeat the call with
business_typesaleand a newalias, keeping every other field the same. - Take the latest
valuefrom each series. To smooth out a single period, you can instead runarea-insights_get_time_series_operationswithmeanormovavg_last_3on each series. That tool is available over MCP only.
Segment by bedrooms with area-insights_get_bedrooms_distribution for both operations
Call
area-insights_get_bedrooms_distributionwith the same boundary, once withbusiness_typerentand once withsale. On this tool,bedrooms_rangegoes up to 10.Each row returns
bedrooms,properties_count,average_priceandaverage_price_per_sqm. The yield for a bedroom segment is that segment's annualised rentaverage_price_per_sqm÷ its saleaverage_price_per_sqm.properties_countshows how many properties stand behind each figure.
Shortlist properties: POST /api/v2/properties/search with gross_yield_from
Call
POST /api/v2/properties/searchwith:search_operations: salelocation_ids: documented as those returned byPOST /api/v1/references/locationstypesbedrooms_fromandbedrooms_togross_yield_from: at or above the area yield you computed
The field is described only as the "minimum gross yield value", with no unit stated. Comparables report
gross_yieldin percentage, but check the unit on the operation page.
Validate a target: comparables_get_comparables and the gross_yield field
- Call
comparables_get_comparablesaround the target's address or coordinates withoperationrent. Readestimated_prices.fair_market_priceand therent_periodof the results. - Call it again with
operationsale, and compare the annualised fair rent with the asking price. - Read
gross_yieldon the returned comparables to see what similar properties yield nearby.
Example: 1-bedroom apartments in Porto
A person asks their assistant: "What is the gross yield for 1-bedroom apartments in Porto, and which ones beat it?"
The assistant makes these calls:
locations_searchwithPorto.area-insights_get_bedrooms_distributionwithtype_groupapartment,bedrooms_rangemin 1 and max 1,business_typerent.- The same call with
business_typesale. - Optionally,
area-insights_get_time_series_datafor both operations to see the trend.
The calculation, with the values each response returns:
- Call the rent row's
average_price_per_sqmR and the sale row's S. - If R is a monthly figure, the area gross yield is R × 12 ÷ S × 100.
- For one property, divide its annualised rent by its asking price.
The shortlist runs over REST, with a Casafari client account (the self-serve Property Sourcing search has no yield filter):
{
"search_operations": ["sale"],
"location_ids": ["<LOCATION_ID>"],
"types": ["apartment"],
"bedrooms_from": 1,
"bedrooms_to": 1,
"gross_yield_from": "<AREA_YIELD>"
}Replace the placeholders with numbers, and check value formats on the operation page. This page gives no market figures: every number comes from the responses.
How to read the result
Check rent_period: monthly figures must be annualised
comparables_get_comparables results carry rent_period, which is one of day, week, fortnight, month, year or none. Annualise before you divide: multiply monthly figures by 12 and weekly figures by 52.
The Area Insights tool descriptions do not state the period behind rent values. Confirm it before annualising, for example by comparing with rent_price_per_sqm and rent_period on comparables in the same area.
Keep both sides in the same currency. Comparables give sale_price_per_sqm_base and rent_price_per_sqm_base in Euros.
Gross, not net: costs and vacancy are yours to add
Gross yield ignores taxes, maintenance, management, insurance, fees and vacancy, and none of these are in the data.
Area Insights figures describe advertised prices; the product's own example speaks of asking price per m². They are not achieved rents. Treat the result as a screen, not an underwriting figure.
Limits
The tools do not return an area yield; you compute it
No Area Insights data_point is a yield: the data points cover price, price per m², supply and activity. You build the yield from a rent call and a sale call.
What is self-serve:
- The Area Insights tools, including
area-insights_get_heatmap, andcomparables_get_comparablesare self-serve on the Casafari API and MCP Platform. Comparables is self-serve over REST as well as MCP: the platform's REST comparables search takes the same input ascomparables_get_comparablesand returns the same answer. - Existing Casafari clients sign up there too; contract clients are set up on the Custom plan.
Coverage limits:
- The API's permissions list 16 markets.
- The Area Insights tools take
type_groupapartmentorhouseonly. locations_searchexpects English names.- The cadastral-reference input of
comparables_get_comparablesis Spain only. - Other tools name no market.
Commercial and other types: see rentals and commercial.
Property-level yield search is REST only
POST /api/v2/properties/search with gross_yield_from and gross_yield_to is available to Casafari client accounts over REST; the self-serve Property Sourcing search has no yield filter. It is not offered over Casafari MCP. Without REST, check yield property by property with comparables_get_comparables.
The sources give no figures for pricing, quotas, rate limits or data refresh frequency; ask Casafari.
Ask in Claude or ChatGPT
Property Sourcing has an MCP server, https://platform.casafari.com/mcp/property-sourcing, so an assistant can run this from a chat. In Claude or ChatGPT, add a custom connector with that URL; in Claude Code: claude mcp add --transport http casafari-property-sourcing https://platform.casafari.com/mcp/property-sourcing. Sign in with your Casafari Platform account in the browser (a new account starts on the Free plan). Then ask, for example:
Flats in Madrid under €650K, 2+ bedrooms: show each with every agency advertising it and its price history.
The assistant finds the place with locations_search (free), searches with property-sourcing_search (50 tokens a page, property-sourcing_next_page for more), reads each home with property-sourcing_get_property (10 tokens: every agency and portal advertising it and its asking price history) and turns a pasted portal or agency link into its home with property-sourcing_resolve_listing (25 tokens). Prices are asking prices. See Property Sourcing.
Questions
Is gross_yield based on asking prices?
These docs do not document how gross_yield is calculated. The field is defined only as gross yield in percentage, on comparables_get_comparables results and as a filter on POST /api/v2/properties/search. The area yield you compute from Area Insights uses advertised prices, and the product's own example speaks of asking price per m². For the exact method behind gross_yield, ask Casafari at https://www.casafari.com/.
Can I compare yields across districts in one go?
Yes. Use area-insights_get_heatmap, which returns a value for each child location of a location_id, such as the districts of a city. Call it with data_point avg_price_psqm once with business_type rent and once with sale, then divide per district after annualising rent. The heatmap includes only active properties. area-insights_get_time_series_data returns one series per call, not one per district.
Can I get a yield heatmap?
Not directly, because area-insights_get_heatmap has no yield data_point. Build the heatmap yourself: run area-insights_get_heatmap twice on the same location_id, type_group and date_range, once for rent and once for sale avg_price_psqm. Then divide each district's annualised rent value by its sale value. Each row's location_id and location_name let you join the two results and draw the map.
How do I move from gross to net yield?
Subtract your own costs, because Casafari data does not include them. The calculation is net yield = (annual rent − taxes, maintenance, management, insurance, fees and expected vacancy) ÷ purchase price, including your purchase costs. None of these inputs are in the Area Insights, comparables or property search fields. Use your own figures or an adviser's for each market.