---
title: "Land value by initial yield on cost with your assumptions (what-if)"
description: "The land value of a Swiss parcel by **initial yield on cost** (RICS *Valuation of development property*, 1st ed. 2019, B2.2.3.4): the annual income on completion of letting over the total development cost. Read backwards at a target yield (default 5% on gross rent), it caps the total development cost, and the land value is what remains after construction (default CHF 4,000/m² NIA), professional fees (12%), contingency (5%), letting expenses, finance (3% over 24 months) and site acquisition costs (2.5%).\n\n**What it is.** A *development* land value: the parcel built out to its buildable area (land × the average utilization of its zone in its municipality) with rents from the municipality's market data. It is not the market value of what stands on the parcel today. A **negative** `land_value` is a valid answer: at these costs the rents do not reach the target yield, so development is not viable at that target.\n\n**Engine.** The valuation is revenoo's (https://revenoo.aireon.ch): this route proxies revenoo's public `yield-on-cost` part and returns its body unchanged (`links.docs` documents every field, `links.app` opens the same valuation in revenoo). Units ride in the key: no suffix is an amount (CHF, rounded), `_pct` is percent (5 means 5%), `_m2` square metres.\n\n**Auth / errors.** `token` header. Send `X-RES-API-Version: 2` to receive real 4xx/5xx statuses with a JSON body.\n\n**What-if.** Send any of revenoo's documented assumptions (every response lists the ones it used under `assumptions`), e.g. `target_yield_on_cost_pct`, `yield_on_cost_basis`, `construction_cost_per_m2_nia`, `finance_rate_pct`, `development_period_months`, `asking_land_price`, rents and areas. Unknown keys and out-of-range values are rejected with 400 and `details` (one `{ key, message }` per problem). Never cached."
---

> 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: RES API (public) › Valuation

`POST /res_api/valuation/yield-on-cost`

The land value of a Swiss parcel by **initial yield on cost** (RICS *Valuation of development property*, 1st ed. 2019, B2.2.3.4): the annual income on completion of letting over the total development cost. Read backwards at a target yield (default 5% on gross rent), it caps the total development cost, and the land value is what remains after construction (default CHF 4,000/m² NIA), professional fees (12%), contingency (5%), letting expenses, finance (3% over 24 months) and site acquisition costs (2.5%).

**What it is.** A *development* land value: the parcel built out to its buildable area (land × the average utilization of its zone in its municipality) with rents from the municipality's market data. It is not the market value of what stands on the parcel today. A **negative** `land_value` is a valid answer: at these costs the rents do not reach the target yield, so development is not viable at that target.

**Engine.** The valuation is revenoo's (https://revenoo.aireon.ch): this route proxies revenoo's public `yield-on-cost` part and returns its body unchanged (`links.docs` documents every field, `links.app` opens the same valuation in revenoo). Units ride in the key: no suffix is an amount (CHF, rounded), `_pct` is percent (5 means 5%), `_m2` square metres.

**Auth / errors.** `token` header. Send `X-RES-API-Version: 2` to receive real 4xx/5xx statuses with a JSON body.

**What-if.** Send any of revenoo's documented assumptions (every response lists the ones it used under `assumptions`), e.g. `target_yield_on_cost_pct`, `yield_on_cost_basis`, `construction_cost_per_m2_nia`, `finance_rate_pct`, `development_period_months`, `asking_land_price`, rents and areas. Unknown keys and out-of-range values are rejected with 400 and `details` (one `{ key, message }` per problem). Never cached.

## Authentication

- `ResApiToken`, apiKey, in header, header `token`

## Request body

_Required._

- `egrid` (`valueYieldOnCost.egrid`; string, optional): Swiss parcel identifier (CH + 12 alphanumerics).
- `lat` (`valueYieldOnCost.lat`; number, optional)
  - min 45.7; max 47.9
- `lng` (`valueYieldOnCost.lng`; number, optional)
  - min 5.9; max 10.6
- `assumptions` (`valueYieldOnCost.assumptions`; object, optional): revenoo assumptions to change; omitted keys keep the defaults the response reports.

## Example request

```json
{
  "egrid": "CH119192997709",
  "assumptions": {
    "target_yield_on_cost_pct": 4.5,
    "construction_cost_per_m2_nia": 4200,
    "asking_land_price": 90000000
  }
}
```

## Code samples

### cURL

```bash
curl --request POST \
  --url https://res.aireon.ch/res_api/valuation/yield-on-cost \
  --header 'Content-Type: application/json' \
  --header 'token: <token>' \
  --data '
{
  "egrid": "CH119192997709",
  "assumptions": {
    "target_yield_on_cost_pct": 4.5,
    "construction_cost_per_m2_nia": 4200,
    "asking_land_price": 90000000
  }
}
'
```

### TypeScript

```typescript
const url = 'https://res.aireon.ch/res_api/valuation/yield-on-cost';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json', token: '<token>'},
  body: JSON.stringify({
    egrid: 'CH119192997709',
    assumptions: {
      target_yield_on_cost_pct: 4.5,
      construction_cost_per_m2_nia: 4200,
      asking_land_price: 90000000
    }
  })
};

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

### Python

```python
import requests

url = "https://res.aireon.ch/res_api/valuation/yield-on-cost"

payload = {
    "egrid": "CH119192997709",
    "assumptions": {
        "target_yield_on_cost_pct": 4.5,
        "construction_cost_per_m2_nia": 4200,
        "asking_land_price": 90000000
    }
}
headers = {
    "Content-Type": "application/json",
    "token": "<token>"
}

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

print(response.text)
```

## Responses

### 200

The yield-on-cost valuation with the assumptions applied.

#### Example

```json
{
  "api_version": "string",
  "valuation_date": "2019-08-24",
  "parcel": {},
  "data": {},
  "links": {},
  "yield_on_cost": {
    "land_value": 0,
    "per_m2_land": 0,
    "per_m2_nia": 0,
    "target_initial_yield_on_cost_pct": 0,
    "income_basis": "gross_rent",
    "annual_income": 0,
    "income": {},
    "max_total_development_cost": 0,
    "development_costs": {},
    "available_at_completion": 0,
    "finance_on_land": 0,
    "available_for_land": 0,
    "site_acquisition_costs": 0,
    "at_asking_price": {},
    "sensitivity": {},
    "method": "string",
    "sources": [
      {}
    ]
  },
  "assumptions": {}
}
```

- `api_version` (`valueYieldOnCost.response.200.api_version`; string, optional)
- `valuation_date` (`valueYieldOnCost.response.200.valuation_date`; string, optional)
  - format `date`
- `parcel` (`valueYieldOnCost.response.200.parcel`; object, optional): EGRID, address, municipality, BFS number, canton, zone, coordinates, land area, buildable GFA and rentable area (m²).
- `data` (`valueYieldOnCost.response.200.data`; object, optional): Provenance: market data status and date, municipal and Zürich reference rents.
- `links` (`valueYieldOnCost.response.200.links`; object, optional): `app` opens this valuation in revenoo; `docs` is revenoo's OpenAPI contract.
- `yield_on_cost` (`valueYieldOnCost.response.200.yield_on_cost`; one of, optional)
  - one of: `YieldOnCost`, `null`
- `assumptions` (`valueYieldOnCost.response.200.assumptions`; object, optional): Every assumption the valuation used.

### 400

Missing or invalid EGRID / point, or invalid assumptions (`details` lists each).

#### Example

```json
{
  "error": "string",
  "message": "string"
}
```

- `error` (`valueYieldOnCost.response.400.error`; string, required): Human-readable error description.
- `message` (`valueYieldOnCost.response.400.message`; string, optional): Optional underlying error message.

### 401

Missing token. (v2 callers only.)

#### Example

```json
{
  "error": "string",
  "message": "string"
}
```

- `error` (`valueYieldOnCost.response.401.error`; string, required): Human-readable error description.
- `message` (`valueYieldOnCost.response.401.message`; string, optional): Optional underlying error message.

### 403

Wrong token. (v2 callers only.)

#### Example

```json
{
  "error": "string",
  "message": "string"
}
```

- `error` (`valueYieldOnCost.response.403.error`; string, required): Human-readable error description.
- `message` (`valueYieldOnCost.response.403.message`; string, optional): Optional underlying error message.

### 404

No parcel with this EGRID, or none at this point.

#### Example

```json
{
  "error": "string",
  "message": "string"
}
```

- `error` (`valueYieldOnCost.response.404.error`; string, required): Human-readable error description.
- `message` (`valueYieldOnCost.response.404.message`; string, optional): Optional underlying error message.

### 429

The valuation service is busy; retry after the `Retry-After` seconds.

#### Example

```json
{
  "error": "string",
  "message": "string"
}
```

- `error` (`valueYieldOnCost.response.429.error`; string, required): Human-readable error description.
- `message` (`valueYieldOnCost.response.429.message`; string, optional): Optional underlying error message.

### 500

Unexpected error.

#### Example

```json
{
  "error": "string",
  "message": "string"
}
```

- `error` (`valueYieldOnCost.response.500.error`; string, required): Human-readable error description.
- `message` (`valueYieldOnCost.response.500.message`; string, optional): Optional underlying error message.

### 502

The valuation service failed.

#### Example

```json
{
  "error": "string",
  "message": "string"
}
```

- `error` (`valueYieldOnCost.response.502.error`; string, required): Human-readable error description.
- `message` (`valueYieldOnCost.response.502.message`; string, optional): Optional underlying error message.

### 504

The valuation service timed out.

#### Example

```json
{
  "error": "string",
  "message": "string"
}
```

- `error` (`valueYieldOnCost.response.504.error`; string, required): Human-readable error description.
- `message` (`valueYieldOnCost.response.504.message`; string, optional): Optional underlying error message.


Source: https://docs.aireon.ch/res/value-yield-on-cost/index.md
