---
title: "Land value by initial yield on cost"
description: "The land value at which the initial yield on cost (annual income on completion of letting ÷ total development cost, RICS B2.2.3.4) meets the target, in full: the income basis, every development cost line with finance and letting expenses, what is left for the land, an asking price's yield on cost and the target yield × construction cost grid. A development land value: the parcel built out to its buildable area, not the value of what stands on it today."
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.aireon.ch/llms.txt
> Use this file to discover all available pages before exploring further.

Path: revenoo API › Valuation

`GET /api/valuation/{egrid}/yield-on-cost`

The land value at which the initial yield on cost (annual income on completion of letting ÷ total development cost, RICS B2.2.3.4) meets the target, in full: the income basis, every development cost line with finance and letting expenses, what is left for the land, an asking price's yield on cost and the target yield × construction cost grid. A development land value: the parcel built out to its buildable area, not the value of what stands on it today.

## Path parameters

- `egrid` (`getRevenooYieldOnCost.path.egrid`; string, required): Swiss parcel identifier: "CH" followed by 12 characters. Spaces are ignored, letters may be lower case.
  - pattern `^[Cc][Hh][0-9A-Za-z]{12}$`

## Code samples

### cURL

```bash
curl --request GET \
  --url https://revenoo.aireon.ch/api/valuation/CH427777450687/yield-on-cost
```

### TypeScript

```typescript
const url = 'https://revenoo.aireon.ch/api/valuation/CH427777450687/yield-on-cost';
const options = {method: 'GET'};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));
```

### Python

```python
import requests

url = "https://revenoo.aireon.ch/api/valuation/CH427777450687/yield-on-cost"

response = requests.get(url)

print(response.text)
```

## Responses

### 200

Land value by initial yield on cost

#### Example

```json
{
  "api_version": "2.0.0",
  "valuation_date": "2026-11-03",
  "parcel": {
    "egrid": "CH427777450687",
    "address": "Hausmattweg 1",
    "zip": "4663",
    "municipality": "Aarburg",
    "bfs_number": 4271,
    "canton": "AG",
    "zone": "Wohnzone W3",
    "lat": 47.322534,
    "lng": 7.898823,
    "land_area_m2": 2276,
    "buildable_gfa_m2": 1707,
    "rentable_area_m2": 1366
  },
  "data": {
    "market_data": "missing",
    "market_data_date": null,
    "municipality_rent_per_m2_year": null,
    "zurich_reference_rent_per_m2_year": null
  },
  "links": {
    "app": "https://revenoo.aireon.ch/?lat=47.322534&lng=7.898823&parcel_id=CH427777450687",
    "docs": "https://revenoo.aireon.ch/api/openapi.json"
  },
  "yield_on_cost": {
    "land_value": 2431836,
    "per_m2_land": 1068,
    "per_m2_nia": 1780,
    "target_initial_yield_on_cost_pct": 5,
    "income_basis": "gross_rent",
    "annual_income": 462554,
    "income": {
      "gross_potential_rent": 462554,
      "noi_before_capex": 393818,
      "noi_after_capex": 341318
    },
    "max_total_development_cost": 9251071,
    "development_costs": {
      "construction_cost_per_m2_nia": 4000,
      "construction_costs": 5464000,
      "professional_fees": 655680,
      "contingency": 273200,
      "letting_expenses": 21971,
      "finance_rate_pct": 3,
      "development_period_months": 24,
      "finance_on_development_costs": 191786
    },
    "available_at_completion": 2644434,
    "finance_on_land": 151801,
    "available_for_land": 2492632,
    "site_acquisition_costs": 60796,
    "at_asking_price": null,
    "sensitivity": {
      "rows": "target_yield_on_cost_pct",
      "columns": "construction_cost_per_m2_nia",
      "row_values": [
        4,
        4.5,
        5,
        5.5,
        6
      ],
      "column_values": [
        3600,
        3800,
        4000,
        4200,
        4400
      ],
      "cells": [
        [
          5164201,
          4861436,
          4558671,
          4255906,
          3953141
        ],
        [
          3982626,
          3679861,
          3377096,
          3074331,
          2771567
        ],
        [
          3037366,
          2734601,
          2431836,
          2129072,
          1826307
        ],
        [
          2263972,
          1961207,
          1658442,
          1355677,
          1052912
        ],
        [
          1619476,
          1316712,
          1013947,
          711182,
          408417
        ]
      ],
      "current": {
        "row": 2,
        "column": 2
      }
    },
    "method": "Initial yield on cost: the annual income on completion of letting over the total development cost (land, its acquisition costs, construction, professional fees, contingency, letting expenses and finance on all of them). Read backwards at the target yield it caps the total development cost, and the land value is what the other costs leave. It values the land for development to the parcel's buildable area, not the property that stands on it today.",
    "sources": [
      {
        "source": "rics_development",
        "title": "RICS, Valuation of development property (1st ed., 2019)",
        "paragraphs": "B2.2.3.4, B2.2.2, B1.2.6.2"
      }
    ]
  },
  "assumptions": {
    "asking_land_price": null,
    "rentable_area_m2": 1366,
    "residential_rent_per_m2_year": 281.52,
    "vacancy_pct": 3,
    "discount_rate_real_pct": 2.1,
    "macro_premium_pct": 0,
    "micro_rating": "average",
    "micro_premium_bp": null,
    "usage_rating": "residential",
    "condition_rating": "new",
    "special_premium_pct": 0,
    "inflation_pct": 1,
    "forecast_years": 10,
    "rent_growth_real_pct": 0,
    "discount_timing": "mid_year",
    "exit_cap_rate_pct": null,
    "exit_sale_costs_pct": 2,
    "lease_up": true,
    "initial_occupancy_pct": 75,
    "lease_up_months": 12,
    "cap_rate_pct": 2.95,
    "noi_convention": "after_capex",
    "gdv_source": "dcf",
    "gdv_manual": 0,
    "construction_cost_per_m2_nia": 4000,
    "professional_fees_pct": 12,
    "contingency_pct": 5,
    "sale_costs_pct": 2,
    "site_acquisition_costs_pct": 2.5,
    "development_period_months": 24,
    "target_irr_pct": 15,
    "finance_rate_pct": 3,
    "developers_profit_pct": 10,
    "target_yield_on_cost_pct": 5,
    "yield_on_cost_basis": "gross_rent"
  }
}
```

- `api_version` (`getRevenooYieldOnCost.response.200.api_version`; string, required)
- `valuation_date` (`getRevenooYieldOnCost.response.200.valuation_date`; string, required)
  - format `date`
- `parcel` (`getRevenooYieldOnCost.response.200.parcel`; object, required): The parcel: EGRID, address, municipality, BFS number, canton, zone, coordinates and areas.
- `data` (`getRevenooYieldOnCost.response.200.data`; object, required): Provenance: market data status and date, municipal and Zürich reference rents.
- `links` (`getRevenooYieldOnCost.response.200.links`; object, required): `app` opens this valuation in revenoo; `docs` is this document.
- `assumptions` (`getRevenooYieldOnCost.response.200.assumptions`; object, required): Assumptions you can change. Omitted keys keep the defaults the response reports.
  - `asking_land_price` (`getRevenooYieldOnCost.response.200.assumptions.asking_land_price`; number | null, optional): Asking price of the land. When set, the response appraises it: project IRR, profit on cost and on value, initial yield on cost.
    - min 0; max 100000000000
  - `rentable_area_m2` (`getRevenooYieldOnCost.response.200.assumptions.rentable_area_m2`; number, optional): Rentable area (NIA) in m². The unit mix is rescaled to it.
    - min 1; max 10000000
  - `residential_rent_per_m2_year` (`getRevenooYieldOnCost.response.200.assumptions.residential_rent_per_m2_year`; number, optional): Rent per m² NIA and year for every apartment row of the unit mix (parking keeps its own rent).
    - min 0; max 5000
  - `vacancy_pct` (`getRevenooYieldOnCost.response.200.assumptions.vacancy_pct`; number, optional): Stabilized vacancy, in percent of GPR, applied to every row of the unit mix.
    - min 0; max 100
  - `discount_rate_real_pct` (`getRevenooYieldOnCost.response.200.assumptions.discount_rate_real_pct`; number, optional): Real discount rate in percent. Setting it enters the macro rate at this value and resets the premiums to zero; premium assumptions sent with it add to it.
    - min 0; max 30
  - `macro_premium_pct` (`getRevenooYieldOnCost.response.200.assumptions.macro_premium_pct`; number, optional): Macro premium added to the macro rate, in percent.
    - min -10; max 10
  - `micro_rating` (`getRevenooYieldOnCost.response.200.assumptions.micro_rating`; string, optional): Micro location grade, which sets the micro premium.
    - one of `"good"`, `"average"`, `"weak"`
  - `micro_premium_bp` (`getRevenooYieldOnCost.response.200.assumptions.micro_premium_bp`; number | null, optional): Micro premium in basis points; replaces the micro rating while set (e.g. from proove). null returns to the rating.
    - min -500; max 500
  - `usage_rating` (`getRevenooYieldOnCost.response.200.assumptions.usage_rating`; string, optional): Use of the property, which sets the usage premium.
    - one of `"residential"`, `"office"`, `"retail"`, `"commercial"`
  - `condition_rating` (`getRevenooYieldOnCost.response.200.assumptions.condition_rating`; string, optional): Condition of the building, which sets the condition premium.
    - one of `"new"`, `"like_new"`, `"normal_condition"`, `"minor_renovation_needed"`, `"major_renovation_needed"`
  - `special_premium_pct` (`getRevenooYieldOnCost.response.200.assumptions.special_premium_pct`; number, optional): Special premium for risks no other factor covers, in percent.
    - min -10; max 10
  - `inflation_pct` (`getRevenooYieldOnCost.response.200.assumptions.inflation_pct`; number, optional): Expected inflation in percent; real rate plus inflation gives the nominal rate, shown for reference (the cash flows are real).
    - min -5; max 20
  - `forecast_years` (`getRevenooYieldOnCost.response.200.assumptions.forecast_years`; integer, optional): Explicit forecast period in years (RICS §4.65: markets often default to about ten).
    - min 1; max 50
  - `rent_growth_real_pct` (`getRevenooYieldOnCost.response.200.assumptions.rent_growth_real_pct`; number, optional): Real rent growth per year, in percent. Must stay below the real discount rate.
    - min -10; max 10
  - `discount_timing` (`getRevenooYieldOnCost.response.200.assumptions.discount_timing`; string, optional): Discount each year from its middle or its end.
    - one of `"mid_year"`, `"end_year"`
  - `exit_cap_rate_pct` (`getRevenooYieldOnCost.response.200.assumptions.exit_cap_rate_pct`; number | null, optional): Exit capitalization rate in percent. null lets it follow the discount rate (RICS §4.59 with no real growth).
    - min 0.1; max 30
  - `exit_sale_costs_pct` (`getRevenooYieldOnCost.response.200.assumptions.exit_sale_costs_pct`; number, optional): Sale costs deducted from the terminal value, in percent (RICS §4.63).
    - min 0; max 20
  - `lease_up` (`getRevenooYieldOnCost.response.200.assumptions.lease_up`; boolean, optional): Model a lease-up: occupancy rises from the initial level to stabilized over the lease-up months.
  - `initial_occupancy_pct` (`getRevenooYieldOnCost.response.200.assumptions.initial_occupancy_pct`; number, optional): Occupancy at the start of the lease-up, in percent.
    - min 0; max 100
  - `lease_up_months` (`getRevenooYieldOnCost.response.200.assumptions.lease_up_months`; integer, optional): Months until stabilized occupancy.
    - min 0; max 60
  - `cap_rate_pct` (`getRevenooYieldOnCost.response.200.assumptions.cap_rate_pct`; number, optional): Capitalization rate in percent: direct cap value = stabilized NOI ÷ cap rate.
    - min 0.1; max 30
  - `noi_convention` (`getRevenooYieldOnCost.response.200.assumptions.noi_convention`; string, optional): Which NOI is capitalized.
    - one of `"after_capex"`, `"before_capex"`, `"custom_factor"`
  - `gdv_source` (`getRevenooYieldOnCost.response.200.assumptions.gdv_source`; string, optional): Where the gross development value (GDV) comes from.
    - one of `"dcf"`, `"direct_cap"`, `"manual"`
  - `gdv_manual` (`getRevenooYieldOnCost.response.200.assumptions.gdv_manual`; number, optional): GDV amount when gdv_source is manual.
    - min 0; max 100000000000
  - `construction_cost_per_m2_nia` (`getRevenooYieldOnCost.response.200.assumptions.construction_cost_per_m2_nia`; number, optional): Construction costs per m² NIA.
    - min 0; max 50000
  - `professional_fees_pct` (`getRevenooYieldOnCost.response.200.assumptions.professional_fees_pct`; number, optional): Professional fees, in percent of construction costs (RICS B1.2.6).
    - min 0; max 50
  - `contingency_pct` (`getRevenooYieldOnCost.response.200.assumptions.contingency_pct`; number, optional): Contingency, in percent of construction costs (RICS B1.2.5).
    - min 0; max 50
  - `sale_costs_pct` (`getRevenooYieldOnCost.response.200.assumptions.sale_costs_pct`; number, optional): Sale costs, in percent of GDV (GDV less sale costs is the NDV).
    - min 0; max 20
  - `site_acquisition_costs_pct` (`getRevenooYieldOnCost.response.200.assumptions.site_acquisition_costs_pct`; number, optional): Site acquisition costs, in percent of the land price (RICS B1.2.2).
    - min 0; max 20
  - `development_period_months` (`getRevenooYieldOnCost.response.200.assumptions.development_period_months`; integer, optional): Development period from land purchase to completion, in months.
    - min 1; max 240
  - `target_irr_pct` (`getRevenooYieldOnCost.response.200.assumptions.target_irr_pct`; number, optional): Target rate of return of the DCF application: a project IRR before finance, real (RICS §6.2.4, §7.2.4).
    - min 0; max 100
  - `finance_rate_pct` (`getRevenooYieldOnCost.response.200.assumptions.finance_rate_pct`; number, optional): Cost of finance per year, on 100% of land and building costs (RICS B2.2.2).
    - min 0; max 30
  - `developers_profit_pct` (`getRevenooYieldOnCost.response.200.assumptions.developers_profit_pct`; number, optional): Developer's profit, in percent of GDV (RICS B2.2.3).
    - min 0; max 100
  - `target_yield_on_cost_pct` (`getRevenooYieldOnCost.response.200.assumptions.target_yield_on_cost_pct`; number, optional): Target initial yield on cost: annual income over total development cost, in percent (RICS B2.2.3.4).
    - min 0.1; max 50
  - `yield_on_cost_basis` (`getRevenooYieldOnCost.response.200.assumptions.yield_on_cost_basis`; string, optional): The annual income the yield on cost is read on: GPR, or NOI before or after the capex reserve.
    - one of `"gross_rent"`, `"noi_before_capex"`, `"noi_after_capex"`

### 400

Invalid EGRID or assumptions. `details` lists each invalid assumption.

#### Example

```json
{
  "error": "string",
  "details": null
}
```

- `error` (`getRevenooYieldOnCost.response.400.error`; string, required)
- `details` (`getRevenooYieldOnCost.response.400.details`; unknown, optional): For invalid assumptions: one { key, message } per problem.

### 404

No parcel with this EGRID, or an unknown part.

#### Example

```json
{
  "error": "string",
  "details": null
}
```

- `error` (`getRevenooYieldOnCost.response.404.error`; string, required)
- `details` (`getRevenooYieldOnCost.response.404.details`; unknown, optional): For invalid assumptions: one { key, message } per problem.

### 429

Too many uncached requests from this client; retry after the Retry-After seconds.

#### Example

```json
{
  "error": "string",
  "details": null
}
```

- `error` (`getRevenooYieldOnCost.response.429.error`; string, required)
- `details` (`getRevenooYieldOnCost.response.429.details`; unknown, optional): For invalid assumptions: one { key, message } per problem.

### 502

The data service (RES) failed.

#### Example

```json
{
  "error": "string",
  "details": null
}
```

- `error` (`getRevenooYieldOnCost.response.502.error`; string, required)
- `details` (`getRevenooYieldOnCost.response.502.details`; unknown, optional): For invalid assumptions: one { key, message } per problem.

### 503

The data service is not configured.

#### Example

```json
{
  "error": "string",
  "details": null
}
```

- `error` (`getRevenooYieldOnCost.response.503.error`; string, required)
- `details` (`getRevenooYieldOnCost.response.503.details`; unknown, optional): For invalid assumptions: one { key, message } per problem.


Source: https://docs.aireon.ch/revenoo/get-revenoo-yield-on-cost/index.md
