Propriétés
Endpoints
| Endpoint | Usage |
|---|---|
GET /properties | Liste des propriétés |
GET /properties/{id} | Détail d'une propriété |
GET /properties/filter | Recherche filtrée (texte, visibilité, type, adresse) |
GET /properties/public | Propriétés publiques (page Explorer) |
GET /properties/recommended, GET /properties/popular | Recommandations / logements populaires |
POST /properties/{id}, PUT /properties/{id}, DELETE /properties/{id} | Création / mise à jour / suppression |
GET /properties/{id}/promos | Offres et codes promo liés |
GET /properties/{id}/favorite, GET /properties/get/favorites | Favoris |
GET /property-types | Référentiel des types de propriétés ({ id, name, description?, created_at, updated_at }) |
Il n'existe pas de liste fixe de types de propriété ou de politique d'annulation codée en dur côté frontend : la liste des types vient de GET /property-types, chargée dynamiquement.
Formulaire de création (assistant en 8 étapes)
Champs validés à la création, par étape :
// Étape 1 — compte
who_are_you: "individual" | "company";
user_id: number;
name_of_structure?: string;
// Étape 2 — identité
internal_name: string; // min 2 caractères, usage interne/admin
public_name: string; // min 2 caractères, visible des voyageurs
type: { id: string; name?: string };
description: string; // min 20 caractères
// Étape 3 — localisation
country: { id: string; name?: string };
address: string;
location: string; // format "lat,lng", ex. "5.336,-4.026"
neighborhood_id: number;
// Étape 4 — tarification
base_price: number;
price_per_night: number;
pricing: number;
cleaning_fee: number;
tax: number;
security_deposit: number;
// Étape 5 — capacité & horaires
capacity: number;
square_footage: number;
check_in_time: string; // format HH:MM:SS
check_in_time_end: string;
check_out_time: string;
// Étape 6 — règles & politique
rules: string[];
cancellation_policy: string[];
specifications: string[];
// Étape 7 — synchronisation canal
channex_sync_now?: boolean;
// Étape 8 — informations complémentaires
some_informations: Array<{ key: string; value: string }>;
wifi_informations: { network: string; password: string; speed: string };
Sur le formulaire, cancellation_policy est saisie comme un tableau de chaînes (étape 6). Mais l'objet renvoyé en lecture (GET /properties/{id}) le représente comme un objet à trois indicateurs booléens :
cancellation_policy: {
flexible: boolean;
moderate: boolean;
strict: boolean;
description: string;
} | null;
Une transformation a donc lieu entre la saisie et l'enregistrement — le code qui l'effectue n'a pas été localisé dans le frontend (probablement côté backend). Ne présumez pas qu'un même champ garde la même forme entre écriture et lecture.
Objet propriété (lecture, GET /properties/{id})
Champs principaux (liste non exhaustive des relations) :
{
id: number;
internal_name: string;
public_name: string;
type: string;
description: string;
address: string;
location: string;
status: string;
visibility: number; // 0/1
breakfast_included: number; // 0/1
pets_allowed: number; // 0/1
recommended: number; // 0/1
base_price: string; // valeurs numériques sérialisées en chaîne
price_per_night: string;
capacity: number;
cleaning_fee: string;
tax: string;
security_deposit: string;
rating: string;
like_count: number;
is_favorite?: boolean | number; // typage incohérent selon l'endpoint
is_reserved: boolean;
reserved_dates: string[];
check_in_time: string;
check_in_time_end: string;
check_out_time: string;
commodities: Array<{ id: number; name: string; type: string }>;
medias: Array<{ id: number; media_type: string; url: string; thumbnail_url: string | null }>;
seasons: any[]; // non typé sur cet endpoint
offers: any[]; // non typé sur cet endpoint
packages: any[]; // non typé sur cet endpoint
owner: {
id: number; username: string; first_name: string; last_name: string;
location: string; email: string; avatar: string | null; phone: string;
};
// Intégration Channex (channel manager)
channex_property_id?: string | null;
channex_synced_at?: string | null;
channex_room_types: ChannexRoomType[]; // voir ci-dessous
currency_model?: {
id: number; code: string; name: string; symbol: string;
exchange_rate: string; is_default: boolean; is_active: boolean;
} | null;
}
Une deuxième route de lecture (celle utilisée pour lister les propriétés d'un propriétaire) renvoie une forme différente où features, commodities, rules, wifi_informations, cancellation_policy etc. sont des chaînes JSON à parser côté client, plutôt que des objets déjà décodés comme ci-dessus. Les deux formes coexistent dans le code selon l'endpoint appelé — vérifiez laquelle s'applique avant d'implémenter un client.
Chambres et tarifs Channex (channex_room_types)
{
id: number;
title: string;
count_of_rooms: number;
occ_adults: number;
occ_children: number;
capacity: number;
rate_plans: Array<{
id: number;
title: string;
currency: string;
max_stay: number[];
min_stay_arrival: number[];
closed_to_arrival: boolean[];
closed_to_departure: boolean[];
stop_sell: boolean[];
sell_mode: string;
rate_mode: string;
}>;
}