---
title: "Two-way sensitivity grids"
description: "Seven 5×5 grids: DCF (rent × discount rate, rent × exit cap rate), direct cap (NOI factor × cap rate) and the land values (target yield, target rate, period, construction costs, GDV)."
---

> 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}/sensitivity`

Seven 5×5 grids: DCF (rent × discount rate, rent × exit cap rate), direct cap (NOI factor × cap rate) and the land values (target yield, target rate, period, construction costs, GDV).

## Path parameters

- `egrid` (`getRevenooSensitivity.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/sensitivity
```

### TypeScript

```typescript
const url = 'https://revenoo.aireon.ch/api/valuation/CH427777450687/sensitivity';
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/sensitivity"

response = requests.get(url)

print(response.text)
```

## Responses

### 200

Two-way sensitivity grids

#### 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"
  },
  "sensitivity": {
    "dcf_rent_vs_discount_rate": {
      "rows": "rent_change_pct",
      "columns": "discount_rate_pct",
      "row_values": [
        -10,
        -5,
        0,
        5,
        10
      ],
      "column_values": [
        1.5,
        1.8,
        2.1,
        2.4,
        2.7
      ],
      "cells": [
        [
          20559545,
          17211145,
          14818469,
          13023133,
          11626035
        ],
        [
          21701742,
          18167320,
          15641717,
          13746641,
          12271926
        ],
        [
          22843939,
          19123494,
          16464966,
          14470148,
          12917817
        ],
        [
          23986136,
          20079669,
          17288214,
          15193655,
          13563708
        ],
        [
          25128333,
          21035844,
          18111462,
          15917163,
          14209599
        ]
      ],
      "current": {
        "row": 2,
        "column": 2
      }
    },
    "dcf_rent_vs_exit_cap_rate": {
      "rows": "rent_change_pct",
      "columns": "exit_cap_rate_pct",
      "row_values": [
        -10,
        -5,
        0,
        5,
        10
      ],
      "column_values": [
        1.5,
        1.8,
        2.1,
        2.4,
        2.7
      ],
      "cells": [
        [
          19476597,
          16759356,
          14818469,
          13362804,
          12230620
        ],
        [
          20558630,
          17690431,
          15641717,
          14105182,
          12910099
        ],
        [
          21640663,
          18621506,
          16464966,
          14847560,
          13589578
        ],
        [
          22722696,
          19552582,
          17288214,
          15589938,
          14269057
        ],
        [
          23804730,
          20483657,
          18111462,
          16332316,
          14948536
        ]
      ],
      "current": {
        "row": 2,
        "column": 2
      }
    },
    "direct_cap_noi_factor_vs_cap_rate": {
      "rows": "noi_factor_pct",
      "columns": "cap_rate_pct",
      "row_values": [
        67.79,
        70.79,
        73.79,
        76.79,
        79.79
      ],
      "column_values": [
        2.35,
        2.65,
        2.95,
        3.25,
        3.55
      ],
      "cells": [
        [
          13343194,
          11832644,
          10629324,
          9648156,
          8832819
        ],
        [
          13933688,
          12356289,
          11099718,
          10075128,
          9223709
        ],
        [
          14524182,
          12879935,
          11570111,
          10502101,
          9614599
        ],
        [
          15114676,
          13403581,
          12040505,
          10929073,
          10005490
        ],
        [
          15705170,
          13927226,
          12510898,
          11356046,
          10396380
        ]
      ],
      "current": {
        "row": 2,
        "column": 2
      }
    },
    "land_value_yield_on_cost": {
      "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
      }
    },
    "land_value_dcf_rate_vs_construction_cost": {
      "rows": "target_rate_of_return_pct",
      "columns": "construction_cost_per_m2_nia",
      "row_values": [
        10,
        12.5,
        15,
        20,
        25
      ],
      "column_values": [
        3600,
        3800,
        4000,
        4200,
        4400
      ],
      "cells": [
        [
          7899331,
          7615404,
          7331478,
          7047551,
          6763624
        ],
        [
          7437124,
          7159285,
          6881447,
          6603609,
          6325771
        ],
        [
          7006325,
          6734271,
          6462216,
          6190162,
          5918108
        ],
        [
          6228393,
          5967080,
          5705767,
          5444454,
          5183142
        ],
        [
          5547050,
          5295500,
          5043949,
          4792399,
          4540849
        ]
      ],
      "current": {
        "row": 2,
        "column": 2
      }
    },
    "land_value_dcf_period_vs_gdv": {
      "rows": "development_period_months",
      "columns": "gross_development_value",
      "row_values": [
        12,
        18,
        24,
        30,
        36
      ],
      "column_values": [
        14818469,
        15641717,
        16464966,
        17288214,
        18111462
      ],
      "cells": [
        [
          6499222,
          7183661,
          7868101,
          8552541,
          9236980
        ],
        [
          5861834,
          6500077,
          7138321,
          7776564,
          8414807
        ],
        [
          5271887,
          5867052,
          6462216,
          7057381,
          7652546
        ],
        [
          4726029,
          5281023,
          5836017,
          6391012,
          6946006
        ],
        [
          4221144,
          4738678,
          5256213,
          5773748,
          6291283
        ]
      ],
      "current": {
        "row": 2,
        "column": 2
      }
    },
    "land_value_static": {
      "rows": "construction_cost_per_m2_nia",
      "columns": "gross_development_value",
      "row_values": [
        3600,
        3800,
        4000,
        4200,
        4400
      ],
      "column_values": [
        14818469,
        15641717,
        16464966,
        17288214,
        18111462
      ],
      "cells": [
        [
          6542124,
          7208340,
          7874557,
          8540773,
          9206989
        ],
        [
          6239359,
          6905576,
          7571792,
          8238008,
          8904224
        ],
        [
          5936594,
          6602811,
          7269027,
          7935243,
          8601459
        ],
        [
          5633830,
          6300046,
          6966262,
          7632478,
          8298694
        ],
        [
          5331065,
          5997281,
          6663497,
          7329713,
          7995930
        ]
      ],
      "current": {
        "row": 2,
        "column": 2
      }
    },
    "method": "Two-way sensitivity: each cell is the value with the two inputs moved and all others unchanged; `current` marks the base case. `rows` and `columns` name the two inputs; their values are in the unit the name ends in, rates in percent.",
    "sources": [
      {
        "source": "rics_dcf",
        "title": "RICS, Discounted cash flow valuations (practice information, 2023)",
        "paragraphs": "glossary \"Sensitivity analysis/testing\", Appendix B"
      }
    ]
  },
  "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` (`getRevenooSensitivity.response.200.api_version`; string, required)
- `valuation_date` (`getRevenooSensitivity.response.200.valuation_date`; string, required)
  - format `date`
- `parcel` (`getRevenooSensitivity.response.200.parcel`; object, required): The parcel: EGRID, address, municipality, BFS number, canton, zone, coordinates and areas.
- `data` (`getRevenooSensitivity.response.200.data`; object, required): Provenance: market data status and date, municipal and Zürich reference rents.
- `links` (`getRevenooSensitivity.response.200.links`; object, required): `app` opens this valuation in revenoo; `docs` is this document.
- `assumptions` (`getRevenooSensitivity.response.200.assumptions`; object, required): Assumptions you can change. Omitted keys keep the defaults the response reports.
  - `asking_land_price` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.response.200.assumptions.macro_premium_pct`; number, optional): Macro premium added to the macro rate, in percent.
    - min -10; max 10
  - `micro_rating` (`getRevenooSensitivity.response.200.assumptions.micro_rating`; string, optional): Micro location grade, which sets the micro premium.
    - one of `"good"`, `"average"`, `"weak"`
  - `micro_premium_bp` (`getRevenooSensitivity.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` (`getRevenooSensitivity.response.200.assumptions.usage_rating`; string, optional): Use of the property, which sets the usage premium.
    - one of `"residential"`, `"office"`, `"retail"`, `"commercial"`
  - `condition_rating` (`getRevenooSensitivity.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` (`getRevenooSensitivity.response.200.assumptions.special_premium_pct`; number, optional): Special premium for risks no other factor covers, in percent.
    - min -10; max 10
  - `inflation_pct` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.response.200.assumptions.lease_up_months`; integer, optional): Months until stabilized occupancy.
    - min 0; max 60
  - `cap_rate_pct` (`getRevenooSensitivity.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` (`getRevenooSensitivity.response.200.assumptions.noi_convention`; string, optional): Which NOI is capitalized.
    - one of `"after_capex"`, `"before_capex"`, `"custom_factor"`
  - `gdv_source` (`getRevenooSensitivity.response.200.assumptions.gdv_source`; string, optional): Where the gross development value (GDV) comes from.
    - one of `"dcf"`, `"direct_cap"`, `"manual"`
  - `gdv_manual` (`getRevenooSensitivity.response.200.assumptions.gdv_manual`; number, optional): GDV amount when gdv_source is manual.
    - min 0; max 100000000000
  - `construction_cost_per_m2_nia` (`getRevenooSensitivity.response.200.assumptions.construction_cost_per_m2_nia`; number, optional): Construction costs per m² NIA.
    - min 0; max 50000
  - `professional_fees_pct` (`getRevenooSensitivity.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` (`getRevenooSensitivity.response.200.assumptions.contingency_pct`; number, optional): Contingency, in percent of construction costs (RICS B1.2.5).
    - min 0; max 50
  - `sale_costs_pct` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.response.200.assumptions.development_period_months`; integer, optional): Development period from land purchase to completion, in months.
    - min 1; max 240
  - `target_irr_pct` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.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` (`getRevenooSensitivity.response.400.error`; string, required)
- `details` (`getRevenooSensitivity.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` (`getRevenooSensitivity.response.404.error`; string, required)
- `details` (`getRevenooSensitivity.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` (`getRevenooSensitivity.response.429.error`; string, required)
- `details` (`getRevenooSensitivity.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` (`getRevenooSensitivity.response.502.error`; string, required)
- `details` (`getRevenooSensitivity.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` (`getRevenooSensitivity.response.503.error`; string, required)
- `details` (`getRevenooSensitivity.response.503.details`; unknown, optional): For invalid assumptions: one { key, message } per problem.


Source: https://docs.aireon.ch/revenoo/get-revenoo-sensitivity/index.md
