FairePlace Rent Revisions API
Lease rent revision (IRL indexation): simulate, record, list, and apply annual rent revisions on a lease.
Lease rent revision (IRL indexation): simulate, record, list, and apply annual rent revisions on a lease.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/faireplace-com:faireplace-com-rent-revisions-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: FairePlace Property Management Rent Revisions API
description: 'Comprehensive API for managing properties, leases, tenants, and all aspects of real estate management.
Built with Rust and Actix-web following hexagonal architecture principles.
## Authentication
This API uses API keys for authentication with tenant-based isolation.
## Base URL
- Production: `https://api.faireplace.com/api`'
version: 1.0.0
contact:
name: FairePlace API Support
email: api-support@faireplace.com
license:
name: MIT
url: https://opensource.org/licenses/MIT
servers:
- url: https://api.faireplace.com/api
description: Production server
security:
- BearerAuth: []
tags:
- name: Rent Revisions
description: 'Lease rent revision (IRL indexation): simulate, record, list, and apply
annual rent revisions on a lease.'
paths:
/leases/{lease_id}/rent-revisions/simulate:
post:
operationId: simulateRentRevisionLeases
summary: Simulate a rent revision
description: 'Simulates an IRL-based rent revision for a lease **without persisting anything**.
Given a target IRL reference quarter and an effective date, the API computes the new
rent that would result from indexation, based on the lease''s current rent and its
baseline IRL value. Use this to preview a revision before recording it.
## Usage Example
```bash
curl -X POST https://api.faireplace.com/api/leases/660e8400-e29b-41d4-a716-446655440001/rent-revisions/simulate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d ''{
"new_irl_quarter": "T3-2024",
"effective_date": "2025-07-01"
}''
```
**Response**:
```json
{
"previous_rent": 1200.00,
"new_rent": 1236.00,
"old_irl_quarter": "T3-2023",
"old_irl_value": 140.59,
"new_irl_quarter": "T3-2024",
"new_irl_value": 144.81,
"variation_percentage": 3.00,
"effective_date": "2025-07-01",
"monthly_increase": 36.00
}
```'
tags:
- Rent Revisions
security:
- BearerAuth: []
parameters:
- name: lease_id
in: path
required: true
description: Lease ID
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SimulateRevisionRequest'
examples:
simulate:
summary: Simulate revision with T3-2024 IRL
value:
new_irl_quarter: T3-2024
effective_date: '2025-07-01'
responses:
'200':
description: Revision simulated successfully
content:
application/json:
schema:
$ref: '#/components/schemas/RevisionSimulationResponse'
examples:
result:
summary: Simulation result
value:
previous_rent: 1200
new_rent: 1236
old_irl_quarter: T3-2023
old_irl_value: 140.59
new_irl_quarter: T3-2024
new_irl_value: 144.81
variation_percentage: 3
effective_date: '2025-07-01'
monthly_increase: 36
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/UnprocessableEntity'
'500':
$ref: '#/components/responses/InternalServerError'
/leases/{lease_id}/rent-revisions:
get:
operationId: listRentRevisions
summary: List rent revisions
description: 'Retrieves the full history of recorded rent revisions for a lease, ordered chronologically.
## Usage Example
```bash
curl -X GET https://api.faireplace.com/api/leases/660e8400-e29b-41d4-a716-446655440001/rent-revisions \
-H "Authorization: Bearer YOUR_API_KEY"
```'
tags:
- Rent Revisions
security:
- BearerAuth: []
parameters:
- name: lease_id
in: path
required: true
description: Lease ID
schema:
type: string
format: uuid
responses:
'200':
description: Revision history retrieved successfully
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/RentRevisionRecord'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
post:
operationId: recordRentRevision
summary: Record a rent revision
description: 'Records (persists) an IRL-based rent revision for a lease.
The revision is computed from the provided IRL reference quarter and stored as a
historical record. Recording does **not** change the active rent: call
`PUT /leases/{lease_id}/rent-revisions/{revision_id}/apply` to apply it.
## Usage Example
```bash
curl -X POST https://api.faireplace.com/api/leases/660e8400-e29b-41d4-a716-446655440001/rent-revisions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d ''{
"new_irl_quarter": "T3-2024",
"effective_date": "2025-07-01"
}''
```'
tags:
- Rent Revisions
security:
- BearerAuth: []
parameters:
- name: lease_id
in: path
required: true
description: Lease ID
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/RecordRevisionRequest'
examples:
record:
summary: Record revision with T3-2024 IRL
value:
new_irl_quarter: T3-2024
effective_date: '2025-07-01'
responses:
'201':
description: Revision recorded successfully
content:
application/json:
schema:
$ref: '#/components/schemas/RentRevisionRecord'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/UnprocessableEntity'
'500':
$ref: '#/components/responses/InternalServerError'
/leases/{lease_id}/rent-revisions/{revision_id}:
get:
operationId: getRentRevision
summary: Get a rent revision
description: 'Retrieves a single recorded rent revision by its identifier.
## Usage Example
```bash
curl -X GET https://api.faireplace.com/api/leases/660e8400-e29b-41d4-a716-446655440001/rent-revisions/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer YOUR_API_KEY"
```'
tags:
- Rent Revisions
security:
- BearerAuth: []
parameters:
- name: lease_id
in: path
required: true
description: Lease ID
schema:
type: string
format: uuid
- name: revision_id
in: path
required: true
description: Rent revision ID
schema:
type: string
format: uuid
responses:
'200':
description: Revision retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/RentRevisionRecord'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
/leases/{lease_id}/rent-revisions/{revision_id}/apply:
put:
operationId: applyRentRevision
summary: Apply a rent revision
description: 'Applies a previously recorded rent revision to the lease, updating its active rent
to the revision''s `new_amount`.
## Usage Example
```bash
curl -X PUT https://api.faireplace.com/api/leases/660e8400-e29b-41d4-a716-446655440001/rent-revisions/550e8400-e29b-41d4-a716-446655440000/apply \
-H "Authorization: Bearer YOUR_API_KEY"
```
**Response**:
```json
{
"message": "Révision appliquée avec succès",
"revision_id": "550e8400-e29b-41d4-a716-446655440000",
"lease_id": "660e8400-e29b-41d4-a716-446655440001"
}
```'
tags:
- Rent Revisions
security:
- BearerAuth: []
parameters:
- name: lease_id
in: path
required: true
description: Lease ID
schema:
type: string
format: uuid
- name: revision_id
in: path
required: true
description: Rent revision ID to apply
schema:
type: string
format: uuid
responses:
'200':
description: Revision applied successfully
content:
application/json:
schema:
$ref: '#/components/schemas/ApplyRevisionResponse'
examples:
applied:
summary: Revision applied
value:
message: Révision appliquée avec succès
revision_id: 550e8400-e29b-41d4-a716-446655440000
lease_id: 660e8400-e29b-41d4-a716-446655440001
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
components:
responses:
Forbidden:
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
UnprocessableEntity:
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
InternalServerError:
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: Not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: Bad request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
RevisionSimulationResponse:
type: object
description: 'Result of a rent revision simulation.
Amounts are expressed in euros (decimal). The simulation does not modify the lease.
'
required:
- previous_rent
- new_rent
- old_irl_quarter
- old_irl_value
- new_irl_quarter
- new_irl_value
- variation_percentage
- effective_date
- monthly_increase
properties:
previous_rent:
type: number
format: double
description: Current rent before revision (in euros).
example: 1200
new_rent:
type: number
format: double
description: Computed rent after revision (in euros).
example: 1236
old_irl_quarter:
type: string
description: Baseline IRL reference quarter currently applied to the lease.
example: T3-2023
old_irl_value:
type: number
format: double
description: Official IRL value for the baseline quarter.
example: 140.59
new_irl_quarter:
type: string
description: IRL reference quarter applied in the simulation.
example: T3-2024
new_irl_value:
type: number
format: double
description: Official IRL value for the new quarter.
example: 144.81
variation_percentage:
type: number
format: double
description: Percentage variation between the old and new rent.
example: 3
effective_date:
type: string
format: date
description: Effective date of the simulated revision (ISO 8601).
example: '2025-07-01'
monthly_increase:
type: number
format: double
description: Monthly rent increase resulting from the revision (in euros).
example: 36
RentRevisionRecord:
type: object
description: 'A persisted rent revision record.
Captures the indexation applied to a lease, including the previous and new rent,
the IRL index value used, and any applicable increase cap or special period.
'
required:
- id
- tenant_id
- lease_id
- index_value_id
- revision_date
- previous_amount
- new_amount
- percentage_change
- capped_increase
- created_at
- updated_at
properties:
id:
type: string
format: uuid
description: Unique identifier of the revision record.
example: 550e8400-e29b-41d4-a716-446655440000
tenant_id:
type: string
description: Tenant (organization) identifier owning this revision.
example: tenant_123
lease_id:
type: string
format: uuid
description: Lease to which the revision applies.
example: 660e8400-e29b-41d4-a716-446655440001
index_value_id:
type: string
format: uuid
description: Identifier of the IRL index value used for the revision.
example: 770e8400-e29b-41d4-a716-446655440002
increase_cap_id:
type:
- string
- 'null'
format: uuid
description: Identifier of the increase cap applied, if any.
example: 880e8400-e29b-41d4-a716-446655440003
special_period_id:
type:
- string
- 'null'
format: uuid
description: Identifier of the special (legislative) period applied, if any.
example: 990e8400-e29b-41d4-a716-446655440004
revision_date:
type: string
format: date
description: Effective date of the revision (ISO 8601).
example: '2025-07-01'
previous_amount:
type: number
format: double
description: Rent amount before the revision (in euros).
example: 1200
new_amount:
type: number
format: double
description: Rent amount after the revision (in euros).
example: 1236
percentage_change:
type: number
format: double
description: Percentage change between previous and new rent.
example: 3
capped_increase:
type: boolean
description: Whether the increase was capped by a legislative increase cap.
example: false
revision_details:
type:
- object
- 'null'
additionalProperties: true
description: Free-form JSON details about the revision computation.
created_at:
type: string
format: date-time
description: Creation timestamp (ISO 8601).
example: '2025-06-15T10:30:00Z'
updated_at:
type: string
format: date-time
description: Last update timestamp (ISO 8601).
example: '2025-06-15T10:30:00Z'
Error:
type: object
description: "The error envelope returned by every authenticated endpoint.\n\nTwo things are worth knowing before you write your error handling:\n\n- **`code` is a symbolic string, not a number.** The numeric HTTP status is\n in `status`. Branch on `code`: it is stable, and show `message`, which\n is written for humans and may be reworded without notice.\n- The public guest-signature endpoints use a **different, flatter shape**\n (`{ \"error_code\": …, \"message\": … }`, no `error` wrapper), because they\n are consumed by a page that has no session. Their responses document it\n inline.\n\nThe `X-Request-Id` response header carries the request identifier: quote it\nwhen reporting a problem. It is a header, not a body field.\n"
required:
- error
properties:
error:
type: object
required:
- code
- message
- status
properties:
code:
type: string
description: Stable symbolic code. Branch on this.
enum:
- NOT_FOUND
- UNAUTHORIZED
- VALIDATION_ERROR
- DATABASE_ERROR
- BUSINESS_ERROR
- STORAGE_ERROR
- CONFIG_ERROR
- FORBIDDEN
- CONFLICT
- PARSE_ERROR
- SERIALIZATION_ERROR
- AUTHENTICATION_ERROR
- AUTHORIZATION_ERROR
- EXTERNAL_SERVICE_ERROR
- RATE_LIMIT_EXCEEDED
- PAYMENT_REQUIRED
- PLAN_LIMIT_REACHED
- GONE
- BAD_REQUEST
- INTERNAL_ERROR
- INTERNAL_SERVER_ERROR
example: NOT_FOUND
message:
type: string
description: 'Human-readable explanation, most often in French. Safe to display,
not safe to parse.
'
example: Lease not found
status:
type: integer
description: The HTTP status code, repeated in the body.
example: 404
details:
type: object
additionalProperties: true
description: 'Extra machine-readable context. Only present on some errors: on
`RATE_LIMIT_EXCEEDED` it carries `retry_after_seconds`.
'
example:
retry_after_seconds: 12
ApplyRevisionResponse:
type: object
description: 'Confirmation returned after applying a recorded rent revision to the lease.
'
required:
- message
- revision_id
- lease_id
properties:
message:
type: string
description: Human-readable confirmation message.
example: Révision appliquée avec succès
revision_id:
type: string
format: uuid
description: Identifier of the revision that was applied.
example: 550e8400-e29b-41d4-a716-446655440000
lease_id:
type: string
format: uuid
description: Identifier of the lease whose rent was updated.
example: 660e8400-e29b-41d4-a716-446655440001
SimulateRevisionRequest:
type: object
description: 'Request to simulate a rent revision (IRL indexation) without persisting anything.
The simulation computes the new rent that would result from applying the provided
IRL reference quarter, based on the lease''s current rent and its baseline IRL value.
'
required:
- new_irl_quarter
- effective_date
properties:
new_irl_quarter:
type: string
description: 'Target IRL reference quarter to apply, in the format `T{quarter}-{year}`.
Must not be empty. The matching IRL index value must exist in the rent-indices catalog.
'
example: T3-2024
effective_date:
type: string
format: date
description: 'Effective date of the simulated revision (ISO 8601 `YYYY-MM-DD`).
'
example: '2025-07-01'
RecordRevisionRequest:
type: object
description: 'Request to record (persist) a rent revision for a lease.
The revision is computed from the provided IRL reference quarter and stored as a
historical record. Use `PUT .../apply` afterwards to apply it to the active rent.
'
required:
- new_irl_quarter
- effective_date
properties:
new_irl_quarter:
type: string
description: 'IRL reference quarter to apply, in the format `T{quarter}-{year}`. Must not be empty.
'
example: T3-2024
effective_date:
type: string
format: date
description: Effective date of the revision (ISO 8601 `YYYY-MM-DD`).
example: '2025-07-01'
securitySchemes:
BearerAuth:
type: http
scheme: bearer
description: API key with fp_* prefix, passed as Bearer token
WorkerApiKey:
type: apiKey
in: header
name: X-API-Key
WorkerBearer:
type: http
scheme: bearer
bearerFormat: Worker