---
title: "Check a proposed rent against rent control"
method: POST
path: "/public/tools/rent-control/check"
tags: ["Public Tools"]
---

# Check a proposed rent against rent control

`POST /public/tools/rent-control/check`

## Request

- Base URL: `https://api.faireplace.com/api`
- URL: `https://api.faireplace.com/api/public/tools/rent-control/check`
- Auth: none required

Checks a proposed rent against the rent-control ceiling for the address.
Returns one of two shapes, discriminated by `regulated`:
- `regulated: true` → full verdict (`RentControlCheckResponse`)
- `regulated: false` → the commune is not regulated, rent is free
  (`RentControlNotRegulatedResponse`)

Both are returned with HTTP 200. Public, unauthenticated tool.

## Example

```bash
curl -X POST https://api.faireplace.com/api/public/tools/rent-control/check \
  -H "Content-Type: application/json" \
  -d '{
    "address": "1 rue de Rivoli",
    "postal_code": "75001",
    "room_count": 2,
    "surface_area": 45.0,
    "construction_period": "1971-1990",
    "is_furnished": false,
    "proposed_rent": 1500.0
  }'
```

## Request body

- RentControlCheckRequest
  - `address` string, required
  - `postal_code` string, required
  - `room_count` integer, required
  - `surface_area` number, double, required: Surface area in m².
  - `construction_period` 'avant 1946' | '1946-1970' | '1971-1990' | '1991-2005' | 'après 2005', required: Construction period bracket of the dwelling.
  - `is_furnished` boolean, required
  - `proposed_rent` number, double, required: Proposed monthly rent (EUR).

## Response `200`

Rent-control verdict (regulated) or "rent is free" information
(not regulated). Discriminated by the `regulated` boolean.

- union: L'endpoint `/public/tools/rent-control/check` renvoie l'une de **trois** formes, toutes en HTTP 200. `regulated` ne suffit pas à les distinguer : il vaut `true` pour deux d'entre elles. Le discriminant complet est le couple (`regulated`, `bareme_available`) : | `regulated` | `bareme_available` | forme | |---|---|---| | `true` | absent | verdict complet (`RentControlCheckResponse`) | | `true` | `false` | commune encadrée, barème manquant (`RentControlBaremeUnavailableResponse`) | | `false` | absent | loyer libre (`RentControlNotRegulatedResponse`) |
  - RentControlCheckResponse: Verdict when the dwelling is in a regulated zone. The `regulated: true` discriminator distinguishes it from `RentControlNotRegulatedResponse`.
    - `regulated` boolean, required: Always `true` for this shape.
    - `territory` string, required
    - `territory_label` string, required
    - `address` string, required
    - `administrative_quarter` string, required
    - `quarter_id` integer, nullable
    - `reference_rent` ReferenceRentResponse, required
      - `reference_rent` number, required: Reference rent per m² (€/m²).
      - `reference_rent_increased` number, required: Increased reference rent per m² (legal ceiling, €/m²).
      - `reference_rent_decreased` number, required
      - `year` string, required
      - `data_freshness` DataFreshness, required
        - `data_year` string, required
        - `is_stale` boolean, required: True when the underlying grids are more than one year old.
        - `warning` string: Present only when `is_stale` is true.
    - `proposed_rent_per_sqm` number, double, required
    - `is_compliant` boolean, required
    - `compliance_status` 'compliant' | 'exceeds_reference' | 'exceeds_increased_reference' | 'below_decreased_reference', required
    - `overage_amount` number, double, required: Amount the proposed rent exceeds the legal ceiling (EUR; negative if compliant).
    - `overage_percentage` number, double, required
    - `max_legal_rent` number, double, required: Maximum legal rent = increased reference rent × surface.
    - `applicable_regulations` PublicToolsRegulationRule[], required
      - `name` string, required
      - `description` string, required
      - `reference_url` string, nullable
    - `data_source` string, required
    - `last_update` string, required
    - `data_freshness` DataFreshness, required
      - `data_year` string, required
      - `is_stale` boolean, required: True when the underlying grids are more than one year old.
      - `warning` string: Present only when `is_stale` is true.
  - RentControlBaremeUnavailableResponse: La commune EST encadrée, mais nous n'avons pas son barème. Cas distinct du « loyer libre », et la confusion coûte cher : il y a bien un plafond légal, c'est nous qui ne savons pas le calculer. Répondre « fixez librement votre loyer » à un bailleur soumis à un plafond est une erreur plus grave que de ne pas répondre: d'où cette troisième forme plutôt qu'un repli sur `regulated: false`. Servie en **HTTP 200** : ce n'est pas une erreur de la requête. L'endpoint authentifié `/legislative-zones/rent-control/check`, lui, répond **503 `REFERENCE_DATA_UNAVAILABLE`** pour ce même cas.
    - `regulated` boolean, required: Toujours `true`: la commune est soumise à un plafond.
    - `bareme_available` boolean, required: Toujours `false`: c'est ce qui distingue cette forme du verdict complet.
    - `postal_code` string, required
    - `message` string, required
    - `official_simulator_url` string, nullable: Simulateur officiel où vérifier le plafond, quand il en existe un.
  - PublicToolsRentControlNotRegulatedResponse: Returned with HTTP 200 when the commune is not in any rent-control zone (rent is freely set). The `regulated: false` discriminator distinguishes it from `RentControlCheckResponse`.
    - `regulated` boolean, required: Always `false` for this shape.
    - `postal_code` string, required
    - `message` string, required

## Other responses

- `400`: Bad request
- `422`: Unprocessable Entity
- `500`: Internal Server Error

---

[API](https://skmtc.dev/faireplace/apis/faireplace-property-management-api.md) · [All operations](https://skmtc.dev/faireplace/apis/faireplace-property-management-api/llms.txt) · [OpenAPI document](https://skmtc.dev/faireplace/apis/faireplace-property-management-api/revisions/69de39762919?raw)
