---
title: "Check rent control compliance"
method: POST
path: "/legislative-zones/rent-control/check"
tags: ["Rent Regulation & Rent Control"]
---

# Check rent control compliance

`POST /legislative-zones/rent-control/check`

## Request

- Base URL: `https://api.faireplace.com/api`
- URL: `https://api.faireplace.com/api/legislative-zones/rent-control/check`
- Auth: HTTP bearer

Verify whether a proposed rent complies with local rent control rules
(encadrement des loyers). Compares the proposed rent against reference
rents for the address, room count, construction period, and furnishing
status.

Returns one of two shapes, both with HTTP 200, discriminated by
`regulated`:
- `regulated: true` → full verdict (`RentControlResponse`)
- `regulated: false` → the commune is outside every rent-control zone,
  the rent is freely set (`RentControlNotRegulatedResponse`)

A commune that *is* regulated but whose reference grid we lack is a
different case: it answers 503 `REFERENCE_DATA_UNAVAILABLE`, never the
"not regulated" shape.

## Request body

- RentControlRequest
  - `address` string, required
  - `postal_code` string, required
  - `room_count` integer, required
  - `surface_area` number, float, required
  - `construction_period` 'avant 1946' | '1946-1970' | '1971-1990' | '1991-2005' | 'après 2005', required: Construction period of the dwelling, as used by the French rent-control reference data. The values carry **accents and spaces** and are sent verbatim: they are the labels of the official reference tables, not identifiers. Percent-encode them when they travel in a query string.
  - `is_furnished` boolean, required
  - `proposed_rent` number, float, required

## Response `200`

OK: regulated verdict or "not regulated" business answer.

- union: Either shape returned by the rent-control check, discriminated by the `regulated` boolean.
  - RentControlResponse: Verdict when the commune is in a rent-control zone. The `regulated: true` discriminator distinguishes it from `RentControlNotRegulatedResponse`, which is served on the same HTTP 200.
    - `regulated` true, required: Always `true` on this shape.
    - `territory` string
    - `address` string
    - `administrative_quarter` string
    - `quarter_id` integer, nullable
    - `coordinates` Coordinates
      - `longitude` number, float
      - `latitude` number, float
    - `reference_rent_data` ReferenceRentData
      - `reference_rent` number, float
      - `reference_rent_increased` number, float
      - `reference_rent_decreased` number, float
      - `year` string
    - `proposed_rent_per_sqm` number, float
    - `is_compliant` boolean
    - `compliance_status` string
    - `applicable_regulations` RegulationRule[]
      - `name` string
      - `description` string
      - `reference_url` string, nullable
    - `data_source` string
    - `last_update` string
  - RentControlNotRegulatedResponse: The commune is outside every rent-control zone, so the rent is freely set. This is a business answer, not a request error: it is served with HTTP 200. The `regulated: false` discriminator distinguishes it from `RentControlResponse`. Do not confuse it with the case where the commune *is* regulated and only the reference grid is missing. The two endpoints answer that case differently, and the difference is deliberate: - `POST /legislative-zones/rent-control/check` → **503** `REFERENCE_DATA_UNAVAILABLE` - `POST /public/tools/rent-control/check` → **200** with `bareme_available: false` Either way, never treat it as "rent is free": there is a legal ceiling, we simply cannot compute it.
    - `regulated` false, required: Always `false` on this shape.
    - `postal_code` string, required
    - `message` string, required

## Other responses

- `400`: Payload invalide (`VALIDATION_FAILED`) ou code postal mal formé (`INVALID_POSTAL_CODE`).
- `404`: Adresse, quartier ou données de loyer introuvables (`ADDRESS_NOT_FOUND`, `QUARTER_NOT_FOUND`, `RENT_DATA_NOT_FOUND`).
- `429`: Rate limit exceeded. Every endpoint sits behind a plan-aware limiter, and the public tools carry an additional per-endpoint one. `error.details.retry_after_seconds` says how long to wait; the `Retry-After`, `X-RateLimit-Limit` and `X-RateLimit-Remaining` headers carry the same information.
- `500`: `DATABASE_ERROR`.
- `502`: Le fournisseur d'adresses est injoignable (`EXTERNAL_API_ERROR`).
- `503`: `REFERENCE_DATA_UNAVAILABLE`: la commune EST encadrée, seul son barème nous manque. Surtout pas à traduire en « loyer libre » : le plafond légal existe. L'équivalent public répond 200 avec `bareme_available: false`.

---

[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)
