---
title: "Land value by initial yield on cost (revenoo)"
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**Caching.** Redis `valuation:v1:yoc:<egrid>` for 6 h (revenoo's market inputs are a daily snapshot); an unknown parcel is cached for 1 h; a point's EGRID for 7 days. `X-Cache-Outcome: hit|miss`."
---

> 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

`GET /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.

**Caching.** Redis `valuation:v1:yoc:<egrid>` for 6 h (revenoo's market inputs are a daily snapshot); an unknown parcel is cached for 1 h; a point's EGRID for 7 days. `X-Cache-Outcome: hit|miss`.

## Authentication

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

## Query parameters

- `egrid` (`getYieldOnCost.query.egrid`; string, optional): Swiss parcel identifier (CH + 12 alphanumerics; spaces ignored, case-insensitive). Required unless `lat` and `lng` are given; wins when both are.
- `lat` (`getYieldOnCost.query.lat`; number, optional): WGS84 latitude of a point on the parcel (with `lng`, instead of `egrid`).
  - min 45.7; max 47.9
- `lng` (`getYieldOnCost.query.lng`; number, optional): WGS84 longitude of a point on the parcel.
  - min 5.9; max 10.6

## Code samples

### cURL

```bash
curl --request GET \
  --url https://res.aireon.ch/res_api/valuation/yield-on-cost \
  --header 'token: <token>'
```

### TypeScript

```typescript
const url = 'https://res.aireon.ch/res_api/valuation/yield-on-cost';
const options = {method: 'GET', headers: {token: '<token>'}};

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"

headers = {"token": "<token>"}

response = requests.get(url, headers=headers)

print(response.text)
```

## Responses

### 200

The yield-on-cost valuation (revenoo's body).

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

### 400

Missing or invalid EGRID / point.

#### Example

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

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

### 401

Missing token. (v2 callers only.)

#### Example

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

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

### 403

Wrong token. (v2 callers only.)

#### Example

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

- `error` (`getYieldOnCost.response.403.error`; string, required): Human-readable error description.
- `message` (`getYieldOnCost.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` (`getYieldOnCost.response.404.error`; string, required): Human-readable error description.
- `message` (`getYieldOnCost.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` (`getYieldOnCost.response.429.error`; string, required): Human-readable error description.
- `message` (`getYieldOnCost.response.429.message`; string, optional): Optional underlying error message.

### 500

Unexpected error.

#### Example

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

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

### 502

The valuation service failed.

#### Example

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

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

### 504

The valuation service timed out.

#### Example

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

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


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