Operations 8
DELETE
/places/{place_id}/estates/{estate_id}/rooms/{room_id}/equipment/{equipment_id}
Detach equipment from a room
#
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-rooms-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 Rooms 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: Rooms
description: Room management
paths:
/places/{place_id}/estates/{estate_id}/rooms:
get:
operationId: listRoomsEstate
summary: List rooms for estate
tags:
- Rooms
security:
- BearerAuth: []
parameters:
- name: place_id
in: path
required: true
schema:
type: string
format: uuid
- name: estate_id
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: OK
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Room'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
post:
operationId: createRoomEstate
summary: Create room for estate
tags:
- Rooms
security:
- BearerAuth: []
parameters:
- name: place_id
in: path
required: true
schema:
type: string
format: uuid
- name: estate_id
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateRoom'
responses:
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/Room'
'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'
/places/{place_id}/estates/{estate_id}/rooms/{room_id}:
get:
operationId: getRoomID
summary: Get room by ID
tags:
- Rooms
security:
- BearerAuth: []
parameters:
- name: place_id
in: path
required: true
schema:
type: string
format: uuid
- name: estate_id
in: path
required: true
schema:
type: string
format: uuid
- name: room_id
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/Room'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
put:
operationId: updateRoom
summary: Update room
tags:
- Rooms
security:
- BearerAuth: []
parameters:
- name: place_id
in: path
required: true
schema:
type: string
format: uuid
- name: estate_id
in: path
required: true
schema:
type: string
format: uuid
- name: room_id
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateRoom'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/Room'
'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'
delete:
operationId: deleteRoom
summary: Delete room
tags:
- Rooms
security:
- BearerAuth: []
parameters:
- name: place_id
in: path
required: true
schema:
type: string
format: uuid
- name: estate_id
in: path
required: true
schema:
type: string
format: uuid
- name: room_id
in: path
required: true
schema:
type: string
format: uuid
responses:
'204':
description: No Content
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
/places/{place_id}/estates/{estate_id}/rooms/{room_id}/equipment:
get:
operationId: listEquipmentRoomPlaces
summary: List equipment in a room
description: 'Lists the equipment attached to a room, reached through its parent
estate and place.
This is the hierarchical twin of
`GET /equipment/rooms/{room_id}/equipment`; both return the same
junctions. Prefer this one when you already hold the place and estate
identifiers and want the hierarchy enforced by the call itself.'
tags:
- Rooms
security:
- BearerAuth: []
parameters:
- name: place_id
in: path
required: true
schema:
type: string
format: uuid
- name: estate_id
in: path
required: true
schema:
type: string
format: uuid
- name: room_id
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: OK
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/EquipmentJunction'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
post:
operationId: attachEquipmentRoom
summary: Attach equipment to a room
description: 'Links an existing catalogue equipment to the room, with an optional
quantity, description and recorded condition.
Room-level equipment is what drives the per-room sections of an état des
lieux, so this is usually where the condition (`condition_status`) is
worth filling in.'
tags:
- Rooms
security:
- BearerAuth: []
parameters:
- name: place_id
in: path
required: true
schema:
type: string
format: uuid
- name: estate_id
in: path
required: true
schema:
type: string
format: uuid
- name: room_id
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/LinkEquipmentDto'
example:
equipment_id: 550e8400-e29b-41d4-a716-446655440000
quantity: 1
condition_status: GOOD
condition_notes: Fonctionne, télécommande fournie
responses:
'201':
description: Equipment attached to the room
content:
application/json:
schema:
$ref: '#/components/schemas/EquipmentJunction'
'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'
/places/{place_id}/estates/{estate_id}/rooms/{room_id}/equipment/{equipment_id}:
delete:
operationId: detachEquipmentRoom
summary: Detach equipment from a room
description: 'Removes the link between the equipment and the room. The catalogue entry
itself is untouched and stays available for other rooms.'
tags:
- Rooms
security:
- BearerAuth: []
parameters:
- name: place_id
in: path
required: true
schema:
type: string
format: uuid
- name: estate_id
in: path
required: true
schema:
type: string
format: uuid
- name: room_id
in: path
required: true
schema:
type: string
format: uuid
- name: equipment_id
in: path
required: true
schema:
type: string
format: uuid
responses:
'204':
description: No Content
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'500':
$ref: '#/components/responses/InternalServerError'
components:
schemas:
UpdateRoom:
type: object
properties:
carrez_surface:
type:
- number
- 'null'
habitable_surface:
type:
- number
- 'null'
designation:
type:
- string
- 'null'
type_room_id:
type:
- string
- 'null'
format: uuid
CreateRoom:
type: object
required:
- type_room_id
properties:
carrez_surface:
type:
- number
- 'null'
habitable_surface:
type:
- number
- 'null'
designation:
type:
- string
- 'null'
type_room_id:
type: string
format: uuid
EquipmentConditionStatus:
type: string
description: Condition status for equipment (used in État des Lieux)
enum:
- EXCELLENT
- GOOD
- FAIR
- POOR
- DAMAGED
- NEEDS_REPAIR
- BROKEN
- MISSING
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
LinkEquipmentDto:
type: object
required:
- equipment_id
properties:
equipment_id:
type: string
format: uuid
description:
type:
- string
- 'null'
quantity:
type:
- integer
- 'null'
condition_status:
type:
- string
- 'null'
allOf:
- $ref: '#/components/schemas/EquipmentConditionStatus'
condition_notes:
type:
- string
- 'null'
Room:
type: object
properties:
id:
type:
- string
- 'null'
format: uuid
estate_id:
type:
- string
- 'null'
format: uuid
carrez_surface:
type:
- number
- 'null'
habitable_surface:
type:
- number
- 'null'
designation:
type:
- string
- 'null'
type_room_id:
type:
- string
- 'null'
format: uuid
created_at:
type:
- string
- 'null'
format: date-time
updated_at:
type:
- string
- 'null'
format: date-time
EquipmentJunction:
type: object
properties:
equipment_id:
type:
- string
- 'null'
format: uuid
entity_id:
type:
- string
- 'null'
format: uuid
entity_type:
type:
- string
- 'null'
enum:
- place
- estate
- room
- null
created_at:
type:
- string
- 'null'
format: date-time
updated_at:
type:
- string
- 'null'
format: date-time
description:
type:
- string
- 'null'
quantity:
type:
- integer
- 'null'
condition_status:
type:
- string
- 'null'
allOf:
- $ref: '#/components/schemas/EquipmentConditionStatus'
description: Condition of the equipment at time of inspection
condition_notes:
type:
- string
- 'null'
description: Free-text notes about the equipment condition
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'
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