Documentation de l’API · interne (équipe)
Une API structurée autour d'appels /rpc/<nom_fonction> via POST, avec pagination, filtres riches et extraction des tracés KML/GPX pour les itinéraires.
0) Espace équipe & exploitation SQL
Points d'entrée pour l'équipe projet avant une installation, une mise à jour SQL ou une session de test API.
| Besoin | Document | Quand l'utiliser |
|---|---|---|
| Partenaires | Espace partenaires | Guide public des prestataires externes consommant /api/public/* : clé API, endpoints, recette de synchronisation, formats pivot. C'est l'URL à communiquer avec une clé bk_live_…. |
| Déploiement SQL | SQL_ROLLOUT_RUNBOOK.md | Ordre d'installation fraîche, mises à jour incrémentales, refresh des vues matérialisées et rollback. |
| Supabase | SUPABASE_SETUP.md | Configuration PostgREST du schéma api, extensions PostgreSQL, permissions et cache schema. |
| Référence DB/API | api-db-reference.html | Inventaire généré des RPC/fonctions, tables lues/écrites, RLS, enums, tags, CID/refcodes et valeurs seed documentées. |
| Tests API | README_Postman.md | Préparer l'environnement Postman et lancer les collections de validation. |
| Collection | Collection · Environnement | Importer ou mettre à jour les appels API partagés par l'équipe. |
| Contrat tiers | OpenAPI 3.1 · openapi.json | Contrat de la passerelle partenaire /api/public/* (objets publiés, formats pivot ?format=, tombstones, catalogues). Importable dans Postman/Insomnia/codegen ; rendu lisible via Redoc. |
| Interop | Formats pivot (I4) | Sortie multi-standards schema.org · DATAtourisme · Apidae · Tourinsoft : consommation partenaire (détail + liste par lots), mapping des 19 types (ref_interop_crosswalk), recette d'ajout d'un profil, périmètre couvert. |
0.1 Résumé SQL opérationnel
- Pour une base neuve, suivre le manifeste complet du runbook SQL dans l'ordre exact.
- Extensions attendues :
uuid-ossp,postgis,unaccent,pg_trgm,btree_gist,pgcrypto;pg_cronuniquement si les tâches SQL planifiées sont activées. - Les refreshs doivent cibler
internal.mv_ref_data_jsonetinternal.mv_filtered_objects. lot1_pilot_inserts.sqlreste local/pilote : ne pas l'appliquer dans une installation standard sans décision explicite.
0.2 Sources de vérité
La documentation API ci-dessous décrit les contrats consommateur. Pour l'ordre SQL, les prérequis Supabase et les scripts opérationnels, le runbook SQL et le guide Supabase restent les documents de référence.
Pour l'audit fonction par fonction et connexion par connexion, utiliser la référence DB/API générée : elle croise db-graph-out/graph.json, les RPC SQL, les tables lues/écrites, les policies, les enums et les valeurs de référentiels live vérifiées par Supabase MCP quand db-graph-out/reference_live.json est disponible, sinon les seeds SQL versionnées.
Dans le dépôt, la documentation technique détaillée du schéma reste dans Base de donnée DLL et API/README.md.
1) Authentification & conventions
1.1 Méthodes d'authentification
L'API Bertel v3 supporte plusieurs méthodes d'authentification selon votre contexte d'utilisation :
JWT (Recommandée pour les applications)
Pour les applications web/mobile avec utilisateurs connectés :
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Avantages : Accès aux données étendues selon les rôles utilisateur, sécurité maximale.
Clé API (Service-to-Service)
Pour les intégrations serveur-à-serveur :
apikey: bertel_sk_1234567890abcdef
Avantages : Accès complet aux données publiques, idéal pour les synchronisations automatiques.
Accès anonyme (Lecture seule)
Pour les données publiques uniquement :
apikey: <SUPABASE_ANON_KEY>
Authorization: Bearer <SUPABASE_ANON_KEY>
Limitations : Seules les données publiques (status = 'published') sont accessibles.
1.2 En-têtes HTTP requis
Chaque requête doit inclure :
Content-Type: application/jsonAccept: application/jsonContent-Profile: api- Vos en-têtes d'authentification selon votre méthode choisie (voir ci-dessus)
Exemple complet de requête
curl -X POST "https://api.bertel.re/rpc/get_object_resource" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{"p_object_id": "HOTTST0000000001"}'
Remplacez {SUPABASE_ANON_KEY} par la clé publique (anon) de votre projet Supabase. Pour les appels serveur à serveur, utilisez la clé service et un token approprié.
1.3 Niveaux d'accès aux données
Selon votre méthode d'authentification, vous avez accès à différents niveaux de données :
| Méthode | Données publiques | Données étendues | Données privées |
|---|---|---|---|
| Anonyme | ✅ Objets publiés uniquement | ❌ Non | ❌ Non |
| Clé API | ✅ Tous les objets | ✅ Selon les rôles | ❌ Non |
| JWT (Utilisateur) | ✅ Tous les objets | ✅ Si acteur de l'organisation | ✅ Si acteur de l'organisation |
Les données étendues incluent : descriptions privées, contacts non-publics, médias non-publiés, informations légales, réductions, politiques de groupe.
L'accès aux données étendues/privées nécessite que l'utilisateur soit lié à l'organisation propriétaire de l'objet via son adresse email dans actor_channel.
1.4 Gestion des erreurs d'authentification
L'API retourne des codes d'erreur spécifiques pour les problèmes d'authentification :
| Code HTTP | Message | Cause | Solution |
|---|---|---|---|
401 |
Unauthorized | Token JWT invalide ou expiré | Renouveler le token ou se reconnecter |
403 |
Forbidden | Clé API invalide ou droits insuffisants | Vérifier la clé API ou les permissions |
429 |
Too Many Requests | Limite de taux dépassée | Attendre ou implémenter un backoff |
Exemple de réponse d'erreur
{
"code": "PGRST301",
"message": "JWT expired",
"hint": "Refresh your token and try again"
}
1.5 Convention d'appel
Méthode : POST
Chemin : /rpc/<nom_fonction>
Exemples : /rpc/get_object_resource • /rpc/list_object_resources_page • /rpc/list_object_resources_since_fast • /rpc/list_object_resources_filtered_page • /rpc/list_object_resources_filtered_since_fast
Corps : JSON avec paramètres nommés (voir chaque endpoint).
La liste exhaustive des fonctions exposées, leurs retours, leurs propriétés SECURITY DEFINER et leurs connexions aux tables est maintenue dans la référence RPC générée.
1.6 Types de base (comment lire les réponses)
| Type | Description |
|---|---|
string | Texte (ex. "Hôtel du Parc"). |
number | Nombre (ex. 12, 3.14). |
boolean | true / false. |
timestamp | Date-heure ISO 8601 en UTC (ex. "2024-03-18T09:30:00Z"). |
enum (code) | Valeur codée (ex. "image", "ITI", "published"). |
array | Liste (ex. ["fr","en"]). |
object | Sous-ensemble structuré avec ses propres champs. |
Les champs absents pour un objet sont renvoyés comme [], {} ou null selon le bloc : pas d'exception.
1.7 Codes de types d'objets (p_types / p_object_type)
Les endpoints d’énumération et de recherche acceptent un ou plusieurs codes de type d’objet via p_types (ou p_object_type selon la fonction). Liste des codes disponibles :
| Code | Libellé | Usage principal | Informations clés pour le voyageur |
|---|---|---|---|
ORG | Organisation | OTI/CRT, gestion et publication | contacts (tél, email, site), opening_times, location, descriptions, media |
HOT | Hôtel | Hébergement hôtelier classé | prices (gammes/périodes), amenities (wifi, parking, breakfast), capacity (chambres), classifications (étoiles, éco-labels) |
HPA | Hébergement de plein air | Aires naturelles, camping à la ferme, insolite plein air (campings classés → CAMP) | capacity (emplacements/unités), amenities (sanitaires, eau, électricité), prices, opening_times |
HLO | Hébergement locatif | Gîtes, meublés, villas | prices, amenities (cuisine, lave-linge, parking), capacity, classifications (épis Gîtes de France) |
CAMP | Camping | Terrain de camping classé | capacity (emplacements, tentes, camping-cars), amenities (sanitaires, électricité, eau), prices, opening_times |
RVA | Résidence de vacances | Résidence de tourisme avec services para-hôteliers | capacity (logements), room_types, prices, classifications (classement résidence de tourisme) |
RES | Restaurant | Restauration | opening_times (service midi/soir), menus (plats/prix), cuisine_types/dietary_tags/allergens, contacts (réservation) |
FMA | Fête / Manifestation | Événements récurrents ou ponctuels | fma & fma_occurrences (dates/horaires), location, ticket/prix, descriptions/media |
ITI | Itinéraire | Parcours & tracés (randonnée, trail, VTT) | itinerary (distance, durée, difficulté, dénivelé), itinerary_details (info, parking, équipement), track (KML/GPX), étapes |
VIL | Ville / Village | Entité territoriale touristique | location/descriptions (pourquoi visiter), environment_tags (plage, montagne, patrimoine), relations (POI proches) |
PCU | Patrimoine culturel | Musées, églises, monuments, sites historiques | location, descriptions, opening_times, media, classifications (Monument Historique, labels) |
PNA | Site naturel | Cascades, forêts, sites volcaniques, points de vue | location, descriptions (accès, consignes, réglementation), amenities (parking, kiosques, eau) |
LOI | Loisir | Sites et prestations de loisirs | opening_times, prices, capacity, amenities |
ASC | Activité sportive et culturelle | Structures pérennes : écoles, clubs, centres | act (facette object_act, partagée avec ACT), contacts, opening_times, prices |
ACT | Activité encadrée | Prestation commerciale encadrée (sortie guidée, séance) | act (facette object_act), prices, durée/niveau, relations (opérateur, lieu de RDV) |
COM | Commerce | Boutique / retail | opening_times, amenities (accessibilité, parking), classifications/tags (retail), payment_methods |
PSV | Prestataire de services | Transport, VTC/taxi, location de véhicules et de matériel | contacts, opening_times, prices, payment_methods |
PRD | Producteur | Agritourisme, dégustation, vente directe (plantations, distilleries, mielleries…) | sous-catégorie taxonomy_prd, opening_times (visites), prices (dégustation/visite), classifications (labels qualité), relations (prestations ACT liées) |
SPU | Service public | Services & équipements au public, en accès libre non marchand : toilettes, eau potable, bornes de recharge, aires de pique-nique, BIT, équipements sportifs libres, parkings touristiques | opening_times (24/7 ou horaires), sous-catégorie taxonomy_spu, accessibilité, coût |
Exemples : "p_types": ["SPU"] pour les services publics • "p_types": ["PSV"] pour les prestataires (transport, location) • "p_types": ["RVA","CAMP"] pour résidences de vacances et campings.
Légende alignée sur le modèle canonique le 2026-06-11 (décisions §53/§57) : l'ancienne table (2025-10-04) divergeait sur 6 codes — PSV y était présenté comme « Service public » (désormais SPU, type dédié), RVA comme « Aire camping-car », PCU/PNA/ASC/HPA portaient des libellés erronés — et elle omettait LOI et ACT. Le type PRD « Producteur » (§57) regroupe l'agritourisme/dégustation auparavant éclaté entre LOI, RES et COM ; règles d'arbitrage : production+accueil → PRD · repas → RES · revente seule → COM · prestation encadrée → ACT · accès libre non marchand → SPU · marchand → LOI ; marché pérenne → COM, édition datée → FMA.
2) Endpoints
Collection Postman disponible
Testez l'API directement avec notre collection Postman complète, incluant tous les endpoints, exemples et tests automatiques.
2.1 Récupérer une ressource : get_object_resource
But — Obtenir toutes les données d’un objet (et, si demandé, son tracé KML/GPX pour un itinéraire).
Paramètres (JSON)
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | string | ✅ | — | Identifiant de la ressource à lire. |
p_lang_prefs | array<string> | ❌ | ["fr"] | Préférences de langue (ordre de priorité). |
p_track_format | enum "none" | "kml" | "gpx" | ❌ | "none" | Tracé : par défaut aucun. Mettez "kml" ou "gpx" (type ITI). |
p_options | object | ❌ | {} | Options avancées (voir détails ci-dessous). |
p_options — options avancées
| Option | Type | Défaut | Description |
|---|---|---|---|
include_stages | boolean | true | Inclure les étapes dans le tracé KML/GPX. |
stage_color | string | "red" | Couleur des étapes (KML uniquement). |
render | boolean | true | Générer le bloc render avec données formatées. |
render_locale | string | auto | Locale pour le formatage (ex. "fr-FR"). |
render_tz | string | "UTC" | Fuseau horaire pour le formatage. |
render_version | string | "1.0" | Version du formatage. |
fields | array<string> | null | Limiter les champs retournés (ex. ["id", "name", "contacts"]). |
include | array<string> | null | Inclure des blocs optionnels (ex. ["render", "actors"]). |
org_object_id | string | auto | Préférence d'organisation pour les descriptions. |
include_private | boolean | false | Inclure les données privées (nécessite permissions). |
{
"p_object_id": "HOT123",
"p_lang_prefs": ["fr", "en"],
"p_track_format": "kml",
"p_options": {
"include_stages": true,
"stage_color": "blue",
"render": true,
"render_locale": "fr-FR",
"fields": ["id", "name", "contacts", "media"],
"org_object_id": "ORG456"
}
}
Important (tracé ITI)
- Par défaut :
p_track_format = "none"→ aucun tracé dans la réponse. - Si
"kml"ou"gpx":include_stagescontrôle l’ajout des étapes.- KML : si
include_stages=true, vous pouvez réglerstage_color(ex."red","blue","green","orange","purple","black","white","yellow","cyan","magenta","gray",#RRGGBBouAABBGGRR). - GPX :
stage_colorest ignoré (waypoints “Flag, Red”).
Exemples d’appel
curl -X POST "{BASE_URL}/rpc/get_object_resource" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_object_id": "ITI123",
"p_lang_prefs": ["fr","en"],
"p_track_format": "kml",
"p_options": { "include_stages": true, "stage_color": "blue" }
}'
const res = await fetch(`${BASE_URL}/rpc/get_object_resource`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Accept": "application/json",
"Content-Profile": "api",
"apikey": SUPABASE_ANON_KEY,
"Authorization": `Bearer ${SUPABASE_ANON_KEY}`
},
body: JSON.stringify({
p_object_id: "ITI123",
p_lang_prefs: ["fr","en"],
p_track_format: "none" // pas de tracé par défaut
})
});
const json = await res.json();
2.2 Lister (pagination page/offset) : list_object_resources_page
But — Lister des ressources avec pagination simple (offset/page), filtrées par type, statut, recherche. Par défaut, pas de tracé.
Paramètres (JSON)
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_cursor | string | ❌ | null | Curseur opaque renvoyé par l’appel précédent. |
p_lang_prefs | array<string> | ❌ | ["fr"] | Préférences de langue. |
p_page_size | number | ❌ | 50 | 1 à 200. |
p_types | array<enum> | ❌ | null | Restreindre aux types demandés (ex. ["ITI"]). |
p_status | array<enum> | ❌ | ["published"] | Statuts acceptés. |
p_search | string | ❌ | null | Terme de recherche (nom normalisé ; insensible aux accents & casse). |
p_track_format | "none" | "kml" | "gpx" | ❌ | "none" | |
p_include_stages | boolean | ❌ | null | Si vous demandez un tracé KML/GPX, inclure les étapes ? |
p_stage_color | string | ❌ | null | Couleur des étapes (KML uniquement) si include_stages=true. |
p_omit_empty | boolean | ❌ | false | Supprimer les tableaux/objets vides du niveau supérieur (ex. actors, legal_records, meeting_rooms). |
Réponse
{
"info": {
"kind": "page",
"language": "fr",
"language_fallbacks": ["fr","en"],
"page_size": 50,
"offset": 0,
"total": 1234,
"cursor": "<opaque>",
"next_cursor": "<opaque or null>"
},
"data": [ /* ressources */ ]
}
Flux d’usage
- Premier appel sans
p_cursor. - Lisez
info.next_cursor. - Rappelez en passant
p_cursorpour la page suivante, etc.
Exemple (cURL)
curl -X POST "{BASE_URL}/rpc/list_object_resources_page" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_page_size": 20,
"p_types": ["ITI"],
"p_status": ["published"],
"p_search": "crêtes",
"p_track_format": "none"
}'
Mode de nettoyage (omit_empty)
Le paramètre p_omit_empty permet de réduire la taille des réponses en supprimant automatiquement les blocs de données vides au niveau supérieur de chaque ressource.
Comment l'utiliser
Passez p_omit_empty: true dans l'endpoint de pagination :
curl -X POST "{BASE_URL}/rpc/list_object_resources_page" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_page_size": 2,
"p_omit_empty": true
}'
Le paramètre est également préservé dans le curseur et propagé automatiquement aux appels suivants.
Ce qui est supprimé
Quand omit_empty est activé, les blocs suivants sont supprimés s'ils sont vides :
actors[]— Personnes liées à l'objetlegal_records[]— Documents légauxmeeting_rooms[]— Salles de réunionfma[]— Événements FMAfma_occurrences[]— Occurrences d'événements
Note : Les blocs opening_times et render sont toujours conservés, même s'ils sont vides.
2.3 Lister depuis une date (keyset) : list_object_resources_since_fast
But — Synchroniser ce qui a changé depuis un instant T (robuste pendant les mises à jour).
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_since | timestamp | ✅ | — | Point de départ (UTC). |
p_cursor | string | ❌ | null | Curseur opaque. |
p_use_source | boolean | ❌ | false | Utiliser la date de mise à jour source plutôt que technique. |
p_lang_prefs | array<string> | ❌ | ["fr"] | Préférences de langue. |
p_limit | number | ❌ | 50 | 1 à 200. |
p_types / p_status / p_search | — | ❌ | — | Comme §2.2. |
p_track_format / p_include_stages / p_stage_color | — | ❌ | — | Comme §2.2 (par défaut, pas de tracé). |
p_omit_empty | boolean | ❌ | false | Supprimer les tableaux/objets vides du niveau supérieur (ex. actors, legal_records, meeting_rooms). |
Réponse
{
"info": {
"kind": "since",
"language": "fr",
"language_fallbacks": ["fr"],
"since": "2024-04-01T00:00:00Z",
"use_source": false,
"limit": 50,
"cursor": "<opaque>",
"next_cursor": "<opaque or null>"
},
"data": [ /* ressources modifiées/ajoutées depuis p_since */ ]
}
Flux d’usage (sync incrémentale)
- Appelez avec votre
p_since(ex. dernière sync réussie). - Tant que
next_cursorn’est pasnull, chaînez avecp_cursor. - Enregistrez ensuite un nouveau “since” (ex. maintenant) pour la prochaine sync.
2.4 Lister avec filtres riches (page/cursor) : list_object_resources_filtered_page
But — Même idée que §2.2, mais avec un JSON de filtres riches p_filters.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_cursor / p_lang_prefs / p_page_size | — | ❌ | — | Comme §2.2 |
p_filters | object | ❌ | {} | Filtres riches (voir ci-dessous). |
p_types / p_status / p_search | — | ❌ | — | Comme §2.2 |
p_track_format / p_include_stages / p_stage_color | — | ❌ | — | Comme §2.2 |
p_omit_empty | boolean | ❌ | false | Supprimer les tableaux/objets vides du niveau supérieur (ex. actors, legal_records, meeting_rooms). |
p_filters — possibilités & exemples
Exemple d'utilisation
{
"amenities_any": ["PARKING","WIFI"],
"itinerary": { "is_loop": true, "distance_max_km": 15, "practices_any": ["hiking"] },
"within_radius": { "lat": 45.76, "lon": 4.84, "radius_m": 20000 },
"media_types_any": ["image"],
"media_published_only": true,
"media_must_have_main": true
}
Paramètres disponibles
Équipements & Services
amenities_any: string[]— au moins un équipementamenities_all: string[]— tous ces équipementsamenity_families_any: string[]— au moins une famillepet_accepted: boolean— animaux acceptéspayment_methods_any: string[]environment_tags_any: string[]languages_any: string[]
Médias
media_types_any: string[]— ex.["image","video"]media_published_only: booleanmedia_must_have_main: boolean
Capacité & Classement
capacity_filters: [{ code, min?, max? }]classifications_any: [{ scheme_code, value_code }]tags_any: string[]— slugsmeeting_room: { min_count, min_area_m2, min_cap_theatre, min_cap_u, min_cap_classroom, min_cap_boardroom, equipment_any, equipment_all }
Géolocalisation
within_radius: { lat, lon, radius_m }bbox: [minLon, minLat, maxLon, maxLat] (WGS84)
Itinéraires
itinerary: { is_loop, difficulty_min/max, distance_min/max_km, duration_min/max_h, practices_any[] }
Disponibilité
open_now: boolean— ouvert "maintenant"
2.5 Filtres + depuis une date (keyset) : list_object_resources_filtered_since_fast
But — La combinaison de §2.3 (since/keyset) et §2.4 (filtres riches).
| Paramètre | Type | Oblig. | Défaut | Description |
|---|---|---|---|---|
p_since | timestamp | ✅ | — | Point de départ (UTC). |
p_cursor | string | ❌ | null | Curseur opaque. |
p_use_source | boolean | ❌ | false | Comme §2.3. |
p_lang_prefs | array<string> | ❌ | ["fr"] | — |
p_limit | number | ❌ | 50 | 1 à 200. |
p_filters | object | ❌ | {} | Comme §2.4. |
p_types / p_status / p_search | — | ❌ | — | — |
p_track_format / p_include_stages / p_stage_color | — | ❌ | — | — |
Réponse : même forme que §2.3, avec filters propagés dans le curseur.
2.5.1 IDs avec modifications validées : list_objects_with_validated_changes_since
But — Retourner la liste des object_id ayant au moins une modification validée depuis une date donnée.
| Paramètre | Type | Oblig. | Défaut | Description |
|---|---|---|---|---|
p_since | timestamp | ✅ | — | Seuil de temps (UTC). |
Statuts pris en compte : approved et applied. Horodatage effectif : COALESCE(applied_at, reviewed_at).
Réponse : tableau JSON d'IDs (ex. ["HOT123", "RES456"]).
Accès : endpoint réservé aux rôles service_role et admin.
2.6 Fonctions Deep Data : données enrichies en un appel
But — Récupérer des objets avec leurs données en profondeur : objets parents, acteurs, organisations et contacts associés. Idéal pour les applications nécessitant des informations complètes.
Ces fonctions incluent automatiquement les données des objets liés, évitant les appels multiples pour obtenir une vue complète.
2.6.1 Récupérer un objet avec Deep Data : get_object_with_deep_data
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | string | ✅ | — | Identifiant de l'objet à récupérer. |
2.6.2 Récupérer plusieurs objets avec Deep Data : get_objects_with_deep_data
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_ids | array<string> | ✅ | — | Liste des identifiants d'objets. |
p_languages | array<string> | ❌ | ["fr"] | Préférences de langue. |
p_include_media | string | ❌ | "none" | Inclusion des médias : "none", "basic", "full". |
p_filters | object | ❌ | {} | Filtres optionnels. |
2.6.3 Lister par type avec Deep Data : get_objects_by_type_with_deep_data
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_type | string | ✅ | — | Type d'objet ("HOT", "ORG", "RES", etc.). |
p_languages | array<string> | ❌ | ["fr"] | Préférences de langue. |
p_include_media | string | ❌ | "none" | Inclusion des médias. |
p_filters | object | ❌ | {} | Filtres optionnels. |
p_limit | number | ❌ | 100 | Nombre maximum d'objets. |
p_offset | number | ❌ | 0 | Décalage pour la pagination. |
2.6.4 Rechercher avec Deep Data : search_objects_with_deep_data
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_search_term | string | ✅ | — | Terme de recherche. |
p_object_types | array<string> | ❌ | null | Types d'objets à inclure (null = tous). |
p_languages | array<string> | ❌ | ["fr"] | Préférences de langue. |
p_include_media | string | ❌ | "none" | Inclusion des médias. |
p_filters | object | ❌ | {} | Filtres optionnels. |
p_limit | number | ❌ | 50 | Nombre maximum d'objets. |
p_offset | number | ❌ | 0 | Décalage pour la pagination. |
2.6.5 Recherche spécialisée restaurants : search_restaurants_by_cuisine
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_cuisine_types | array<string> | ✅ | — | Types de cuisine recherchés (ex. ["local", "veggie"]). |
p_languages | array<string> | ❌ | ["fr"] | Préférences de langue. |
p_limit | number | ❌ | 50 | Nombre maximum de résultats. |
p_offset | number | ❌ | 0 | Décalage pour la pagination. |
2.6.6 Recherche événements par cuisine : search_events_by_restaurant_cuisine
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_cuisine_types | array<string> | ✅ | — | Types de cuisine des restaurants associés. |
p_languages | array<string> | ❌ | ["fr"] | Préférences de langue. |
p_limit | number | ❌ | 50 | Nombre maximum de résultats. |
p_offset | number | ❌ | 0 | Décalage pour la pagination. |
Structure de réponse Deep Data
Les fonctions Deep Data retournent une structure enrichie :
{
"object": {
// Données complètes de l'objet principal (comme get_object_resource)
"id": "HOT123",
"name": "Hôtel Example",
"type": "HOT",
"contacts": [...],
"media": [...],
// ... toutes les autres données de l'objet
},
"parent_objects": [
{
"id": "ORG456",
"type": "ORG",
"name": "Organisation Parent",
"status": "published",
"relation_type": {
"id": "uuid-relation-type",
"name": "Gestionnaire"
},
"distance_m": 100,
"note": "Relation de gestion",
"basic_info": {
"id": "ORG456",
"type": "ORG",
"name": "Organisation Parent",
"status": "published"
}
}
],
"actors": [
{
"id": "actor-uuid",
"display_name": "Jean Dupont",
"first_name": "Jean",
"last_name": "Dupont",
"role": {
"id": "role-uuid",
"code": "manager",
"name": "Gestionnaire"
},
"is_primary": true,
"valid_from": "2024-01-01",
"valid_to": "2024-12-31",
"contacts": [...]
}
],
"organizations": [
{
"id": "ORG789",
"type": "ORG",
"name": "Agence de Conciergerie",
"status": "published",
"role": {
"id": "org-role-uuid",
"code": "concierge",
"name": "Conciergerie"
},
"contacts": [...]
}
]
}
2.7 Recherche & Découverte
Fonctions pour rechercher des objets par critères spécialisés ou afficher des objets sur une carte avec un payload minimal.
2.7.1 Recherche par label de durabilité : search_objects_by_label
Recherche d'objets par label de durabilité (ex. écolabels). Peut inclure les correspondances partielles (objets avec certaines actions du label).
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_label_value_id | uuid | ✅ | — | ID de la valeur de label recherchée (ref_classification_value). |
p_include_partial | boolean | ❌ | true | Inclure les objets avec correspondances partielles (certaines actions du label). |
p_lang_prefs | array<string> | ❌ | ["fr"] | Préférences de langue. |
p_limit | number | ❌ | 20 | Nombre maximum de résultats. |
p_offset | number | ❌ | 0 | Décalage pour la pagination. |
Réponse : Liste de ressources complètes incluant tous les blocs de données (comme get_object_resource).
2.7.2 Vue carte allégée : list_objects_map_view
Retourne un payload minimal optimisé pour l'affichage sur une carte interactive. Inclut uniquement les données essentielles : coordonnées, nom, type, image principale.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_types | array<string> | ❌ | null | Codes de types d'objets à inclure (ex. ["HOT", "RES"]). |
p_status | array<string> | ❌ | ["published"] | Statuts d'objets à inclure. |
p_filters | jsonb | ❌ | {} | Filtres riches (même format que list_object_resources_filtered_page). |
p_lang_prefs | array<string> | ❌ | ["fr"] | Préférences de langue. |
p_limit | number | ❌ | 500 | Nombre maximum de résultats. |
p_offset | number | ❌ | 0 | Décalage pour la pagination. |
Réponse : Array d'objets avec structure minimale :
[
{
"object_id": "HOT123",
"type": "HOT",
"name": "Hôtel Example",
"latitude": 43.296482,
"longitude": 5.369780,
"main_image_url": "https://...",
"status": "published"
}
]
2.7.3 Vue adaptée (FALC) : get_object_resource_adapted
Retourne une ressource simplifiée optimisée pour les personnes avec handicap (FALC - Facile à Lire et à Comprendre). Le champ description utilise description_adapted en priorité (fallback sur la description standard).
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'objet. |
p_lang_prefs | array<string> | ❌ | ["fr"] | Préférences de langue. |
Réponse : Objet JSON simplifié avec description, location (city, postcode), contact (primary phone + email), image, open_now et accessibility_labels.
2.7.4 Vue adaptée batch : get_object_cards_adapted_batch
Version batch de get_object_resource_adapted pour charger plusieurs fiches adaptées en un seul appel.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_ids | array<text> | ✅ | — | IDs des objets. |
p_lang_prefs | array<string> | ❌ | ["fr"] | Préférences de langue. |
2.8 Médias
2.8.1 Médias pour le web : get_media_for_web
Retourne les médias d'un objet filtrés pour l'affichage web. Exclut automatiquement les médias internes, archives et brouillons. Sélectionne l'image principale intelligemment selon les tags de priorité.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'objet. |
p_preferred_tags | array<string> | ❌ | ["facade", "interieur", "cuisine", "paysage"] | Tags préférés pour la sélection de l'image principale (ordre de priorité). |
p_lang_prefs | array<string> | ❌ | ["fr"] | Préférences de langue pour les légendes. |
p_limit | number | ❌ | 20 | Nombre maximum de médias retournés. |
Réponse : Array de médias avec URL, légendes, tags de classification (23 tags prédéfinis : facade, interieur, cuisine, paysage, chambre, salle_bain, piscine, jardin, terrasse, vue, restaurant, bar, spa, salle_reunion, equipement, activite, ambiance, detail, produit, menu, plan, equipe, autre_contenu).
2.9 Avis (Reviews)
2.9.1 Récupérer les avis : get_object_reviews
Retourne les avis importés d'une plateforme externe avec agrégats (note moyenne, nombre total d'avis).
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'objet. |
p_limit | number | ❌ | 10 | Nombre maximum d'avis retournés. |
p_offset | number | ❌ | 0 | Décalage pour la pagination. |
p_lang_prefs | array<string> | ❌ | ["fr"] | Préférences de langue pour filtrer les avis. |
Réponse : Objet JSON avec reviews[] (array d'avis individuels) et aggregates (note moyenne, nombre total).
{
"reviews": [
{
"id": "uuid",
"author_name": "Jean Dupont",
"rating": 4.5,
"comment": "Excellent séjour...",
"review_date": "2026-01-15",
"language_id": "uuid-fr",
"source_platform": "Google"
}
],
"aggregates": {
"average_rating": 4.3,
"total_reviews": 127
}
}
2.10 Types de chambres
2.10.1 Récupérer les types de chambres : get_object_room_types
Retourne les types de chambres pour un hébergement avec leurs équipements, capacités et tarifs.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'hébergement. |
p_lang_prefs | array<string> | ❌ | ["fr"] | Préférences de langue pour les libellés. |
Réponse : Array de types de chambres avec détails complets (nom, description, équipements, capacité, tarifs).
[
{
"id": "uuid",
"name": "Chambre Double Confort",
"description": "Chambre spacieuse avec vue sur le jardin...",
"room_count": 5,
"amenities": ["wifi", "tv", "minibar"],
"capacity": {
"max_adults": 2,
"max_children": 1
},
"prices": [
{
"amount": 120.00,
"currency": "EUR",
"unit": "night"
}
]
}
]
2.11 Promotions
2.11.1 Valider un code promo : validate_promotion_code
Valide un code promotionnel pour un objet spécifique. Vérifie la validité temporelle, le statut et l'applicabilité.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_code | text | ✅ | — | Code promotionnel à valider. |
p_object_id | text | ❌ | null | Identifiant de l'objet (si spécifique à un objet). |
Réponse : Objet JSON avec résultat de validation et détails de la promotion si valide.
{
"is_valid": true,
"promotion": {
"id": "uuid",
"code": "SUMMER2026",
"discount_percent": 15,
"valid_from": "2026-06-01",
"valid_to": "2026-08-31",
"description": "Réduction été 2026"
}
}
2.12 Traces & Export GPX
Fonctions pour exporter les tracés d'itinéraires dans différents formats (KML, GPX, GeoJSON) avec ou sans métadonnées et points d'étape.
2.12.1 Construire un tracé : build_iti_track
Construit le tracé d'un itinéraire au format KML ou GPX avec placemarks/waypoints optionnels pour les étapes.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'itinéraire. |
p_format | text | ❌ | "kml" | Format de sortie : "kml" ou "gpx". |
p_include_stages | boolean | ❌ | true | Inclure les étapes comme placemarks/waypoints. |
p_stage_color | text | ❌ | "red" | Couleur des placemarks d'étapes (pour KML). |
Réponse : Document KML ou GPX (XML) prêt à être téléchargé ou affiché dans une application cartographique.
2.12.2 Export GPX complet : export_itinerary_gpx
Exporte un itinéraire au format GPX complet avec métadonnées enrichies (nom, description, auteur, copyright) et waypoints pour les étapes.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'itinéraire. |
p_include_stages | boolean | ❌ | true | Inclure les waypoints d'étapes. |
p_include_metadata | boolean | ❌ | true | Inclure les métadonnées enrichies (nom, desc, auteur). |
Réponse : Document GPX 1.1 complet avec métadonnées et extensions.
2.12.3 Export GPX batch : export_itineraries_gpx_batch
Exporte plusieurs itinéraires en un seul appel. Utile pour générer un package de traces.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_ids | array<text> | ✅ | — | Array d'identifiants d'itinéraires. |
p_include_stages | boolean | ❌ | true | Inclure les waypoints d'étapes. |
Réponse : Array d'objets JSON avec object_id et gpx (document GPX pour chaque itinéraire).
[
{
"object_id": "ITI123",
"gpx": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gpx...>...</gpx>"
}
]
2.12.4 Tracé simplifié : get_itinerary_track_simplified
Retourne un tracé simplifié (moins de points) pour affichage léger sur une carte. Utilise l'algorithme Douglas-Peucker.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'itinéraire. |
p_tolerance | float | ❌ | 0.0001 | Tolérance de simplification (plus élevé = moins de points). |
Réponse : GeoJSON LineString simplifié.
{
"type": "LineString",
"coordinates": [
[5.3698, 43.2965],
[5.3712, 43.2978],
...
]
}
2.12.5 Tracé GeoJSON avec étapes : get_itinerary_track_geojson
Retourne le tracé et les étapes sous forme de FeatureCollection GeoJSON (compatible Leaflet, Mapbox, etc.).
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'itinéraire. |
p_simplify | boolean | ❌ | false | Appliquer la simplification Douglas-Peucker. |
p_tolerance | float | ❌ | 0.0001 | Tolérance si simplification activée. |
Réponse : GeoJSON FeatureCollection avec le tracé (LineString) et les étapes (Points).
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [[5.3698, 43.2965], ...]
},
"properties": {
"object_id": "ITI123",
"name": "Sentier du littoral"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [5.3698, 43.2965]
},
"properties": {
"stage_number": 1,
"name": "Départ - Port de Cassis"
}
}
]
}
2.13 Système juridique (Legal)
Système complet de gestion des documents juridiques et réglementaires : licences, assurances, certifications, attestations, etc. Permet le suivi de conformité, des expirations et des demandes de documents.
2.13.1 CRUD - Ajouter un enregistrement juridique : add_legal_record
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'objet. |
p_type_code | text | ✅ | — | Code du type juridique (ex. "ASSURANCE_RC"). |
p_value | jsonb | ✅ | — | Données spécifiques (numéro de police, montant couverture, etc.). |
p_document_id | uuid | ❌ | null | Référence au document justificatif (ref_document). |
p_valid_from | date | ❌ | CURRENT_DATE | Date de début de validité. |
p_valid_to | date | ❌ | null | Date de fin de validité (si applicable). |
p_validity_mode | legal_validity_mode | ❌ | "fixed_end_date" | Mode : "forever", "tacit_renewal", "fixed_end_date". |
p_status | text | ❌ | "active" | Statut : "active", "pending", "expired", "revoked". |
p_note | text | ❌ | null | Note interne. |
Réponse : UUID du nouvel enregistrement créé.
2.13.2 CRUD - Mettre à jour un enregistrement : update_legal_record
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_legal_id | uuid | ✅ | — | ID de l'enregistrement à mettre à jour. |
p_value | jsonb | ❌ | null | Nouvelles données (merge avec existantes si fourni). |
p_document_id | uuid | ❌ | null | Nouveau document justificatif. |
p_valid_from | date | ❌ | null | Nouvelle date de début. |
p_valid_to | date | ❌ | null | Nouvelle date de fin. |
p_validity_mode | legal_validity_mode | ❌ | null | Nouveau mode de validité. |
p_status | text | ❌ | null | Nouveau statut. |
p_note | text | ❌ | null | Nouvelle note. |
Note : Seuls les paramètres fournis sont mis à jour. Les autres restent inchangés.
2.13.3 Récupérer les données juridiques : get_object_legal_data
Retourne tous les enregistrements juridiques d'un objet au format JSON structuré pour l'API.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'objet. |
Réponse : JSONB avec array d'enregistrements juridiques.
2.13.4 Vérifier la conformité : check_object_legal_compliance
Vérifie si un objet possède tous les documents juridiques requis pour son type.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'objet. |
Réponse : Table avec is_compliant (boolean), missing_types[] (array des types manquants), expired_records[].
2.13.5 Rapport de conformité JSON : get_object_legal_compliance
Version JSON de la vérification de conformité, prête pour l'API.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'objet. |
Réponse : Objet JSON avec conformité détaillée.
{
"is_compliant": false,
"missing_types": [
{
"type_code": "ASSURANCE_RC",
"type_name": "Assurance responsabilité civile",
"is_required": true
}
],
"expired_records": [
{
"legal_id": "uuid",
"type_code": "LICENCE_IV",
"valid_to": "2025-12-31"
}
]
}
2.13.6 Enregistrements expirant : get_expiring_legal_records_api
Liste les enregistrements juridiques arrivant à expiration dans un délai donné. Utile pour les alertes et notifications.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_days_ahead | integer | ❌ | 30 | Nombre de jours avant expiration. |
p_object_types | array<text> | ❌ | null | Filtrer par types d'objets (ex. ["HOT", "RES"]). |
p_legal_types | array<text> | ❌ | null | Filtrer par types juridiques. |
Réponse : JSON avec array d'enregistrements expirant bientôt.
2.13.7 Générer des notifications d'expiration : generate_legal_expiry_notifications
Génère automatiquement des notifications pour les enregistrements juridiques arrivant à expiration.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_days_ahead | integer | ❌ | 30 | Nombre de jours avant expiration pour alerter. |
p_object_types | array<text> | ❌ | null | Filtrer par types d'objets. |
Réponse : JSON avec nombre de notifications créées.
2.13.8 Audit de conformité global : audit_legal_compliance
Audit complet de la conformité juridique sur tous les objets ou un sous-ensemble. Génère un rapport d'audit.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_types | array<text> | ❌ | null | Limiter l'audit à certains types d'objets. |
p_include_expired | boolean | ❌ | false | Inclure les enregistrements expirés dans le rapport. |
Réponse : Rapport JSON avec statistiques (nombre d'objets conformes, non-conformes, en attente).
2.13.9 Workflow - Demander un document : request_legal_document
Marque un enregistrement juridique comme « document demandé » avec horodatage. Permet le suivi des demandes de justificatifs.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_legal_id | uuid | ✅ | — | ID de l'enregistrement juridique. |
p_requested_at | timestamptz | ❌ | NOW() | Date/heure de la demande. |
2.13.10 Workflow - Livrer un document : deliver_legal_document
Marque un document comme livré, met à jour le statut de l'enregistrement juridique et associe le document.
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_legal_id | uuid | ✅ | — | ID de l'enregistrement juridique. |
p_document_id | uuid | ✅ | — | ID du document livré. |
p_delivered_at | timestamptz | ❌ | NOW() | Date/heure de livraison. |
p_new_status | text | ❌ | "active" | Nouveau statut après livraison. |
2.13.11 Demandes en attente : get_pending_document_requests_api
Liste les demandes de documents juridiques en attente (document demandé mais pas encore livré).
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ❌ | null | Filtrer par objet (si null, tous les objets). |
p_type_codes | array<text> | ❌ | null | Filtrer par types juridiques. |
Réponse : JSON avec array des demandes en attente.
2.13.12 Visibilité - Documents publics : get_object_public_legal_records
Retourne uniquement les enregistrements juridiques marqués comme publics (visibles par tous).
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'objet. |
Réponse : Table avec enregistrements publics uniquement (ex. certifications affichables).
2.13.13 Visibilité - Documents privés : get_object_private_legal_records
Retourne uniquement les enregistrements juridiques privés (visibles uniquement par l'organisation parente).
| Paramètre | Type | Obligatoire | Défaut | Description |
|---|---|---|---|---|
p_object_id | text | ✅ | — | Identifiant de l'objet. |
Réponse : Table avec enregistrements privés (ex. assurances, licences internes).
Types juridiques prédéfinis : Le système inclut 15+ types juridiques courants : ASSURANCE_RC (assurance responsabilité civile), LICENCE_IV (licence débit de boissons), CERTIF_TOURISME (certificat tourisme), AUTORISATION_ERP, REGISTRE_SURETE, PLAN_EVACUATION, VERIF_ELECTRIQUE, CONTRAT_MAINTENANCE, etc. Consultez ref_legal_type pour la liste complète et leurs paramètres de validité.
2.14 Aliases TEXT (convenience wrappers)
Pour les clients qui ne peuvent pas passer des tableaux d'enums PostgreSQL natifs (object_type[], object_status[]), des alias de fonctions acceptant TEXT[] sont disponibles :
list_object_resources_page_text— alias delist_object_resources_pageavecp_typesetp_statusenTEXT[].list_object_resources_since_fast_text— alias delist_object_resources_since_fastavecp_typesetp_statusenTEXT[].
Ces fonctions convertissent automatiquement les tableaux TEXT en enums correspondants et délèguent aux fonctions principales. Utilisez-les si votre client HTTP/ORM ne supporte pas les types personnalisés PostgreSQL.
3) Dictionnaire de données : contenu d’une ressource
Une ressource (un élément de data[]) est un objet JSON avec des blocs thématiques. Tous les blocs ne sont pas présents pour tous les objets.
3.0 Architecture des données (coulisses PostgreSQL)
Chaque réponse de l’API provient d’un modèle relationnel unifié. Les blocs ci-dessous sont assemblés à partir des tables et vues principales :
- Objets touristiques
object— entité cœur pour tous les types (hébergements, itinéraires, événements, etc.) avec les métadonnées communes (statut, dates de publication, indicateurs d’édition en cours). - Localisation unifiée
object_location— regroupe adresse postale, coordonnées géographiques et rattachements territoriaux viaobject_zone. - Contenus multilingues
object_descriptionet colonnes*_i18n— textes publics, chapôs, infos mobiles stockés soit en JSONB, soit via la table génériquei18n_translationexposée dans les vuesapi.*. - Contacts & médias
contact_channel,media— téléphones, e-mails, réseaux sociaux et ressources médias, y compris les médias spécifiques à un lieu viamedia.place_id. - Référentiels
ref_code,ref_classification_scheme,ref_classification_value— types, labels, classements et tags reliés aux objets parobject_classificationetobject_capacity. - Accessibilité & labels handicap — entrées
object_classificationavecscheme_code = "HANDICAP_LABEL", valeurs et sous-valeurs (subvalue_ids) pour chaque handicap couvert (moteur, visuel, auditif, mental), justificatifs optionnels viaref_document. - Horaires d’ouverture
opening_period,opening_schedule,opening_time_period— structure hiérarchique permettant de décrire des plages complexes et leurs exceptions. - Modération
pending_change,object_version— suivi des propositions de modification et historisation avant/après pour audit. - API JSON — fonctions du schéma
api(ex.api.get_object_resource,api.list_object_resources_page,api.search_objects_by_label) qui orchestrent les blocs ci-dessus.
Les sections du dictionnaire (§3.x) décrivent comment ces blocs sont agrégés pour produire chaque champ. Pour une vision exhaustive, consultez le schéma SQL : schema_unified.sql.
Pour vérifier une connexion précise, ouvrir Connexions par table/vue ou CID, tags et refcodes. La page est régénérée par .tools/python/Scripts/python.exe tools/db-graph/db_graph.py.
3.1 Vue d’ensemble
| Bloc | Type | À quoi ça sert | Exemple |
|---|---|---|---|
id | string | Identifiant unique métier | "OBJ_000123" |
type | enum | Type d’objet (ex. itinéraire) | "ITI" |
status | enum | Statut de publication | "published" |
name | string | Nom affiché | "Boucle des Crêtes" |
region_code | string | Code région/source métier | "FR-ARA" |
created_at / updated_at / updated_at_source / published_at | timestamp | Suivi de vie (technique + source amont) | "2024-03-18T09:30:00Z" |
address | object | Adresse postale (si connue) | { "street": "...", "city": "..." } |
location | object | Position WGS84 | { "latitude": 45.76, "longitude": 4.84, "altitude_m": 250 } |
descriptions | object | Descriptions multilingues enrichies (description, description_adapted, description_chapo, description_mobile, description_edition, description_offre_hors_zone, sanitary_measures) | voir §3.2 |
external_ids | array<object> | Identifiants externes (SIT, DMS…) | [{ "system":"X", "value":"1234" }] |
contacts | array<object> | Moyens de contact enrichis | voir §3.3 |
languages | array<object> | Langues parlées | [{ "code":"fr", "name":"Français" }] |
media | array<object> | Médias publiés | voir §3.5 |
capacity | array<object> | Capacités | voir §3.6 |
amenities | array<object> | Équipements/Services | voir §3.7 |
environment_tags | array<object> | Tags environnement (éco) | voir §3.8 |
payment_methods | array<object> | Moyens de paiement | voir §3.8 |
pet_policy | object | Politique animaux | { "accepted": true, ... } |
prices | array<object> | Tarifs (+ périodes) | voir §3.9 |
classifications | array<object> | Labels/Classements (étoiles hôtels, certifications, etc.) | voir §3.10 |
handicap_labels | array<object> | Labellisation Tourisme & Handicap | voir §3.11 |
tags | array<object> | Tags libres | voir §3.12 |
discounts | array<object> | Réductions et offres spéciales | voir §3.23 |
group_policies | array<object> | Politiques de groupe | voir §3.24 |
origins / org_links | array<object> | Blocs transparents | — |
actors | array<object> | Acteurs (personnes) liés à l'objet | voir §3.25 |
legal_records | array<object> | Enregistrements légaux unifiés | voir §3.26 |
meeting_rooms | array<object> | Salles de réunion | voir §3.13 |
fma / fma_occurrences | array<object> | Occurrences d'événements/activités | — |
opening_times | object | Horaires d'ouverture (structure temporelle) | voir §3.14 |
menus | array<object> | Menus (restaurants/événements) | voir §3.15 |
places | array<object> | Lieux internes | voir §3.16 |
sustainability_action_labels | array<object> | Actions RSE + labels | voir §3.17 |
incoming_relations / outgoing_relations | array<object> | Relations entrantes/sortantes | voir §3.18 |
render | object | Données formatées pour l'affichage | voir §3.27 |
legal_records | array<object> | Enregistrements légaux et certifications | voir §3.26 |
documents | array<object> | Pièces justificatives publiables (référentiel commun) | voir §3.21 |
document_requests | array<object> | Suivi des demandes/remises de documents | voir §3.22 |
associated_restaurants_cuisine_types (si type="FMA") | array<object> | Types de cuisine agrégés via les restaurants liés | voir §3.20 |
itinerary_details (si type="ITI") | object | Détails ITI | voir §3.19 |
itinerary (si type="ITI") | object | Résumé ITI (+ track si demandé) | voir §3.19 |
3.2 descriptions (descriptions multilingues enrichies)
Bloc contenant toutes les descriptions multilingues de l'objet, avec support pour différents contextes d'affichage et mesures sanitaires.
| Champ | Type | Description | Exemple |
|---|---|---|---|
description | string | Description principale multilingue | "Restaurant gastronomique avec vue sur mer..." |
description_adapted | string | [NOUVEAU] Description simplifiée/FALC pour personnes handicapées | "Hôtel simple avec ascenseur et parking réservé." |
description_chapo | string | Chapô/accroche multilingue | "Une expérience culinaire unique..." |
description_mobile | string | Description optimisée pour mobile | "Resto vue mer, spécialités locales" |
description_edition | string | Description pour édition papier | "Établissement familial depuis 1950..." |
description_offre_hors_zone | string | Description pour offres hors zone géographique | "Découvrez nos spécialités créoles..." |
sanitary_measures | string | Mesures sanitaires et protocoles | "Gel hydroalcoolique disponible, masques fournis" |
Tous les champs de description supportent la gestion multilingue via les paramètres p_lang_prefs de l'API. La langue de fallback est le français.
description_mobile : Version courte pour affichage mobile
description_edition : Version pour supports imprimés
description_offre_hors_zone : Version pour communication externe
sanitary_measures : Informations sanitaires obligatoires
3.3 contacts[] (moyens de contact enrichis)
Le bloc contacts[] regroupe tous les moyens de contact disponibles pour un établissement : téléphone, email, site web, réseaux sociaux, etc. Chaque contact inclut des métadonnées pour l'affichage et la priorisation.
| Champ | Type | Description | Exemple |
|---|---|---|---|
kind_code | string | Type de contact (référentiel contact_kind) | "email" |
kind_name | string | Libellé humain du type | "E-mail" |
kind_description | string | Description du type | "Adresse électronique" |
icon_url | string (URL) | Icône du type | "https://cdn.example.com/email.svg" |
value | string | Adresse/numéro/URL de contact | "contact@hotel-exemple.fr" |
is_public | boolean | Visible publiquement ? | true |
is_primary | boolean | Canal prioritaire ? | true |
role | string | Rôle (code : booking, info, …) | "booking" |
position | number | Ordre d'affichage conseillé | 1 |
Types de contacts disponibles
Le système supporte plusieurs types de contacts via le référentiel contact_kind :
| Code | Nom | Description | Format attendu |
|---|---|---|---|
email | Adresse électronique | email@domain.com | |
phone | Téléphone | Numéro de téléphone | +262 262 12 34 56 |
mobile | Mobile | Numéro de mobile | +262 692 12 34 56 |
website | Site web | URL du site internet | https://www.hotel-exemple.fr |
facebook | Page Facebook | https://facebook.com/hotel-exemple | |
instagram | Compte Instagram | https://instagram.com/hotel_exemple | |
whatsapp | Contact WhatsApp | +262 692 12 34 56 | |
booking | Réservation | Lien de réservation | https://booking.com/hotel-exemple |
Exemple concret : Contacts d'un hôtel
{
"contacts": [
{
"kind_code": "phone",
"kind_name": "Téléphone",
"kind_description": "Numéro de téléphone",
"icon_url": "https://cdn.example.com/phone.svg",
"value": "+262 262 12 34 56",
"is_public": true,
"is_primary": true,
"role": "booking",
"position": 1
},
{
"kind_code": "email",
"kind_name": "E-mail",
"kind_description": "Adresse électronique",
"icon_url": "https://cdn.example.com/email.svg",
"value": "contact@hotel-exemple.fr",
"is_public": true,
"is_primary": false,
"role": "info",
"position": 2
},
{
"kind_code": "website",
"kind_name": "Site web",
"kind_description": "Site internet",
"icon_url": "https://cdn.example.com/website.svg",
"value": "https://www.hotel-exemple.fr",
"is_public": true,
"is_primary": false,
"role": "info",
"position": 3
},
{
"kind_code": "whatsapp",
"kind_name": "WhatsApp",
"kind_description": "Contact WhatsApp",
"icon_url": "https://cdn.example.com/whatsapp.svg",
"value": "+262 692 12 34 56",
"is_public": true,
"is_primary": false,
"role": "booking",
"position": 4
}
]
}
Utilisation pratique
Priorité : Affichez d'abord les contacts avec is_primary: true, puis les autres par position.
Types : Utilisez kind_code et kind_name pour identifier le type de contact.
Rôles : Utilisez role (code) pour grouper par usage (booking, info, commercial).
Public : Filtrez avec is_public: true pour n'afficher que les contacts publics.
Dans actors[].contacts[] et les contacts d'organisations, la structure est imbriquée : kind { code, name, description, icon_url } et role { code, name }. Au niveau objet, le bloc contacts[] utilise les champs kind_code/kind_name et un role simple (code).
Les contacts sont vérifiés et validés. Respectez les préférences de contact de l'établissement (horaires, langue, etc.).
3.4 languages[] (langues parlées)
Le bloc languages[] indique les langues parlées par le personnel de l'établissement. Cette information est cruciale pour l'accessibilité et l'expérience client.
| Champ | Type | Description | Exemple |
|---|---|---|---|
code | string | Code ISO 639-1 de la langue | "fr" |
name | string | Nom de la langue | "Français" |
Langues supportées
Le système supporte les principales langues via le référentiel ref_language :
| Code | Nom | Description | Usage typique |
|---|---|---|---|
fr | Français | Langue officielle de La Réunion | Langue principale |
en | Anglais | Langue internationale | Tourisme international |
es | Espagnol | Langue latine | Tourisme hispanophone |
de | Allemand | Langue germanique | Tourisme germanophone |
it | Italien | Langue latine | Tourisme italophone |
pt | Portugais | Langue lusophone | Tourisme brésilien |
zh | Chinois | Langue asiatique | Tourisme chinois |
ja | Japonais | Langue asiatique | Tourisme japonais |
Exemple concret : Langues d'un hôtel
{
"languages": [
{
"code": "fr",
"name": "Français"
},
{
"code": "en",
"name": "Anglais"
},
{
"code": "de",
"name": "Allemand"
},
{
"code": "es",
"name": "Espagnol"
}
]
}
Utilisation pratique
Filtrer par langue : Utilisez p_filters.languages_any: ["fr", "en"] pour trouver les établissements parlant français ou anglais.
Affichage : Affichez les langues disponibles pour informer les clients de l'accessibilité linguistique.
Les langues indiquées correspondent aux capacités réelles du personnel. Vérifiez la disponibilité selon les horaires et les équipes présentes.
3.5 media[] (médias publiés)
Le bloc media[] contient tous les médias publiés associés à l'établissement : photos, vidéos, documents PDF, etc. La réponse n'inclut que les médias publiés.
| Champ | Type | Description | Exemple |
|---|---|---|---|
id | string | Identifiant unique du média | "media_123" |
type_code | string | Type de média (référentiel media_type) | "image" |
type_name | string | Nom du type de média | "Image" |
type_description | string | Description du type de média | "Photos et illustrations" |
icon_url | string (URL) | Icône représentant le type | "https://cdn.example.com/image.svg" |
title | string | Titre/légende du média | "Vue panoramique de l'hôtel" |
credit | string | Crédit photo/vidéo | "© Hôtel Exemple" |
url | string (URL) | URL directe du fichier | "https://cdn.example.com/hotel-view.jpg" |
is_main | boolean | Média principal de l'établissement ? | true |
visibility | string | Niveau de visibilité | "public" |
position | number | Ordre d'affichage | 1 |
width | number | Largeur en pixels (si connue) | 1920 |
height | number | Hauteur en pixels (si connue) | 1080 |
Types de médias disponibles
Le système supporte plusieurs types de médias via le référentiel media_type :
| Code | Nom | Description | Formats typiques |
|---|---|---|---|
image | Image | Photos et illustrations | JPG, PNG, WebP |
video | Vidéo | Vidéos promotionnelles | MP4, WebM |
logo | Logo | Logo de l'établissement | PNG, SVG |
brochure_pdf | Brochure PDF | Documentation imprimable | |
menu_pdf | Menu PDF | Menu au format PDF | |
audio | Audio | Fichiers audio | MP3, WAV |
document | Document | Autres documents | PDF, DOC |
Exemple concret : Médias d'un hôtel
{
"media": [
{
"id": "media_001",
"type_code": "image",
"type_name": "Image",
"icon_url": "https://cdn.example.com/image.svg",
"title": "Vue panoramique de l'hôtel",
"credit": "© Hôtel Exemple",
"url": "https://cdn.example.com/hotel-panorama.jpg",
"is_main": true,
"visibility": "public",
"position": 1,
"width": 1920,
"height": 1080
},
{
"id": "media_002",
"type_code": "video",
"type_name": "Vidéo",
"icon_url": "https://cdn.example.com/video.svg",
"title": "Visite virtuelle de l'hôtel",
"credit": "© Hôtel Exemple",
"url": "https://cdn.example.com/hotel-tour.mp4",
"is_main": false,
"visibility": "public",
"position": 2,
"width": 1920,
"height": 1080
},
{
"id": "media_003",
"type_code": "brochure_pdf",
"type_name": "Brochure PDF",
"icon_url": "https://cdn.example.com/pdf.svg",
"title": "Brochure complète 2024",
"credit": "© Hôtel Exemple",
"url": "https://cdn.example.com/brochure-2024.pdf",
"is_main": false,
"visibility": "public",
"position": 3,
"width": null,
"height": null
}
]
}
Dans menus[].items[].media[], la structure utilise un objet imbriqué media_type { id, code, name } et inclut le champ is_published. Au niveau objet, le bloc media[] expose type_code/type_name et n'inclut pas is_published.
Utilisation pratique
Média principal : Affichez d'abord le média avec is_main: true comme image de couverture.
Tri : Triez par position pour respecter l'ordre souhaité par l'établissement.
Filtrage : Utilisez p_filters.media_types_any: ["image"] pour ne récupérer que les images.
Les médias sont publiés et vérifiés. Respectez les droits d'auteur et les crédits mentionnés. Les URLs sont directes et ne nécessitent pas d'authentification.
3.6 capacity[] (capacités d'accueil)
Le bloc capacity[] définit les capacités d'accueil de l'établissement selon différentes métriques : nombre de lits, couverts, chambres, etc. Ces informations sont essentielles pour la planification et la réservation.
| Champ | Type | Description | Exemple |
|---|---|---|---|
metric_code | string | Code de la métrique (référentiel ref_capacity_metric) | "beds" |
metric_name | string | Nom de la métrique | "Lits" |
icon_url | string (URL) | Icône représentant la métrique | "https://cdn.example.com/bed.svg" |
value | number | Valeur numérique de la capacité | 50 |
unit | string | Unité de mesure (si applicable) | "personnes" |
Métriques de capacité disponibles
Le système supporte plusieurs métriques via le référentiel ref_capacity_metric :
| Code | Nom | Description | Usage typique |
|---|---|---|---|
beds | Lits | Nombre total de lits | Hôtels, gîtes |
rooms | Chambres | Nombre de chambres | Hôtels, meublés |
covers | Couverts | Capacité restaurant | Restaurants, cafés |
seats | Places assises | Places en salle | Restaurants, salles |
max_capacity | Capacité max | Capacité maximale totale | Événements, salles |
parking_spaces | Places parking | Nombre de places de parking | Tous établissements |
pools | Piscines | Nombre de piscines | Hôtels, campings |
tennis_courts | Courts de tennis | Nombre de courts | Complexes sportifs |
Exemple concret : Capacités d'un hôtel
{
"capacity": [
{
"metric_code": "rooms",
"metric_name": "Chambres",
"icon_url": "https://cdn.example.com/room.svg",
"value": 25,
"unit": "chambres"
},
{
"metric_code": "beds",
"metric_name": "Lits",
"icon_url": "https://cdn.example.com/bed.svg",
"value": 50,
"unit": "lits"
},
{
"metric_code": "covers",
"metric_name": "Couverts",
"icon_url": "https://cdn.example.com/restaurant.svg",
"value": 80,
"unit": "couverts"
},
{
"metric_code": "parking_spaces",
"metric_name": "Places parking",
"icon_url": "https://cdn.example.com/parking.svg",
"value": 30,
"unit": "places"
}
]
}
Utilisation pratique
Filtrer par capacité : Utilisez p_filters.capacity_filters: [{"metric": "beds", "min": 20, "max": 100}] pour trouver les établissements avec 20 à 100 lits.
Affichage : Affichez les capacités pertinentes selon le type d'établissement (lits pour hôtels, couverts pour restaurants).
Les capacités indiquent le maximum théorique. La disponibilité réelle dépend des réservations et de la configuration des chambres/salles.
3.7 amenities[] (équipements et services)
Le bloc amenities[] liste tous les équipements et services disponibles dans l'établissement : WiFi, piscine, parking, restaurant, etc. Ces informations sont cruciales pour l'expérience client et les filtres de recherche.
| Champ | Type | Description | Exemple |
|---|---|---|---|
code | string | Code de l'équipement (référentiel amenity) | "WIFI" |
name | string | Nom de l'équipement | "WiFi gratuit" |
icon_url | string (URL) | Icône représentant l'équipement | "https://cdn.example.com/wifi.svg" |
family | object | Famille d'équipements : { code, name, icon_url } | {"code": "connectivity", "name": "Connectivité"} |
Familles d'équipements disponibles
Les équipements sont organisés en familles via le référentiel amenity_family :
| Code | Nom | Description | Équipements typiques |
|---|---|---|---|
connectivity | Connectivité | Services internet et communication | WiFi, 4G, téléphone |
comfort | Confort | Équipements de confort | Climatisation, chauffage, minibar |
outdoor | Extérieur | Espaces et activités extérieures | Piscine, jardin, terrasse |
wellness | Bien-être | Services de bien-être | Spa, sauna, fitness |
dining | Restauration | Services de restauration | Restaurant, bar, petit-déjeuner |
business | Business | Services professionnels | Salle de réunion, photocopieur |
accessibility | Accessibilité | Équipements d'accessibilité | Ascenseur, rampe, chambre adaptée |
transport | Transport | Services de transport | Parking, navette, location vélo |
Équipements populaires
Voici quelques équipements couramment utilisés :
| Code | Nom | Famille | Description |
|---|---|---|---|
WIFI | WiFi gratuit | connectivity | Accès internet sans fil |
PARKING | Parking | transport | Place de stationnement |
POOL | Piscine | outdoor | Bassin de natation |
RESTAURANT | Restaurant | dining | Service de restauration |
AC | Climatisation | comfort | Air conditionné |
SPA | Spa | wellness | Centre de bien-être |
ELEVATOR | Ascenseur | accessibility | Équipement d'accessibilité |
MEETING_ROOM | Salle de réunion | business | Espace de travail |
Exemple concret : Équipements d'un hôtel
{
"amenities": [
{
"code": "WIFI",
"name": "WiFi gratuit",
"icon_url": "https://cdn.example.com/wifi.svg",
"family": {
"code": "connectivity",
"name": "Connectivité",
"icon_url": "https://cdn.example.com/connectivity.svg"
}
},
{
"code": "PARKING",
"name": "Parking",
"icon_url": "https://cdn.example.com/parking.svg",
"family": {
"code": "transport",
"name": "Transport",
"icon_url": "https://cdn.example.com/transport.svg"
}
},
{
"code": "POOL",
"name": "Piscine",
"icon_url": "https://cdn.example.com/pool.svg",
"family": {
"code": "outdoor",
"name": "Extérieur",
"icon_url": "https://cdn.example.com/outdoor.svg"
}
},
{
"code": "RESTAURANT",
"name": "Restaurant",
"icon_url": "https://cdn.example.com/restaurant.svg",
"family": {
"code": "dining",
"name": "Restauration",
"icon_url": "https://cdn.example.com/dining.svg"
}
},
{
"code": "SPA",
"name": "Spa",
"icon_url": "https://cdn.example.com/spa.svg",
"family": {
"code": "wellness",
"name": "Bien-être",
"icon_url": "https://cdn.example.com/wellness.svg"
}
}
]
}
Utilisation pratique
Filtrer par équipements : Utilisez p_filters.amenities_any: ["WIFI", "POOL"] pour trouver les établissements avec WiFi et piscine.
Filtrer par famille : Utilisez p_filters.amenity_families_any: ["wellness", "outdoor"] pour les équipements de bien-être et extérieurs.
Affichage : Groupez par family pour une meilleure organisation visuelle.
Les équipements indiqués sont disponibles sur place. Vérifiez les conditions d'accès (horaires, restrictions, coûts supplémentaires) directement avec l'établissement.
3.8 environment_tags[] & payment_methods[] (tags environnementaux et moyens de paiement)
Ces deux blocs partagent la même structure simple mais servent des objectifs différents : environment_tags[] décrit l'environnement de l'établissement, tandis que payment_methods[] liste les moyens de paiement acceptés.
Structure commune
| Champ | Type | Description | Exemple |
|---|---|---|---|
code | string | Code de référence | "beach" |
name | string | Nom affiché | "Plage" |
icon_url | string (URL) | Icône représentative | "https://cdn.example.com/beach.svg" |
Tags environnementaux disponibles
Le système supporte plusieurs tags environnementaux via le référentiel environment_tag :
Liste canonique générée : environment_tag dans CID, tags et refcodes. Les lignes ci-dessous restent des exemples de lecture courante.
| Code | Nom | Description | Usage typique |
|---|---|---|---|
beach | Plage | Proximité de la plage | Hôtels côtiers |
mountain | Montagne | Environnement montagnard | Gîtes, refuges |
forest | Forêt | Proximité de forêts | Campings, gîtes |
city_center | Centre-ville | En centre-ville | Hôtels urbains |
heritage | Patrimoine | Proche de sites patrimoniaux | Hôtels historiques |
volcano | Volcan | Proximité volcanique | Spécifique à La Réunion |
lagoon | Lagon | Proximité du lagon | Hôtels tropicaux |
garden | Jardin | Jardin privé | Gîtes, maisons d'hôte |
Moyens de paiement disponibles
Le système supporte plusieurs moyens de paiement via le référentiel payment_method :
Liste canonique générée : payment_method dans CID, tags et refcodes. Les lignes ci-dessous restent des exemples de lecture courante.
| Code | Nom | Description | Usage typique |
|---|---|---|---|
cash | Espèces | Paiement en liquide | Petits établissements |
card | Carte bancaire | Paiement par carte | Standard |
check | Chèque | Paiement par chèque | Réservations longues |
transfer | Virement | Virement bancaire | Groupes, entreprises |
paypal | PayPal | Paiement en ligne | Réservations web |
apple_pay | Apple Pay | Paiement mobile Apple | Clients Apple |
google_pay | Google Pay | Paiement mobile Google | Clients Android |
voucher | Bon cadeau | Paiement par bon | Offres spéciales |
Exemple concret : Hôtel côtier
{
"environment_tags": [
{
"code": "beach",
"name": "Plage",
"icon_url": "https://cdn.example.com/beach.svg"
},
{
"code": "lagoon",
"name": "Lagon",
"icon_url": "https://cdn.example.com/lagoon.svg"
},
{
"code": "volcano",
"name": "Volcan",
"icon_url": "https://cdn.example.com/volcano.svg"
}
],
"payment_methods": [
{
"code": "card",
"name": "Carte bancaire",
"icon_url": "https://cdn.example.com/card.svg"
},
{
"code": "cash",
"name": "Espèces",
"icon_url": "https://cdn.example.com/cash.svg"
},
{
"code": "paypal",
"name": "PayPal",
"icon_url": "https://cdn.example.com/paypal.svg"
}
]
}
Utilisation pratique
Filtrer par environnement : Utilisez p_filters.environment_tags_any: ["beach", "mountain"] pour trouver les établissements en bord de plage ou en montagne.
Filtrer par paiement : Utilisez p_filters.payment_methods_any: ["card", "paypal"] pour les établissements acceptant carte ou PayPal.
Affichage : Affichez les tags environnementaux pour l'orientation géographique et les moyens de paiement pour la planification.
Les moyens de paiement indiqués sont généralement acceptés. Vérifiez les conditions spécifiques (montants minimums, devises, etc.) directement avec l'établissement.
3.9 prices[] (tarification complexe avec périodes)
Le bloc prices[] gère la tarification complexe des établissements avec des prix variables selon les périodes, les types de clients, et les unités de facturation. Il supporte les fourchettes de prix, les conditions spéciales, et les créneaux horaires détaillés.
Structure principale d'un tarif
| Champ | Type | Description | Exemple |
|---|---|---|---|
kind | object | Type de tarif enrichi : { id, code, name, position, icon_url } | {"code": "adult", "name": "Adulte"} |
unit | object | Unité enrichie : { id, code, name, position, icon_url } | {"code": "per_night", "name": "Par nuit"} |
amount | number | Montant de base (optionnel si fourchette) | 120.00 |
amount_max | number | Montant maximum (pour fourchettes de prix) | 180.00 |
currency | string | Devise (ISO 4217) | "EUR" |
valid_from | date | Date de début de validité du tarif | "2024-01-01" |
valid_to | date | Date de fin de validité du tarif | "2024-12-31" |
conditions | string | Conditions, notes, restrictions | "Petit-déjeuner inclus" |
periods | array<object> | Périodes détaillées imbriquées | Voir structure ci-dessous |
Types de tarifs disponibles
Le système supporte plusieurs types de tarifs via le référentiel price_kind :
| Code | Nom | Description | Usage typique |
|---|---|---|---|
adult | Adulte | Tarif adulte standard | Hôtels, restaurants |
child | Enfant | Tarif enfant (généralement réduit) | Hôtels, activités |
senior | Sénior | Tarif senior (généralement réduit) | Hôtels, musées |
group | Groupe | Tarif de groupe (généralement réduit) | Hôtels, restaurants |
package | Forfait | Forfait tout inclus | Hôtels, agences |
student | Étudiant | Tarif étudiant | Musées, activités |
free | Gratuit | Accès gratuit | Musées, parcs |
local | Résident | Tarif résident local | Activités, parcs |
Unités de tarification disponibles
Le système supporte plusieurs unités via le référentiel price_unit :
| Code | Nom | Description | Usage typique |
|---|---|---|---|
per_night | Par nuit | Tarif par nuitée | Hôtels, gîtes |
per_person | Par personne | Tarif par personne | Restaurants, activités |
per_group | Par groupe | Tarif forfaitaire groupe | Guides, activités |
per_entry | Par entrée | Tarif d'entrée unique | Musées, parcs |
per_hour | Par heure | Tarif horaire | Location, services |
per_day | Par jour | Tarif journalier | Location véhicules |
per_week | Par semaine | Tarif hebdomadaire | Location longue durée |
per_month | Par mois | Tarif mensuel | Location très longue durée |
Périodes imbriquées (periods[])
Chaque tarif peut avoir des périodes spécifiques avec des créneaux horaires et des conditions particulières :
| Champ | Type | Description | Exemple |
|---|---|---|---|
id | string | Identifiant unique de la période | "uuid-period-1" |
start_date | date | Date de début de la période | "2024-07-01" |
end_date | date | Date de fin de la période | "2024-08-31" |
start_time | time | Heure de début (format HH:MM) | "15:00" |
end_time | time | Heure de fin (format HH:MM) | "11:00" |
note | string | Note spécifique à la période | "Haute saison" |
Exemple concret : Tarification hôtel complexe
{
"prices": [
{
"kind": {
"id": "uuid-kind-1",
"code": "adult",
"name": "Adulte",
"position": 1,
"icon_url": "https://cdn.example.com/adult.svg"
},
"unit": {
"id": "uuid-unit-1",
"code": "per_night",
"name": "Par nuit",
"position": 1,
"icon_url": "https://cdn.example.com/night.svg"
},
"amount": 120.00,
"amount_max": null,
"currency": "EUR",
"valid_from": "2024-01-01",
"valid_to": "2024-12-31",
"conditions": "Petit-déjeuner inclus, TVA comprise",
"periods": [
{
"id": "uuid-period-1",
"start_date": "2024-07-01",
"end_date": "2024-08-31",
"start_time": "15:00",
"end_time": "11:00",
"note": "Haute saison - Prix majoré"
},
{
"id": "uuid-period-2",
"start_date": "2024-09-01",
"end_date": "2024-10-31",
"start_time": "16:00",
"end_time": "10:00",
"note": "Saison intermédiaire"
}
]
},
{
"kind": {
"id": "uuid-kind-2",
"code": "child",
"name": "Enfant",
"position": 2,
"icon_url": "https://cdn.example.com/child.svg"
},
"unit": {
"id": "uuid-unit-1",
"code": "per_night",
"name": "Par nuit",
"position": 1,
"icon_url": "https://cdn.example.com/night.svg"
},
"amount": 60.00,
"amount_max": null,
"currency": "EUR",
"valid_from": "2024-01-01",
"valid_to": "2024-12-31",
"conditions": "Enfant de 3 à 12 ans, petit-déjeuner inclus",
"periods": []
},
{
"kind": {
"id": "uuid-kind-3",
"code": "group",
"name": "Groupe",
"position": 3,
"icon_url": "https://cdn.example.com/group.svg"
},
"unit": {
"id": "uuid-unit-2",
"code": "per_person",
"name": "Par personne",
"position": 2,
"icon_url": "https://cdn.example.com/person.svg"
},
"amount": 80.00,
"amount_max": 100.00,
"currency": "EUR",
"valid_from": "2024-01-01",
"valid_to": "2024-12-31",
"conditions": "Minimum 10 personnes, petit-déjeuner inclus",
"periods": []
}
]
}
Utilisation pratique
Prix fixe : Utilisez amount quand le prix est fixe.
Fourchette : Utilisez amount et amount_max pour les fourchettes de prix.
Périodes : Vérifiez les periods[] pour les tarifs saisonniers et les créneaux horaires.
Conditions : Affichez les conditions pour informer les clients des inclusions/exclusions.
Les prix indiqués sont indicatifs et peuvent varier selon la disponibilité, les promotions, et les conditions particulières. Vérifiez toujours les prix finaux lors de la réservation.
3.10 classifications[] (labels, classements, certifications)
Le bloc classifications[] regroupe tous les labels, classements et certifications attribués à un objet touristique. C'est ici que sont stockées les étoiles d'hôtel, les labels environnementaux, les certifications d'accessibilité et autres reconnaissances officielles.
| Champ | Type | Description | Exemple |
|---|---|---|---|
scheme | string | Code du schéma de classification | "hot_stars" |
scheme_name | string | Nom du schéma/organisme | "Classement hôtelier" |
value | string | Code de la valeur/grade | "4" |
value_name | string | Libellé de la valeur | "4 étoiles" |
awarded_at | date | Date d'obtention | "2024-01-15" |
valid_until | date | Date d'expiration (si applicable) | "2025-01-15" |
status | enum | Statut de la classification | "active" |
Types de classifications disponibles
Le système supporte plusieurs types de classifications via le référentiel ref_classification_scheme :
| Code | Nom | Description | Valeurs possibles |
|---|---|---|---|
hot_stars | Classement hôtelier | Étoiles officielles hôtels | 1 à 5 étoiles |
camp_stars | Classement camping | Étoiles officielles campings | 1 à 5 étoiles |
meuble_stars | Classement meublés | Étoiles meublés de tourisme | 1 à 5 étoiles |
gites_epics | Gîtes de France (épis) | Niveau Gîtes de France | 1 à 5 épis |
clevacances_keys | Clévacances (clés) | Niveau Clévacances | 1 à 5 clés |
green_key | La Clef Verte | Label environnemental | Certifié / Non certifié |
eu_ecolabel | Écolabel Européen | Label environnemental UE | Certifié / Non certifié |
tourisme_handicap | Tourisme & Handicap | Accessibilité (multi-sélection) | Moteur, Visuel, Auditif, Mental |
Exemple concret : Hôtel 4 étoiles
{
"classifications": [
{
"scheme": "hot_stars",
"scheme_name": "Classement hôtelier",
"value": "4",
"value_name": "4 étoiles",
"awarded_at": "2024-01-15",
"valid_until": "2025-01-15",
"status": "active"
},
{
"scheme": "green_key",
"scheme_name": "La Clef Verte",
"value": "certified",
"value_name": "Certifié",
"awarded_at": "2024-03-01",
"valid_until": "2025-03-01",
"status": "active"
}
]
}
Utilisation pratique
Filtrer par étoiles : Utilisez p_filters.classifications_any: ["hot_stars:4"] pour trouver les hôtels 4 étoiles.
Filtrer par label : Utilisez p_filters.classifications_any: ["green_key:certified"] pour les établissements écolabellisés.
Les classifications sont officielles et vérifiées. Elles ne peuvent être modifiées que par les organismes compétents via le système de gestion des labels.
3.11 handicap_labels[] (accessibilité)
Expose la labellisation « Tourisme & Handicap » pour chaque objet. Les entrées sont issues de object_classification avec le schéma HANDICAP_LABEL, les sous-valeurs (subvalue_ids) représentant les handicaps couverts.
| Champ | Type | Description |
|---|---|---|
scheme | object | { code, name } — devrait valoir HANDICAP_LABEL / « Tourisme & Handicap ». |
value | object | Niveau obtenu { code, name, position } (ex. « Labellisé 4 handicaps »). |
dimensions[] | array<object> | Handicaps couverts (moteur, visuel, auditif, mental) résolus depuis subvalue_ids. |
awarded_at / valid_until | date | Dates d’obtention et d’échéance. |
status | enum | requested, granted, suspended, expired (suivi cycle de vie). |
document | object | null | Justificatif { id, title, url } référencé via ref_document. |
source / note | string | null | Métadonnées internes optionnelles. |
{
"handicap_labels": [
{
"scheme": { "code": "HANDICAP_LABEL", "name": "Tourisme & Handicap" },
"value": { "code": "th_level_4", "name": "Labellisé 4 handicaps", "position": 4 },
"dimensions": [
{ "code": "HANDICAP_MOTOR", "name": "Moteur" },
{ "code": "HANDICAP_VISUAL", "name": "Visuel" },
{ "code": "HANDICAP_AUDITORY", "name": "Auditif" },
{ "code": "HANDICAP_MENTAL", "name": "Mental" }
],
"awarded_at": "2023-06-15",
"valid_until": "2026-06-14",
"status": "granted",
"document": { "id": "uuid-doc-1", "title": "Attestation 2023", "url": "https://…/attestation.pdf" },
"note": "Renouvellement 2023"
}
]
}
3.12 tags[] (étiquettes thématiques)
Le bloc tags[] contient des étiquettes thématiques personnalisées pour caractériser l'établissement : "romantique", "familial", "luxe", "authentique", etc. Ces tags permettent un filtrage et une catégorisation fine des établissements.
Liste canonique générée : ref_tag dans CID, tags et refcodes. Les exemples ci-dessous documentent le format de réponse, pas une liste exhaustive.
| Champ | Type | Description | Exemple |
|---|---|---|---|
slug | string | Identifiant lisible (URL-friendly) | "romantique" |
name | string | Libellé affiché | "Romantique" |
color | string | Couleur d'affichage (CSS/hex) | "#FF6B6B" |
icon | string | Nom/code de l'icône | "heart" |
icon_url | string (URL) | URL de l'icône | "https://cdn.example.com/heart.svg" |
Types de tags populaires
Voici quelques exemples de tags couramment utilisés :
| Slug | Nom | Description | Couleur typique |
|---|---|---|---|
romantique | Romantique | Idéal pour couples | #FF6B6B (rose) |
familial | Familial | Adapté aux familles | #4ECDC4 (turquoise) |
luxe | Luxe | Établissement haut de gamme | #FFD93D (doré) |
authentique | Authentique | Expérience locale authentique | #6BCF7F (vert) |
ecologique | Écologique | Engagement environnemental | #4D96FF (bleu) |
historique | Historique | Patrimoine historique | #8B4513 (marron) |
moderne | Moderne | Design contemporain | #9B59B6 (violet) |
tranquille | Tranquille | Environnement calme | #95A5A6 (gris) |
Exemple concret : Tags d'un hôtel de charme
{
"tags": [
{
"slug": "romantique",
"name": "Romantique",
"color": "#FF6B6B",
"icon": "heart",
"icon_url": "https://cdn.example.com/heart.svg"
},
{
"slug": "authentique",
"name": "Authentique",
"color": "#6BCF7F",
"icon": "leaf",
"icon_url": "https://cdn.example.com/leaf.svg"
},
{
"slug": "historique",
"name": "Historique",
"color": "#8B4513",
"icon": "castle",
"icon_url": "https://cdn.example.com/castle.svg"
},
{
"slug": "tranquille",
"name": "Tranquille",
"color": "#95A5A6",
"icon": "peace",
"icon_url": "https://cdn.example.com/peace.svg"
}
]
}
Utilisation pratique
Filtrer par tags : Utilisez p_filters.tags_any: ["romantique", "luxe"] pour trouver les établissements romantiques ou de luxe.
Affichage : Affichez les tags avec leurs couleurs et icônes pour une identification visuelle rapide.
Recherche : Utilisez les slug pour les URLs et la recherche textuelle.
Les tags sont subjectifs et qualitatifs. Ils reflètent l'ambiance et le positionnement de l'établissement plutôt que des caractéristiques objectives mesurables.
3.13 meeting_rooms[] (salles de réunion et équipements)
Le bloc meeting_rooms[] décrit les salles de réunion, de conférence et d'événements disponibles dans l'établissement, avec leurs capacités selon différents formats d'organisation et leurs équipements techniques.
Structure d'une salle de réunion
| Champ | Type | Description | Exemple |
|---|---|---|---|
name | string | Nom de la salle | "Salle des Palmiers" |
surface | number | Surface en m² | 120 |
cap_theatre | number | Capacité en format théâtre | 80 |
cap_u | number | Capacité en format U | 24 |
cap_classroom | number | Capacité en format classe | 40 |
cap_boardroom | number | Capacité en format conseil | 16 |
cap_cocktail | number | Capacité en format cocktail | 100 |
cap_banquet | number | Capacité en format banquet | 60 |
equipment | array<object> | Équipements disponibles | Voir structure ci-dessous |
Formats de salle expliqués
Les différentes capacités correspondent aux formats d'organisation d'événements :
| Format | Description | Usage typique | Densité |
|---|---|---|---|
cap_theatre | Théâtre (toutes les chaises face à la scène) | Présentations, conférences | La plus élevée |
cap_classroom | Classe (tables individuelles face à l'avant) | Formations, cours | Élevée |
cap_u | U (tables en forme de U) | Réunions interactives | Moyenne |
cap_boardroom | Conseil (table rectangulaire) | Réunions de direction | Faible |
cap_cocktail | Cocktail (debout, circulation libre) | Réseautage, apéritifs | Très élevée |
cap_banquet | Banquet (tables rondes) | Repas, galas | Moyenne |
Équipements disponibles
Le système supporte plusieurs types d'équipements via le référentiel meeting_equipment :
| Code | Nom | Description | Usage typique |
|---|---|---|---|
projector | Vidéoprojecteur | Projection d'écran | Présentations |
screen | Écran de projection | Écran fixe ou mobile | Présentations |
sound_system | Système audio | Sonorisation | Conférences |
microphone | Microphone | Micro fixe ou mobile | Présentations |
whiteboard | Tableau blanc | Tableau effaçable | Formations |
flipchart | Paperboard | Tableau à feuilles | Brainstorming |
wifi | WiFi | Accès internet | Connectivité |
air_conditioning | Climatisation | Contrôle température | Confort |
natural_light | Éclairage naturel | Fenêtres, lumière du jour | Confort |
catering | Restauration | Service traiteur | Événements |
Exemple concret : Salle de conférence
{
"meeting_rooms": [
{
"name": "Salle des Palmiers",
"surface": 120,
"cap_theatre": 80,
"cap_u": 24,
"cap_classroom": 40,
"cap_boardroom": 16,
"cap_cocktail": 100,
"cap_banquet": 60,
"equipment": [
{
"code": "projector",
"name": "Vidéoprojecteur",
"icon_url": "https://cdn.example.com/projector.svg"
},
{
"code": "screen",
"name": "Écran de projection",
"icon_url": "https://cdn.example.com/screen.svg"
},
{
"code": "sound_system",
"name": "Système audio",
"icon_url": "https://cdn.example.com/sound.svg"
},
{
"code": "wifi",
"name": "WiFi",
"icon_url": "https://cdn.example.com/wifi.svg"
},
{
"code": "air_conditioning",
"name": "Climatisation",
"icon_url": "https://cdn.example.com/ac.svg"
}
]
}
]
}
Utilisation pratique
Capacité : Choisissez le format selon le type d'événement (théâtre pour présentation, U pour réunion interactive).
Équipements : Vérifiez la disponibilité des équipements nécessaires (projecteur, son, etc.).
Surface : Considérez l'espace nécessaire pour la circulation et les équipements.
Les capacités indiquées sont théoriques. La capacité réelle peut varier selon la configuration, les équipements, et les normes de sécurité en vigueur.
3.14 opening_times
Structure d'horaires d'ouverture organisée en deux groupes temporels :
| Champ | Type | Description |
|---|---|---|
PeriodeOuvertures | array<object> | Périodes d'ouverture pour l'année courante et suivante |
PeriodeOuverturesAnneeSuivantes | array<object> | Périodes d'ouverture pour les années suivantes |
Structure d'une période d'ouverture
| Champ | Type | Description |
|---|---|---|
ID | string | Identifiant unique de la période |
Ordre | number | Ordre d'affichage |
SyndicObjectId | string | Identifiant de l'objet |
Datedebut | date | Date de début de la période |
Datefin | date | Date de fin de la période |
Joursfermeture | array<string> | Jours de fermeture (codes des jours) |
[jour]heuredebut1/2 | string | Heures de début des créneaux (ex. "lundiheuredebut1") |
[jour]heurefin1/2 | string | Heures de fin des créneaux (ex. "lundiheurefin1") |
Jours de la semaine
Pour chaque jour (lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche), jusqu'à 2 créneaux horaires peuvent être définis :
[jour]heuredebut1/[jour]heurefin1: Premier créneau[jour]heuredebut2/[jour]heurefin2: Deuxième créneau (optionnel)
{
"PeriodeOuvertures": [
{
"ID": "uuid-period-1",
"Ordre": 1,
"SyndicObjectId": "OBJ_001",
"Datedebut": "2024-01-01",
"Datefin": "2024-12-31",
"Joursfermeture": [],
"lundiheuredebut1": "09:00",
"lundiheurefin1": "18:00",
"mardiheuredebut1": "09:00",
"mardiheurefin1": "18:00",
"mercrediheuredebut1": "09:00",
"mercrediheurefin1": "12:00",
"mercrediheuredebut2": "14:00",
"mercrediheurefin2": "18:00",
"dimancheheuredebut1": null,
"dimancheheurefin1": null
}
],
"PeriodeOuverturesAnneeSuivantes": []
}
3.15 menus[] (restaurants/événements)
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant du menu |
name | string | Nom du menu (ex. "Menu déjeuner") |
description | string | Description du menu |
position | number | Ordre d'affichage |
is_active | boolean | Menu actif ? |
valid_from / valid_to | date | Période de validité |
items[] | array<object> | Articles du menu |
Articles de menu (items[])
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant de l'article |
name | string | Nom du plat |
description | string | Description du plat |
position | number | Ordre dans le menu |
price_amount / price_amount_max | number | Prix (ou fourchette) |
price_currency | string | Devise (ex. "EUR") |
category | object | { id, code, name } (ex. "Entrée", "Plat principal") |
unit | object | { id, code, name } (ex. "par personne", "par portion") |
dietary_tags[] | array<object> | Tags alimentaires (végétarien, vegan, halal...) |
allergens[] | array<object> | Allergènes (gluten, arachides, lait...) |
media[] | array<object> | Médias associés au plat (photos, vidéos...) |
Tags & Allergènes : structure { id, code, name, icon_url }
Médias des articles (media[])
Chaque article de menu peut avoir des médias associés (photos, vidéos, etc.) via la table de liaison object_menu_item_media.
| Champ | Type | Description | Exemple |
|---|---|---|---|
id | string | Identifiant du média | "media_123" |
title | string | Titre du média | "Photo du plat principal" |
description | string | Description du média | "Vue rapprochée du plat" |
url | string (URL) | URL du fichier média | "https://cdn.example.com/plat.jpg" |
credit | string | Crédit photo/vidéo | "© Restaurant XYZ" |
width / height | number | Dimensions (si connues) | 1920, 1080 |
is_main | boolean | Média principal de l'article ? | true |
is_published | boolean | Média publié ? | true |
position | number | Ordre d'affichage | 1 |
media_type | object | Type de média | { "id": "1", "code": "image", "name": "Image" } |
Les médias sont triés par position puis par created_at. Seuls les médias avec is_published: true sont inclus.
3.16 places[] (+ descriptions[])
Colonnes du lieu (id, nom, position, …).
descriptions[] : multilingue — structure transparente (ex. language, text, position, …).
3.17 sustainability_action_labels[]
Associe les actions de durabilité et les labels obtenus.
| Champ | Type | Description |
|---|---|---|
object_action_id | string | Identifiant de l’action |
action | object | { code, label, description, icon_url, category{…}, position } |
label | object | { scheme_code, scheme_name, value_code, value_name, awarded_at, valid_until, status } |
3.18 incoming_relations[] & outgoing_relations[]
Les relations sont exposées par sens pour plus de clarté : outgoing_relations[] (liens sortants) et incoming_relations[] (liens entrants). Chaque entrée fournit le type de relation et les métadonnées nécessaires.
- outgoing_relations[] : l'objet courant pointe vers une autre ressource exposée sous
target: { id, type, name }. - incoming_relations[] : une autre ressource référence l'objet courant, exposée sous
source: { id, type, name }.
Chaque enregistrement conserve les métadonnées du lien (id, relation_type_id, distance_m, note, position, created_at, updated_at) et ajoute le nœud opposé déjà résolu (target ou source).
Pour interpréter le type de relation, mappez relation_type_id avec la table de référence ref_object_relation_type (code, libellé, description). Les champs distance_m et note restent optionnels et peuvent être utilisés pour afficher une distance ou un commentaire éditorial.
{
"outgoing_relations": [
{
"id": "uuid-relation-1",
"relation_type_id": "uuid-type-restaurant",
"position": 1,
"note": null,
"distance_m": 120.0,
"created_at": "2024-03-12T09:15:00Z",
"updated_at": "2024-03-12T09:15:00Z",
"target": { "id": "RES-001", "type": "RES", "name": "Restaurant Chez Léon" }
}
],
"incoming_relations": [
{
"id": "uuid-relation-2",
"relation_type_id": "uuid-type-managed-by",
"position": 1,
"note": null,
"distance_m": null,
"created_at": "2024-03-12T09:15:00Z",
"updated_at": "2024-03-12T09:15:00Z",
"source": { "id": "ORG-456", "type": "ORG", "name": "Organisation Parent" }
}
]
}
Les objets liés ne sont pas étendus : interrogez séparément l'identifiant fourni si vous avez besoin de leurs contacts, adresses ou médias.
Cas d'usage : un objet « Restaurant » rattaché à un « Hôtel » aura un enregistrement dans outgoing_relations[] pointant vers l'hôtel. Inversement, l'hôtel verra ce restaurant apparaître dans incoming_relations[].
3.19 discounts[]
Liste des réductions et offres spéciales proposées par l'objet.
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant unique de la réduction |
name | string | Nom de l'offre |
description | string | Description détaillée |
discount_percent | number | Pourcentage de réduction (0-100) |
discount_amount | number | Montant de réduction fixe |
currency | string | Devise (ISO 4217) |
conditions | string | Conditions d'application |
valid_from / valid_to | date | Période de validité |
is_active | boolean | Offre active ? |
position | number | Ordre d'affichage |
{
"discounts": [
{
"id": "discount-1",
"name": "Réduction séniors",
"description": "10% de réduction pour les plus de 65 ans",
"discount_percent": 10.0,
"discount_amount": null,
"currency": "EUR",
"conditions": "Sur présentation d'une pièce d'identité",
"valid_from": "2024-01-01",
"valid_to": "2024-12-31",
"is_active": true,
"position": 1
}
]
}
3.20 group_policies[]
Politiques et conditions spécifiques aux groupes.
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant unique de la politique |
name | string | Nom de la politique |
description | string | Description détaillée |
min_size | number | Taille minimale du groupe |
max_size | number | Taille maximale du groupe |
notes | string | Notes et conditions particulières |
is_active | boolean | Politique active ? |
position | number | Ordre d'affichage |
{
"group_policies": [
{
"id": "policy-1",
"name": "Groupes scolaires",
"description": "Tarifs préférentiels pour les groupes scolaires",
"min_size": 15,
"max_size": 50,
"notes": "Réservation obligatoire 48h à l'avance",
"is_active": true,
"position": 1
}
]
}
3.21 actors[]
Acteurs (personnes physiques) liés à l'objet avec leurs rôles et contacts. Important : Les rôles sont définis par le référentiel ref_actor_role qui détermine les codes et libellés des fonctions (director, receptionist, guide, etc.).
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant unique de l'acteur |
display_name | string | Nom d'affichage complet |
first_name | string | Prénom |
last_name | string | Nom de famille |
gender | enum | Genre (M, F, O) |
role | object | Rôle de l'acteur : { id, code, name } - Le code correspond à ref_actor_role.code |
is_primary | boolean | Acteur principal ? |
valid_from / valid_to | date | Période de validité du rôle |
visibility | enum | Visibilité (public, private) |
note | string | Note ou commentaire |
contacts | array<object> | Canaux de contact de l'acteur |
Rôles d'acteurs (ref_actor_role)
Le champ role.code fait référence au référentiel ref_actor_role qui définit les types de rôles disponibles dans le système.
| Code | Libellé | Description | Usage typique |
|---|---|---|---|
director | Directeur | Responsable de l'établissement | Hôtels, restaurants, attractions |
receptionist | Réceptionniste | Accueil et service client | Hôtels, offices de tourisme |
guide | Guide | Guide touristique ou accompagnateur | Agences, sites touristiques |
manager | Gestionnaire | Responsable opérationnel | Établissements divers |
chef | Chef | Chef de cuisine | Restaurants, hôtels |
owner | Propriétaire | Propriétaire de l'établissement | Petits commerces, gîtes |
Le référentiel ref_actor_role est consultable via l'API pour obtenir la liste complète des rôles disponibles et leurs libellés multilingues.
{
"actors": [
{
"id": "actor-123",
"display_name": "Marie Martin",
"first_name": "Marie",
"last_name": "Martin",
"gender": "F",
"role": {
"id": "role-director",
"code": "director",
"name": "Directeur"
},
"is_primary": true,
"valid_from": "2024-01-01",
"valid_to": "2024-12-31",
"visibility": "public",
"note": "Responsable principal",
"contacts": [
{
"id": "contact-1",
"kind": {
"code": "email",
"name": "Email"
},
"value": "marie.martin@hotel.com",
"is_primary": true,
"role": {
"code": "work",
"name": "Professionnel"
}
}
]
}
]
}
3.22 legal_records[]
Enregistrements légaux et certifications officielles de l'établissement.
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant unique de l'enregistrement |
type | object | Type de document : { id, code, name, category } |
value | string | Valeur du document (numéro, référence) |
status | enum | Statut (active, expired, pending, suspended) |
valid_from / valid_to | date | Période de validité |
validity_mode | enum | Mode de validité (fixed_end_date, tacit_renewal, forever) |
issuer | string | Organisme émetteur |
document | object | Justificatif : { id, url, title, visibility } |
notes | string | Notes et commentaires |
created_at / updated_at | timestamp | Horodatage |
{
"legal_records": [
{
"id": "legal-1",
"type": {
"id": "type-siret",
"code": "SIRET",
"name": "SIRET",
"category": "business"
},
"value": "12345678901234",
"status": "active",
"valid_from": "2024-01-01",
"valid_to": null,
"validity_mode": "forever",
"issuer": "INSEE",
"document": {
"id": "doc-1",
"url": "https://.../siret.pdf",
"title": "Extrait SIRET",
"visibility": "private"
},
"notes": "Mise à jour 2024",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}
]
}
3.23 render (données formatées)
Bloc contenant des données formatées prêtes à l'affichage, généré quand p_options.render: true.
| Champ | Type | Description |
|---|---|---|
lang | string | Code langue (ex. "fr") |
locale | string | Locale complète (ex. "fr-FR") |
timezone | string | Fuseau horaire (ex. "UTC") |
version | string | Version du formatage (ex. "1.0") |
contact_lines | array<string> | Lignes de contact formatées |
media_lines | array<string> | Lignes de médias formatées |
capacity_lines | array<string> | Lignes de capacité formatées |
amenity_lines | array<string> | Lignes d'équipements formatées |
price_lines | array<string> | Lignes de tarifs formatées |
classification_lines | array<string> | Lignes de classements formatées |
discount_lines | array<string> | Lignes de réductions formatées |
group_policy_lines | array<string> | Lignes de politiques de groupe formatées |
actor_lines | array<string> | Lignes d'acteurs formatées |
legal_record_lines | array<string> | Lignes d'enregistrements légaux formatées |
menu_item_lines | array<string> | Lignes d'articles de menu formatées |
{
"render": {
"lang": "fr",
"locale": "fr-FR",
"timezone": "UTC",
"version": "1.0",
"contact_lines": [
"Téléphone : +262 123 456 789",
"Email : contact@hotel.com"
],
"media_lines": [
"Photo principale : Vue de la plage",
"Vidéo : Présentation de l'hôtel"
],
"capacity_lines": [
"Chambres : 42",
"Lits : 84"
],
"amenity_lines": [
"Piscine, WiFi, Parking"
],
"price_lines": [
"Adulte - Par nuit : 120,00 €",
"Enfant - Par nuit : 60,00 €"
]
}
}
3.24 Spécifique Itinéraire (type="ITI")
itinerary_details
info: méta (ex. conseils, profils altimétriques détaillés…)profiles[]: variantes / tronçons alternatifspractices[]: { code, name, icon_url } (ex. "hiking", "mtb")sections[]: segments/tronçonsstages[]: étapes (avec leur propremedia[])associated_objects[]: voir ci-dessous pour la structure détaillée
associated_objects[]
Liste les ressources liées à l’itinéraire (hébergements, points d’intérêt, services…) avec le rôle attribué dans l’étape de production.
| Champ | Type | Description |
|---|---|---|
associated_object_id | string | Identifiant de l’objet lié (identique à target.id, conservé pour compatibilité) |
target | object | null | { id, type, name } résolu automatiquement ; peut être null si l’objet n’est plus publié |
role_id | uuid | Rôle éditorial attribué (mapper via ref_iti_assoc_role pour récupérer code/libellé) |
note | string | null | Commentaire libre (ex. conseil d’étape) |
created_at | timestamp | Date de création du lien |
updated_at | timestamp | Dernière mise à jour du lien |
Les éléments sont triés par nom d’objet puis date de création. Si l’objet cible a été supprimé, target vaut null mais l’identifiant brut reste disponible pour diagnostic.
Le référentiel ref_iti_assoc_role expose les colonnes { id, code, name, description, position } : utilisez-le pour afficher un libellé utilisateur.
"associated_objects": [
{
"associated_object_id": "LODGE-42",
"role_id": "0ab5d76a-55f9-4bdc-9219-6a962fbf9c5d",
"note": "Hébergement recommandé pour la nuit 2",
"created_at": "2024-05-06T08:12:11Z",
"updated_at": "2024-05-14T10:33:02Z",
"target": { "id": "LODGE-42", "type": "HOT", "name": "Lodge des Cimes" }
}
]
itinerary
| Champ | Type | Description |
|---|---|---|
distance_km | number | Distance totale (km) |
duration_min | number | Durée (min) |
difficulty_level | number | Niveau (échelle interne) |
elevation_gain | number | Dénivelé + (m) |
elevation_loss | number | Dénivelé - (m) |
is_loop | boolean | Boucle ? |
track | string | null | KML/GPX (XML texte) — uniquement si demandé |
track_format | "kml" | "gpx" | null | Format du tracé si présent |
Rappels tracé — Par défaut track=null. Pour obtenir un tracé, définissez p_track_format à "kml" ou "gpx". KML : utilisez p_options.stage_color si vous incluez des étapes. GPX : stage_color ignorée.
3.25 Spécifique Événement (type="FMA")
Les événements peuvent agréger les types de cuisine proposés par leurs restaurants partenaires via le bloc associated_restaurants_cuisine_types[].
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant du type de cuisine |
code | string | Code fonctionnel (ex. "veggie") |
name | string | Libellé affiché |
description | string | null | Description optionnelle |
position | number | null | Ordre conseillé du référentiel |
Le tableau est dédupliqué et ne contient que les types présents dans au moins un menu actif d'un restaurant lié via la relation has_restaurant. Les éléments sont triés selon le référentiel (position puis nom/code).
"associated_restaurants_cuisine_types": [
{ "id": "uuid-ct-1", "code": "local", "name": "Cuisine locale", "description": null, "position": 10 },
{ "id": "uuid-ct-2", "code": "veggie", "name": "Option végétarienne", "description": null, "position": 40 }
]
Si aucun restaurant associé ne publie de menu actif, le tableau est vide.
3.26 documents[] (référentiel partagé)
Ce tableau regroupe l’ensemble des pièces justificatives exposées par l’API (qu’elles soient liées à la fiche légale, à une classification ou à une action RSE). Chaque entrée correspond à un enregistrement de ref_document relié à l’objet.
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant unique du document |
url | string | URL de téléchargement (soumise aux contrôles de visibilité) |
title | string|null | Titre humain affichable |
issuer | string|null | Source officielle |
description | string|null | Notes complémentaires |
valid_from / valid_to | date|null | Période de validité |
visibility | enum | "public" ou "private" |
position | number|null | Ordre d’affichage suggéré |
tags | array<string> | Raccourcis métiers (ex. ["legal", "rse"]) |
"documents": [
{
"id": "0518c3c1-6f35-40f0-bd26-19ccaf7bc93a",
"url": "https://cdn.example.tld/docs/certificat-accessibilite.pdf",
"title": "Certificat accessibilité 2025",
"issuer": "Préfecture",
"description": "Valable jusqu'au 31/12/2025",
"valid_from": "2024-01-01",
"valid_to": "2025-12-31",
"visibility": "public",
"position": 1,
"tags": ["legal", "handicap"]
}
]
Le tableau est dédupliqué côté SQL afin d’éviter d’exposer plusieurs fois la même ressource lorsqu’elle est utilisée à la fois pour un classement et pour la fiche légale. Les doublons sont fusionnés sur l’identifiant de document.
3.27 document_requests[] (suivi des pièces)
Ce bloc retrace la vie des demandes de documents métiers : qui a demandé quoi, quand l’objet a fourni la pièce et si la visibilité est publique ou réservée. Les informations proviennent du module de suivi document_request.
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant unique de la demande |
document_id | string | Référence vers documents[] / ref_document |
status | enum | "requested", "received", "expired", "rejected"… |
requested_at | timestamp | Date/heure de la demande |
due_at | timestamp|null | Échéance attendue (optionnelle) |
delivered_at | timestamp|null | Date de réception de la pièce |
visibility | enum | Alignée sur la visibilité du document remis |
requested_by | string|null | Identité (email ou service) à l’origine de la demande |
notes | string|null | Commentaire interne sur la demande |
"document_requests": [
{
"id": "dreq-2025-04",
"document_id": "0518c3c1-6f35-40f0-bd26-19ccaf7bc93a",
"status": "received",
"requested_at": "2025-02-01T08:15:00Z",
"due_at": "2025-03-01T00:00:00Z",
"delivered_at": "2025-02-10T14:22:11Z",
"visibility": "public",
"requested_by": "legal@oti-sud.fr",
"notes": "Document contrôlé et validé"
}
]
Les applications clientes peuvent exploiter ce flux pour relancer automatiquement les partenaires ou afficher l’historique des justificatifs attendus. Les statuts et horodatages sont mis à jour par les fonctions SQL dédiées au module documentaire.
4) Types de référence
Référentiels utilisés pour les filtres et l'interprétation des données de sortie.
accommodation_type
| Code | Libellé | Description |
|---|---|---|
hotel | Hôtel | Établissement hôtelier classique |
gite | Gîte | Gîte rural, gîte d'étape |
camping | Camping | Camping, aire de camping-car |
chambre_hote | Chambre d'hôte | Chambre d'hôte, B&B |
residence | Résidence | Résidence de tourisme |
auberge | Auberge | Auberge de jeunesse |
room_type
| Code | Libellé | Description |
|---|---|---|
single | Chambre simple | 1 lit simple |
double | Chambre double | 1 lit double |
twin | Chambre twin | 2 lits simples |
triple | Chambre triple | 3 lits |
family | Chambre familiale | 4+ lits |
suite | Suite | Suite de luxe |
tourism_type
| Code | Libellé | Description |
|---|---|---|
cultural | Culturel | Musées, monuments, patrimoine |
nature | Nature | Parcs, randonnées, observation |
adventure | Aventure | Sports extrêmes, activités |
wellness | Bien-être | Spa, relaxation, thermalisme |
gastronomy | Gastronomie | Dégustation, cuisine locale |
business | Affaires | Congrès, séminaires |
ref_legal_type
| Code | Libellé | Catégorie | Description |
|---|---|---|---|
SIRET | SIRET | business | Numéro SIRET de l'entreprise |
SIREN | SIREN | business | Numéro SIREN de l'entreprise |
VAT | N° TVA | business | Numéro de TVA intracommunautaire |
LICENSE | Licence | accommodation | Licence d'exploitation |
TAX_SEJOUR | Taxe de séjour | accommodation | Enregistrement taxe de séjour |
INSURANCE | Assurance | business | Police d'assurance |
PERMIT | Autorisation | business | Permis d'exploitation |
legal_validity_mode
| Code | Libellé | Description |
|---|---|---|
fixed_end_date | Date de fin fixe | Le document expire à une date précise |
tacit_renewal | Renouvellement tacite | Le document se renouvelle automatiquement |
forever | Permanent | Le document n'a pas de date d'expiration |
ref_capacity_metric
| Code | Libellé | Description |
|---|---|---|
beds | Lits | Nombre de lits disponibles |
rooms | Chambres | Nombre de chambres |
max_capacity | Capacité max | Capacité maximale d'accueil |
seats | Places assises | Nombre de places assises (restaurants) |
parking_spaces | Places de parking | Nombre de places de stationnement |
meeting_rooms | Salles de réunion | Nombre de salles de réunion |
ref_actor_role
| Code | Libellé | Description |
|---|---|---|
director | Directeur | Directeur de l'établissement |
manager | Gestionnaire | Gestionnaire, responsable |
receptionist | Réceptionniste | Accueil, réception |
guide | Guide | Guide touristique, accompagnateur |
chef | Chef | Chef de cuisine |
waiter | Serveur | Serveur, personnel de salle |
maintenance | Maintenance | Personnel de maintenance |
security | Sécurité | Agent de sécurité |
client_type
| Code | Libellé | Description |
|---|---|---|
individual | Individuel | Client individuel |
family | Famille | Famille avec enfants |
business_traveler | Voyageur d'affaires | Client professionnel |
group | Groupe | Groupe organisé |
senior | Sénior | Personne âgée |
student | Étudiant | Étudiant/jeune |
service_type
| Code | Libellé | Description |
|---|---|---|
accommodation | Hébergement | Services d'hébergement |
restaurant | Restauration | Services de restauration |
transport | Transport | Services de transport |
activity | Activité | Activités touristiques |
entertainment | Divertissement | Services de divertissement |
wellness | Bien-être | Services de bien-être |
transport_type
| Code | Libellé | Description |
|---|---|---|
airplane | Avion | Transport aérien |
train | Train | Transport ferroviaire |
bus | Bus | Transport par bus |
car | Voiture | Transport automobile |
boat | Bateau | Transport maritime |
walking | Marche | Déplacement à pied |
activity_type
| Code | Libellé | Description |
|---|---|---|
hiking | Randonnée | Randonnée pédestre |
diving | Plongée | Plongée sous-marine |
museum_visit | Visite musée | Visite de musée |
beach | Plage | Activités de plage |
cultural | Culturel | Activités culturelles |
adventure | Aventure | Sports d'aventure |
destination_type
| Code | Libellé | Description |
|---|---|---|
urban | Urbain | Destination urbaine |
coastal | Côtier | Destination côtière |
mountain | Montagne | Destination montagnarde |
rural | Rural | Destination rurale |
island | Île | Destination insulaire |
desert | Désert | Destination désertique |
price_kind
| Code | Libellé | Description |
|---|---|---|
adulte | Adulte | Tarif adulte |
enfant | Enfant | Tarif enfant |
groupe | Groupe | Tarif de groupe |
gratuit | Gratuit | Entrée gratuite |
senior | Sénior | Tarif sénior |
etudiant | Étudiant | Tarif étudiant |
price_unit
| Code | Libellé | Description |
|---|---|---|
par_personne | Par personne | Prix par personne |
par_nuit | Par nuit | Prix par nuitée |
par_heure | Par heure | Prix par heure |
par_jour | Par jour | Prix par jour |
forfait | Forfait | Prix forfaitaire |
gratuit | Gratuit | Entrée gratuite |
season_type
| Code | Libellé | Description |
|---|---|---|
high_season | Haute saison | Période de haute saison |
low_season | Basse saison | Période de basse saison |
winter | Hiver | Saison hivernale |
summer | Été | Saison estivale |
cyclone_season | Saison cyclonique | Période cyclonique |
shoulder_season | Mi-saison | Période intermédiaire |
promotion_type
| Code | Libellé | Description |
|---|---|---|
early_booking | Réservation anticipée | Réduction réservation anticipée |
last_minute | Dernière minute | Offre dernière minute |
loyalty | Fidélité | Réduction fidélité |
group | Groupe | Réduction groupe |
seasonal | Saisonnière | Offre saisonnière |
package | Forfait | Réduction forfait |
package_type
| Code | Libellé | Description |
|---|---|---|
all_inclusive | Tout inclus | Forfait tout inclus |
half_board | Demi-pension | Hébergement + petit-déjeuner + dîner |
full_board | Pension complète | Hébergement + tous les repas |
flight_hotel | Vol + Hôtel | Forfait transport + hébergement |
activity_package | Forfait activité | Hébergement + activités |
romantic | Romantique | Forfait romantique |
cuisine_type
| Code | Libellé | Description |
|---|---|---|
creole | Créole | Cuisine créole locale |
metropolitan | Métropolitaine | Cuisine française métropolitaine |
vegan | Végan | Cuisine végétalienne |
vegetarian | Végétarienne | Cuisine végétarienne |
seafood | Fruits de mer | Cuisine de fruits de mer |
local | Locale | Cuisine locale traditionnelle |
menu_category
| Code | Libellé | Description |
|---|---|---|
entree | Entrée | Plats d'entrée |
main | Plat principal | Plats principaux |
dessert | Dessert | Desserts |
drink | Boisson | Boissons |
appetizer | Amuse-bouche | Amuse-bouches |
side | Accompagnement | Accompagnements |
dietary_tag
| Code | Libellé | Description |
|---|---|---|
vegetarian | Végétarien | Convient aux végétariens |
vegan | Végan | Convient aux végans |
halal | Halal | Certifié halal |
kosher | Casher | Certifié casher |
gluten_free | Sans gluten | Sans gluten |
lactose_free | Sans lactose | Sans lactose |
allergen
| Code | Libellé | Description |
|---|---|---|
gluten | Gluten | Contient du gluten |
dairy | Lait | Contient des produits laitiers |
nuts | Noix | Contient des noix |
eggs | Œufs | Contient des œufs |
soy | Soja | Contient du soja |
shellfish | Crustacés | Contient des crustacés |
event_type
| Code | Libellé | Description |
|---|---|---|
festival | Festival | Festival culturel |
conference | Conférence | Conférence professionnelle |
wedding | Mariage | Cérémonie de mariage |
exhibition | Exposition | Exposition artistique |
concert | Concert | Concert musical |
sport | Sport | Événement sportif |
iti_practice
| Code | Libellé | Description |
|---|---|---|
randonnee_pedestre | Randonnée pédestre | Randonnée à pied |
velo_vtt | Vélo/VTT | Cyclisme et VTT |
equitation | Équitation | Randonnée équestre |
kayak | Kayak | Navigation en kayak |
plongee | Plongée | Plongée sous-marine |
escalade | Escalade | Escalade et varappe |
contact_kind
| Code | Libellé | Description |
|---|---|---|
phone | Téléphone | Numéro de téléphone |
email | Adresse email | |
whatsapp | Contact WhatsApp | |
website | Site web | Site internet |
address | Adresse | Adresse physique |
fax | Fax | Numéro de fax |
social_network
| Code | Libellé | Description |
|---|---|---|
facebook | Page Facebook | |
instagram | Compte Instagram | |
youtube | YouTube | Chaîne YouTube |
twitter | Compte Twitter | |
linkedin | Page LinkedIn | |
tiktok | TikTok | Compte TikTok |
media_type
| Code | Libellé | Description |
|---|---|---|
photo | Photo | Image photographique |
video | Vidéo | Vidéo |
logo | Logo | Logo de l'établissement |
brochure_pdf | Brochure PDF | Document PDF |
audio | Audio | Fichier audio |
panorama | Panorama | Image panoramique |
environment_tag
| Code | Libellé | Description |
|---|---|---|
plage | Plage | Environnement de plage |
montagne | Montagne | Environnement montagnard |
patrimoine | Patrimoine | Site patrimonial |
foret | Forêt | Environnement forestier |
urbain | Urbain | Environnement urbain |
rural | Rural | Environnement rural |
amenity_family
| Code | Libellé | Description |
|---|---|---|
comforts | Conforts | Équipements de confort |
services | Services | Services proposés |
outdoor | Extérieur | Équipements extérieurs |
sports | Sports | Équipements sportifs |
wellness | Bien-être | Équipements bien-être |
business | Affaires | Équipements professionnels |
ref_object_relation_type
| Code | Libellé | Description |
|---|---|---|
parent_of | Parent de | Relation parent-enfant |
part_of | Partie de | Fait partie de |
partner_of | Partenaire de | Partenariat commercial |
near_to | Près de | Proximité géographique |
managed_by | Géré par | Gestion administrative |
owned_by | Propriété de | Propriété |
ref_classification_scheme
| Code | Libellé | Description |
|---|---|---|
hot_stars | Étoiles hôtel | Classification hôtelière |
tourisme_handicap | Tourisme & Handicap | Label accessibilité |
eco_label | Écolabel | Certification environnementale |
quality_label | Label qualité | Label de qualité |
heritage | Patrimoine | Classification patrimoniale |
gastronomy | Gastronomie | Label gastronomique |
insurance_type
| Code | Libellé | Description |
|---|---|---|
travel | Voyage | Assurance voyage |
medical | Médicale | Assurance médicale |
cancellation | Annulation | Assurance annulation |
liability | Responsabilité | Assurance responsabilité |
property | Biens | Assurance des biens |
activity | Activité | Assurance activité |
assistance_type
| Code | Libellé | Description |
|---|---|---|
customer_service | Service client | Assistance clientèle |
emergency | Urgence | Assistance d'urgence |
legal | Légale | Assistance juridique |
medical | Médicale | Assistance médicale |
technical | Technique | Assistance technique |
concierge | Conciergerie | Service de conciergerie |
feedback_type
| Code | Libellé | Description |
|---|---|---|
online_review | Avis en ligne | Avis client en ligne |
complaint | Plainte | Plainte client |
suggestion | Suggestion | Suggestion d'amélioration |
compliment | Compliment | Félicitation client |
rating | Note | Évaluation numérique |
survey | Enquête | Enquête de satisfaction |
partnership_type
| Code | Libellé | Description |
|---|---|---|
hotel | Hôtel | Partenariat hôtelier |
airline | Compagnie aérienne | Partenariat aérien |
local_business | Commerce local | Partenariat local |
tour_operator | Tour-opérateur | Partenariat tour-opérateur |
restaurant | Restaurant | Partenariat restauration |
activity_provider | Prestataire d'activités | Partenariat activités |
5) Exemples pratiques (HTTP)
5.1 Un objet ITI sans tracé (léger)
curl -X POST "{BASE_URL}/rpc/get_object_resource" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{ "p_object_id": "ITI123", "p_track_format": "none" }'
5.2 Le même objet ITI avec KML, étapes en bleu
curl -X POST "{BASE_URL}/rpc/get_object_resource" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_object_id": "ITI123",
"p_track_format": "kml",
"p_options": { "include_stages": true, "stage_color": "blue" }
}'
5.3 Liste paginée d'itinéraires publiés, 20 par page
curl -X POST "{BASE_URL}/rpc/list_object_resources_page" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{ "p_page_size": 20, "p_types": ["ITI"], "p_status": ["published"] }'
Puis, pour la page suivante, reprenez info.next_cursor :
curl -X POST "{BASE_URL}/rpc/list_object_resources_page" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{ "p_cursor": "<valeur de next_cursor>" }'
5.4 Sync incrémentale depuis une date (keyset)
curl -X POST "{BASE_URL}/rpc/list_object_resources_since_fast" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_since": "2024-04-01T00:00:00Z",
"p_types": ["ITI"], "p_status": ["published"]
}'
Bouclez avec p_cursor tant que next_cursor n’est pas null.
5.5 Liste filtrée (ITI boucles ≤ 15 km, à 20 km de 45.76/4.84, avec image principale)
curl -X POST "{BASE_URL}/rpc/list_object_resources_filtered_page" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_page_size": 24,
"p_types": ["ITI"],
"p_filters": {
"itinerary": { "is_loop": true, "distance_max_km": 15, "practices_any": ["hiking"] },
"within_radius": { "lat": 45.76, "lon": 4.84, "radius_m": 20000 },
"media_types_any": ["image"],
"media_published_only": true,
"media_must_have_main": true
}
}'
5.6 Restaurant avec menu complet
curl -X POST "{BASE_URL}/rpc/get_object_resource" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_object_id": "RESTAURANT-001",
"p_lang_prefs": ["fr", "en"]
}'
La réponse inclura les menus[] avec leurs items[], catégories, prix, tags alimentaires et allergènes.
5.7 Récupération avec Deep Data
curl -X POST "{BASE_URL}/rpc/get_object_with_deep_data" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{ "p_object_id": "HOT123" }'
Retourne l'objet avec ses objets parents, acteurs et organisations liées.
5.8 Recherche de restaurants par cuisine
curl -X POST "{BASE_URL}/rpc/search_restaurants_by_cuisine" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_cuisine_types": ["local", "veggie", "seafood"],
"p_languages": ["fr", "en"],
"p_limit": 20
}'
Recherche spécialisée pour trouver des restaurants par types de cuisine.
5.9 Recherche d'événements par cuisine de restaurant
curl -X POST "{BASE_URL}/rpc/search_events_by_restaurant_cuisine" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_cuisine_types": ["local", "gastronomy"],
"p_languages": ["fr"],
"p_limit": 15
}'
Trouve des événements (FMA) basés sur les types de cuisine des restaurants associés.
5.10 Récupération avec options avancées
curl -X POST "{BASE_URL}/rpc/get_object_resource" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_object_id": "HOT123",
"p_lang_prefs": ["fr", "en"],
"p_options": {
"render": true,
"render_locale": "fr-FR",
"render_tz": "Europe/Paris",
"fields": ["id", "name", "contacts", "media", "actors"],
"org_object_id": "ORG456"
}
}'
Exemple avec contrôle du rendu, filtrage des champs et préférence d'organisation.
5.11 Événement avec menu (FMA)
curl -X POST "{BASE_URL}/rpc/get_object_resource" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_object_id": "FMA-FESTIVAL-2024",
"p_lang_prefs": ["fr"]
}'
Les événements peuvent aussi avoir des menus pour les repas/boissons proposés.
5.8 Recherche par label de durabilité
curl -X POST "{BASE_URL}/rpc/search_objects_by_label" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_label_value_id": "uuid-ecolabel-europeen",
"p_include_partial": true,
"p_limit": 20
}'
Retourne les hébergements avec l'Écolabel Européen (complet ou partiel).
5.9 Vue carte allégée pour affichage interactif
curl -X POST "{BASE_URL}/rpc/list_objects_map_view" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_types": ["HOT", "RES"],
"p_status": ["published"],
"p_limit": 500
}'
Payload minimal pour afficher des marqueurs sur une carte : coordonnées, nom, type, image principale.
5.10 Export GPX d'un itinéraire
curl -X POST "{BASE_URL}/rpc/export_itinerary_gpx" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_object_id": "ITI123",
"p_include_stages": true,
"p_include_metadata": true
}'
Retourne un document GPX 1.1 complet avec métadonnées et waypoints. Prêt pour import dans Garmin, Komoot, etc.
5.11 Vérifier la conformité juridique d'un objet
curl -X POST "{BASE_URL}/rpc/get_object_legal_compliance" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_object_id": "HOT123"
}'
Retourne un rapport de conformité : documents manquants, expirés, statut global.
5.12 Ajouter un enregistrement juridique (assurance RC)
curl -X POST "{BASE_URL}/rpc/add_legal_record" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Content-Profile: api" \
-H "apikey: {SUPABASE_ANON_KEY}" \
-H "Authorization: Bearer {SUPABASE_ANON_KEY}" \
-d '{
"p_object_id": "HOT123",
"p_type_code": "ASSURANCE_RC",
"p_value": {
"policy_number": "RC-2024-12345",
"insurer": "Allianz",
"coverage_amount": 5000000
},
"p_valid_from": "2024-01-01",
"p_valid_to": "2024-12-31",
"p_validity_mode": "fixed_end_date",
"p_status": "active"
}'
Crée un nouvel enregistrement juridique avec validité fixe (1 an).
6) Conseils & bonnes pratiques
Tracé ITI
- En listing, laissez
p_track_format: "none"(plus rapide). - Pour le détail, demandez le tracé en
"kml"ou"gpx". - KML + étapes : fixez
stage_colorpour un rendu homogène (ex."blue").
Pagination
- Page/offset (
list_object_resources_page) : simple pour UI. - Keyset (
list_object_resources_since_fast) : idéal pour synchroniser des données modifiées.
Filtres
- N’envoyez que les filtres utiles : les autres sont ignorés.
- Combiner plusieurs clés applique un ET logique.
Langues & robustesse
p_lang_prefsprend un ordre de préférence (ex.["en","fr"]).- Si un champ n’existe pas, attendez-vous à
[],{}ounullsuivant le bloc.
Deep Data & Performance
- Utilisez les fonctions Deep Data pour éviter les appels multiples.
- Activez
render: truepour des données formatées prêtes à l'affichage. - Utilisez
fieldsetincludepour limiter les données retournées.
Recherches spécialisées
- Préférez
search_restaurants_by_cuisineaux filtres génériques. - Utilisez
search_events_by_restaurant_cuisinepour les événements liés à la gastronomie. - Les fonctions Deep Data incluent automatiquement les objets liés.
Nouveaux blocs de données
actors[]: personnes physiques liées à l'objet avec leurs rôles.legal_records[]: enregistrements légaux et certifications officielles.incoming_relations[]etoutgoing_relations[]: relations séparées par sens.
Options avancées
org_object_id: priorise les descriptions d'une organisation spécifique.render_localeetrender_tz: contrôlent le formatage des données.include_private: accès aux données privées (nécessite permissions).
Export GPX & traces
- Utilisez
export_itinerary_gpxpour un GPX complet (métadonnées + waypoints). get_itinerary_track_simplifiedpour affichage carte léger (moins de points).export_itineraries_gpx_batchpour exporter plusieurs itinéraires en un appel.- GeoJSON (
get_itinerary_track_geojson) est compatible Leaflet, Mapbox, OpenLayers.
Système juridique
- Vérifiez la conformité avec
get_object_legal_complianceavant publication. - Utilisez
get_expiring_legal_records_apipour alerter 30-60 jours avant expiration. - Les modes de validité :
"forever"(SIRET),"tacit_renewal"(assurances),"fixed_end_date"(licences). - Documents publics vs privés :
is_publicdansref_legal_typecontrôle la visibilité.
Médias & avis
get_media_for_webfiltre automatiquement les médias internes/brouillons.- 23 tags de classification : facade, interieur, cuisine, paysage, chambre, etc.
- L'image principale est sélectionnée par priorité de tags (paramètre
p_preferred_tags). - Les avis (
get_object_reviews) incluent les agrégats (note moyenne, total).
Recherche & carte
list_objects_map_view: payload minimal (coordonnées + nom + image) pour cartes.search_objects_by_label: recherche par écolabels avec correspondances partielles.- Limitez
list_objects_map_viewà 500-1000 objets max pour ne pas surcharger la carte. - Utilisez les filtres géographiques (
within_radius,within_bbox) pour limiter la zone.