# Tenancies

5 tools. Generated from the MCP server: names, inputs and prices match the code.

Source: https://leverage.immo/docs/tools/tenancies/

## tenancies_create

**Create Tenancy** · Write · Free

Create one tenancy on a property, for a unit (unit_id from properties_units_list) and tenants who are already contacts (contact_ids from contacts_list or contacts_create, in lease order). A couple or a WG on one lease is one tenancy with every tenant in contact_ids, not one tenancy each. rent_net is the rent at the lease start; record later rent changes with tenancies_events_create. For many tenants from a rent roll use properties_rent_roll_apply. A retry with the same tenants, unit and start_date returns the existing tenancy (reused: true) unchanged; change it with tenancies_patch. Another tenancy on the same unit at the same time is not refused (a shared flat can hold two leases) but comes back in warnings as tenancy_overlaps: ask the user before you keep both, since both rents count.

REST: `POST /api/v1/properties/{id}/tenancies`

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `unit_id` | `string \| null` | no | A unit of this property (properties_units_list); null or left out: the whole property. |
| `contact_ids` | `array<string>` | no | The tenants, your contacts (contacts_list, contacts_create), in the order the lease names them; at most 20. A couple or a WG on one lease gets every tenant. Left out or []: no tenant yet. |
| `start_date` | `string` | yes | Lease start, YYYY-MM-DD. rent_net is the rent from this date on. |
| `end_date` | `string \| null` | no | Lease end, YYYY-MM-DD; left out: open-ended. |
| `rent_net` | `number` | yes | Nettokaltmiete per month at the lease start, EUR. Required: a tenancy without a known rent is a vacancy, which this call does not create. |
| `rent_net_target` | `number \| null` | no | Market or target rent per month (Miete Soll), EUR; feeds the rent potential only, never the cashflow. |
| `operating_costs` | `number` | no | Hausgeld share per month, EUR. |
| `operating_costs_transferable` | `number` | no | Tenant prepayment per month (Nebenkostenvorauszahlung), EUR. |
| `parking_space_rent` | `number` | no | Rent per parking space per month, EUR. |
| `parking_spaces` | `integer` | no |  |
| `property_id` | `string` | yes | The property (properties_list). |

## tenancies_delete

**Delete Tenancy** · Write · Destructive · Free

Delete a tenancy by id, for good, with its tenancy events. Use it for a tenancy that should never have existed (a duplicate, a wrong import). A lease that really ended is not deleted: set its end_date with tenancies_patch. The tenant contacts stay; a tenant link goes when no other tenancy backs it.

REST: `DELETE /api/v1/tenancies/{id}`

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | `integer` | yes |  |

## tenancies_events_create

**Record Tenancy Event** · Write · Free

Record a dated change on a tenancy: a rent increase (Mieterhöhung, Staffel- or Indexstufe), a month without rent (Mietausfall), new operating costs, a new tenant prepayment, new separate management costs or new parking. From the month of date on, the cashflow and the key figures use value instead of the tenancy field; earlier months keep the old one. value is the new monthly amount, never the difference. Record the rent history as one event per change, oldest first is fine; an announced future increase is an event with its future date, never rent_net_target. date must lie within the lease. Repeating the same change returns the stored event; a different value for the same type and date is refused (event_exists): to correct one, tenancies_events_delete it first.

REST: `POST /api/v1/tenancies/{id}/events`

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `type` | `string` | yes | What changes; it decides what value means. rent_adjustment: a rent increase or decrease (Mieterhöhung, Staffel- or Indexstufe). rent_loss: no rent in that one month (Mietausfall). The others change operating costs, the tenant prepayment, separate management costs, parking rent per space or the number of parking spaces. Values: `rent_adjustment`, `rent_loss`, `operating_cost_adjustment`, `operating_cost_transferable_adjustment`, `separate_property_management_adjustment`, `parking_space_rent_adjustment`, `parking_spaces_adjustment` |
| `value` | `number` | no | The NEW monthly amount from that month on, never the difference. rent_adjustment: the new Nettokaltmiete, EUR 0 to 10000. operating_cost_adjustment: the new Hausgeld share, EUR 0 to 5000. operating_cost_transferable_adjustment: the new tenant prepayment (Nebenkosten), EUR 0 to 5000. separate_property_management_adjustment: EUR 0 to 650. parking_space_rent_adjustment: the new rent per space, EUR 0 to 1000. parking_spaces_adjustment: the new number of spaces, a whole number 0 to 60. rent_loss: leave it out. |
| `date` | `string` | yes | YYYY-MM-DD; the change applies from this month on. Within the lease: not before the month it starts, not after it ends. |
| `tenancy_id` | `integer` | yes | The tenancy: properties_units_list, or properties_get for a tenancy without a unit. |

## tenancies_events_delete

**Delete Tenancy Event** · Write · Destructive · Free

Delete one dated change of a tenancy (event_id from properties_units_list or properties_get). The cashflow is computed as if it never happened.

REST: `DELETE /api/v1/tenancies/{id}/events/{eventId}`

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `tenancy_id` | `integer` | yes |  |
| `event_id` | `integer` | yes | From the tenancy events of properties_units_list or properties_get. |

## tenancies_patch

**Update Tenancy** · Write · Destructive · Free

Update a tenancy by id (from properties_units_list or properties_tenancies_import); partial body. Correct start_date/end_date, rent_net, operating_costs (total, Hausgeld share) or operating_costs_transferable (tenant prepayment, Nebenkosten), set operating_costs_non_transferable (the share the owner carries per Wirtschaftsplan; null derives it as Hausgeld minus prepayment) and operating_costs_reserve (the WEG reserve inside that share, not tax-deductible yet), move it with unit_id, or replace the tenants with contact_ids (the whole list, in lease order; [] removes every tenant). Set end_date to record a lease that ended (Auszug, Räumung); end_date null reopens it. Dates are YYYY-MM-DD. rent_net is the rent from start_date on, for every month of the lease: a rent that changed later (Mieterhöhung, Staffel, Index) is never patched here, it is a dated change with tenancies_events_create.

REST: `PATCH /api/v1/tenancies/{id}`

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `start_date` | `string` | no |  |
| `end_date` | `string \| null` | no |  |
| `rent_net` | `number` | no |  |
| `rent_net_target` | `number \| null` | no |  |
| `operating_costs` | `number` | no |  |
| `operating_costs_transferable` | `number` | no |  |
| `operating_costs_non_transferable` | `number \| null` | no | Monthly share of the Hausgeld the owner carries (nicht umlagefähig, per Wirtschaftsplan), at most operating_costs. null: Hausgeld minus prepayment. |
| `operating_costs_reserve` | `number \| null` | no | Monthly WEG reserve (Erhaltungsrücklage) inside that owner share, per Wirtschaftsplan: a cost, but not tax-deductible until the WEG spends it. At most the owner share. null: none stated. |
| `other_monthly_costs` | `number` | no |  |
| `parking_space_rent` | `number` | no |  |
| `parking_spaces` | `integer` | no |  |
| `separate_property_management_costs` | `number` | no |  |
| `rent_due_on_the_day` | `integer \| null` | no |  |
| `has_vacancy` | `boolean` | no |  |
| `unit_id` | `string \| null` | no |  |
| `contact_ids` | `array<string>` | no | The tenants, your contacts (contacts_list, contacts_create), in the order the lease names them; at most 20. Replaces every tenant of the tenancy: send the whole list, also the ones that stay. A couple or a WG on one lease gets every tenant. []: no tenant. Left out: the tenants stay. |
| `id` | `integer` | yes |  |
