---
title: "Land value by yield on cost with your assumptions"
description: "The yield on cost land value with any of the documented assumptions changed: target_yield_on_cost_pct, yield_on_cost_basis, construction_cost_per_m2_nia, finance_rate_pct, development_period_months, an asking_land_price to appraise, rents and areas."
---

> 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

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

The yield on cost land value with any of the documented assumptions changed: target_yield_on_cost_pct, yield_on_cost_basis, construction_cost_per_m2_nia, finance_rate_pct, development_period_months, an asking_land_price to appraise, rents and areas.

## Path parameters

- `egrid` (`valueRevenooYieldOnCostWithAssumptions.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}$`

## Request body

_Required._

- `assumptions` (`valueRevenooYieldOnCostWithAssumptions.assumptions`; object, required): Assumptions you can change. Omitted keys keep the defaults the response reports.
  - `asking_land_price` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.assumptions.macro_premium_pct`; number, optional): Macro premium added to the macro rate, in percent.
    - min -10; max 10
  - `micro_rating` (`valueRevenooYieldOnCostWithAssumptions.assumptions.micro_rating`; string, optional): Micro location grade, which sets the micro premium.
    - one of `"good"`, `"average"`, `"weak"`
  - `micro_premium_bp` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.assumptions.usage_rating`; string, optional): Use of the property, which sets the usage premium.
    - one of `"residential"`, `"office"`, `"retail"`, `"commercial"`
  - `condition_rating` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.assumptions.special_premium_pct`; number, optional): Special premium for risks no other factor covers, in percent.
    - min -10; max 10
  - `inflation_pct` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.assumptions.discount_timing`; string, optional): Discount each year from its middle or its end.
    - one of `"mid_year"`, `"end_year"`
  - `exit_cap_rate_pct` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.assumptions.initial_occupancy_pct`; number, optional): Occupancy at the start of the lease-up, in percent.
    - min 0; max 100
  - `lease_up_months` (`valueRevenooYieldOnCostWithAssumptions.assumptions.lease_up_months`; integer, optional): Months until stabilized occupancy.
    - min 0; max 60
  - `cap_rate_pct` (`valueRevenooYieldOnCostWithAssumptions.assumptions.cap_rate_pct`; number, optional): Capitalization rate in percent: direct cap value = stabilized NOI ÷ cap rate.
    - min 0.1; max 30
  - `noi_convention` (`valueRevenooYieldOnCostWithAssumptions.assumptions.noi_convention`; string, optional): Which NOI is capitalized.
    - one of `"after_capex"`, `"before_capex"`, `"custom_factor"`
  - `gdv_source` (`valueRevenooYieldOnCostWithAssumptions.assumptions.gdv_source`; string, optional): Where the gross development value (GDV) comes from.
    - one of `"dcf"`, `"direct_cap"`, `"manual"`
  - `gdv_manual` (`valueRevenooYieldOnCostWithAssumptions.assumptions.gdv_manual`; number, optional): GDV amount when gdv_source is manual.
    - min 0; max 100000000000
  - `construction_cost_per_m2_nia` (`valueRevenooYieldOnCostWithAssumptions.assumptions.construction_cost_per_m2_nia`; number, optional): Construction costs per m² NIA.
    - min 0; max 50000
  - `professional_fees_pct` (`valueRevenooYieldOnCostWithAssumptions.assumptions.professional_fees_pct`; number, optional): Professional fees, in percent of construction costs (RICS B1.2.6).
    - min 0; max 50
  - `contingency_pct` (`valueRevenooYieldOnCostWithAssumptions.assumptions.contingency_pct`; number, optional): Contingency, in percent of construction costs (RICS B1.2.5).
    - min 0; max 50
  - `sale_costs_pct` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.assumptions.development_period_months`; integer, optional): Development period from land purchase to completion, in months.
    - min 1; max 240
  - `target_irr_pct` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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"`

## Example request

```json
{
  "assumptions": {
    "target_yield_on_cost_pct": 4.5,
    "construction_cost_per_m2_nia": 4200,
    "asking_land_price": 2500000
  }
}
```

## Code samples

### cURL

```bash
curl --request POST \
  --url https://revenoo.aireon.ch/api/valuation/CH427777450687/yield-on-cost \
  --header 'Content-Type: application/json' \
  --data '
{
  "assumptions": {
    "target_yield_on_cost_pct": 4.5,
    "construction_cost_per_m2_nia": 4200,
    "asking_land_price": 2500000
  }
}
'
```

### TypeScript

```typescript
const url = 'https://revenoo.aireon.ch/api/valuation/CH427777450687/yield-on-cost';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    assumptions: {
      target_yield_on_cost_pct: 4.5,
      construction_cost_per_m2_nia: 4200,
      asking_land_price: 2500000
    }
  })
};

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"

payload = { "assumptions": {
        "target_yield_on_cost_pct": 4.5,
        "construction_cost_per_m2_nia": 4200,
        "asking_land_price": 2500000
    } }
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
```

## Responses

### 200

The yield on cost land value.

#### Example

```json
{
  "api_version": "string",
  "valuation_date": "2019-08-24",
  "parcel": {},
  "data": {},
  "links": {},
  "assumptions": {
    "asking_land_price": 100000000000,
    "rentable_area_m2": 1,
    "residential_rent_per_m2_year": 5000,
    "vacancy_pct": 100,
    "discount_rate_real_pct": 30,
    "macro_premium_pct": -10,
    "micro_rating": "good",
    "micro_premium_bp": -500,
    "usage_rating": "residential",
    "condition_rating": "new",
    "special_premium_pct": -10,
    "inflation_pct": -5,
    "forecast_years": 1,
    "rent_growth_real_pct": -10,
    "discount_timing": "mid_year",
    "exit_cap_rate_pct": 0.1,
    "exit_sale_costs_pct": 20,
    "lease_up": true,
    "initial_occupancy_pct": 100,
    "lease_up_months": 60,
    "cap_rate_pct": 0.1,
    "noi_convention": "after_capex",
    "gdv_source": "dcf",
    "gdv_manual": 100000000000,
    "construction_cost_per_m2_nia": 50000,
    "professional_fees_pct": 50,
    "contingency_pct": 50,
    "sale_costs_pct": 20,
    "site_acquisition_costs_pct": 20,
    "development_period_months": 1,
    "target_irr_pct": 100,
    "finance_rate_pct": 30,
    "developers_profit_pct": 100,
    "target_yield_on_cost_pct": 0.1,
    "yield_on_cost_basis": "gross_rent"
  }
}
```

- `api_version` (`valueRevenooYieldOnCostWithAssumptions.response.200.api_version`; string, required)
- `valuation_date` (`valueRevenooYieldOnCostWithAssumptions.response.200.valuation_date`; string, required)
  - format `date`
- `parcel` (`valueRevenooYieldOnCostWithAssumptions.response.200.parcel`; object, required): The parcel: EGRID, address, municipality, BFS number, canton, zone, coordinates and areas.
- `data` (`valueRevenooYieldOnCostWithAssumptions.response.200.data`; object, required): Provenance: market data status and date, municipal and Zürich reference rents.
- `links` (`valueRevenooYieldOnCostWithAssumptions.response.200.links`; object, required): `app` opens this valuation in revenoo; `docs` is this document.
- `assumptions` (`valueRevenooYieldOnCostWithAssumptions.response.200.assumptions`; object, required): Assumptions you can change. Omitted keys keep the defaults the response reports.
  - `asking_land_price` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.response.200.assumptions.macro_premium_pct`; number, optional): Macro premium added to the macro rate, in percent.
    - min -10; max 10
  - `micro_rating` (`valueRevenooYieldOnCostWithAssumptions.response.200.assumptions.micro_rating`; string, optional): Micro location grade, which sets the micro premium.
    - one of `"good"`, `"average"`, `"weak"`
  - `micro_premium_bp` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.response.200.assumptions.usage_rating`; string, optional): Use of the property, which sets the usage premium.
    - one of `"residential"`, `"office"`, `"retail"`, `"commercial"`
  - `condition_rating` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.response.200.assumptions.special_premium_pct`; number, optional): Special premium for risks no other factor covers, in percent.
    - min -10; max 10
  - `inflation_pct` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.response.200.assumptions.lease_up_months`; integer, optional): Months until stabilized occupancy.
    - min 0; max 60
  - `cap_rate_pct` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.response.200.assumptions.noi_convention`; string, optional): Which NOI is capitalized.
    - one of `"after_capex"`, `"before_capex"`, `"custom_factor"`
  - `gdv_source` (`valueRevenooYieldOnCostWithAssumptions.response.200.assumptions.gdv_source`; string, optional): Where the gross development value (GDV) comes from.
    - one of `"dcf"`, `"direct_cap"`, `"manual"`
  - `gdv_manual` (`valueRevenooYieldOnCostWithAssumptions.response.200.assumptions.gdv_manual`; number, optional): GDV amount when gdv_source is manual.
    - min 0; max 100000000000
  - `construction_cost_per_m2_nia` (`valueRevenooYieldOnCostWithAssumptions.response.200.assumptions.construction_cost_per_m2_nia`; number, optional): Construction costs per m² NIA.
    - min 0; max 50000
  - `professional_fees_pct` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.response.200.assumptions.contingency_pct`; number, optional): Contingency, in percent of construction costs (RICS B1.2.5).
    - min 0; max 50
  - `sale_costs_pct` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.response.200.assumptions.development_period_months`; integer, optional): Development period from land purchase to completion, in months.
    - min 1; max 240
  - `target_irr_pct` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.response.400.error`; string, required)
- `details` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.response.404.error`; string, required)
- `details` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.response.429.error`; string, required)
- `details` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.response.502.error`; string, required)
- `details` (`valueRevenooYieldOnCostWithAssumptions.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` (`valueRevenooYieldOnCostWithAssumptions.response.503.error`; string, required)
- `details` (`valueRevenooYieldOnCostWithAssumptions.response.503.details`; unknown, optional): For invalid assumptions: one { key, message } per problem.


Source: https://docs.aireon.ch/revenoo/value-revenoo-yield-on-cost-with-assumptions/index.md
