Modèle de données
Référence complète du schéma de données TS-Immo — toutes les entités, types et énumérations.
Le modèle de données TS-Immo est conçu pour couvrir les besoins des marchés immobiliers francophones, anglophones et européens. Toutes les entités sont identifiées par des UUID v4 et les dates sont au format ISO 8601.
Property
L'entité centrale de la plateforme. Représente un bien immobilier avec toutes ses caractéristiques.
| Champ | Type | Requis | Description |
|---|---|---|---|
id | string (UUID) | ✓ | Identifiant unique UUID v4 |
title | string | ✓ | Titre de l'annonce |
description | string | — | Description longue du bien |
type | PropertyType | ✓ | Type de transaction (sale, rent…) |
status | PropertyStatus | ✓ | Statut de publication |
price | number | ✓ | Prix en unités de la devise |
currency | string (ISO 4217) | ✓ | Code devise ISO 4217 (EUR, CAD, CHF…) |
surface | number (m²) | — | Surface habitable en m² |
bedrooms | number | — | Nombre de chambres |
bathrooms | number | — | Nombre de salles de bain |
address | Address | ✓ | Adresse structurée |
media | MediaItem[] | — | Photos, vidéos et documents |
features | string[] | — | Équipements et caractéristiques (balcon, parking…) |
agent | Agent | — | Agent immobilier responsable |
createdAt | ISO 8601 date | ✓ | Date de création |
updatedAt | ISO 8601 date | ✓ | Date de dernière modification |
// Exemple Property complet
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Appartement lumineux 3 pièces - Paris 11e",
"description": "Bel appartement rénové avec vue sur cour calme...",
"type": "sale",
"status": "active",
"price": 385000,
"currency": "EUR",
"surface": 72.5,
"bedrooms": 2,
"bathrooms": 1,
"address": {
"street": "12 rue de la Roquette",
"city": "Paris",
"postalCode": "75011",
"country": "FR",
"lat": 48.8566,
"lng": 2.3790
},
"media": [
{
"id": "media-001",
"url": "https://cdn.ts-immo.org/props/photo1.jpg",
"type": "image",
"isPrimary": true,
"order": 1
}
],
"features": ["balcony", "parking", "elevator", "cellar"],
"agent": {
"id": "agent-42",
"name": "Marie Dupont",
"email": "m.dupont@agence.fr",
"phone": "+33 6 12 34 56 78"
},
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-03-07T14:00:00Z"
}PropertyType
Énumération des types de transaction / catégorie de bien :
type PropertyType =
| 'sale' // Vente
| 'rent' // Location
| 'seasonal' // Location saisonnière
| 'commercial' // Commercial
| 'land' // Terrain
| 'parking'; // Parking / GaragePropertyStatus
type PropertyStatus =
| 'active' // En ligne, disponible
| 'pending' // En attente de validation
| 'sold' // Vendu
| 'rented' // Loué
| 'withdrawn' // Retiré du marché
| 'draft'; // BrouillonAddress
| Champ | Type | Requis | Description |
|---|---|---|---|
street | string | ✓ | Numéro et nom de rue |
city | string | ✓ | Ville |
postalCode | string | ✓ | Code postal |
state | string | — | Région / département |
country | string (ISO 3166) | ✓ | Code pays ISO 3166-1 alpha-2 |
lat | number | — | Latitude GPS |
lng | number | — | Longitude GPS |
MediaItem
| Champ | Type | Requis | Description |
|---|---|---|---|
id | string | ✓ | Identifiant du média |
url | string (URL) | ✓ | URL publique du fichier |
type | 'image' | 'video' | 'doc' | ✓ | image | video | doc |
isPrimary | boolean | — | Photo principale de l'annonce |
order | number | — | Ordre d'affichage |
alt | string | — | Texte alternatif (accessibilité) |
Agent
| Champ | Type | Requis | Description |
|---|---|---|---|
id | string | ✓ | Identifiant de l'agent |
name | string | ✓ | Nom complet |
email | string | ✓ | Adresse email |
phone | string | — | Numéro de téléphone |
agency | string | — | Nom de l'agence |
avatar | string (URL) | — | URL de la photo de profil |
PaginatedResponse<T>
Toutes les listes retournent un objet paginé avec les métadonnées de navigation :
{
"data": Property[],
"meta": {
"total": 248,
"page": 1,
"perPage": 20,
"totalPages": 13,
"hasNextPage": true,
"hasPrevPage": false
}
}