Documentation de l’API
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.
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).
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 | prices (gammes/périodes), amenities (wifi, parking, breakfast), capacity (chambres), classifications (étoiles, éco-labels) |
HPA | Hébergement particulier | Gîte / meublé | prices, amenities (cuisine, lave-linge, parking), capacity, classifications (épis Gîtes de France) |
HLO | Hébergement loisir | Résidences / villages | amenities (piscine, spa, kids_club), prices, capacity, classifications (étoiles, labels) |
CAMP | Camping | Terrain de camping | capacity (emplacements, tentes, camping-cars), amenities (sanitaires, électricité, eau), prices, opening_times |
RES | Restaurant | Restauration | opening_times (service midi/soir), menus (plats/prix), cuisine_types/dietary_tags/allergens, contacts (réservation) |
FMA | Festival / Manifestation | Événements | fma & fma_occurrences (dates/horaires), location, ticket/prix, descriptions/media |
ITI | Itinéraire | Parcours & tracés | itinerary (distance, durée, difficulté, dénivelé), itinerary_details (info, parking, équipement), track (KML/GPX), étapes |
VIL | Village | Entité territoriale | location/descriptions (pourquoi visiter), environment_tags (plage, montagne, patrimoine), relations (POI proches) |
PCU | Point culture urbaine | Arts, expositions | location, descriptions (expo/thème), opening_times, media |
PNA | Point nature aventure | Randonnée, outdoor | location (départ/spot), descriptions (activité, consignes), opening_times, amenities (parking, eau) |
ASC | Association | Structure associative | contacts (participation/adhésion), descriptions, opening_times (accueil), location |
COM | Commerce | Boutique / retail | opening_times, amenities (accessibilité, parking), classifications/tags (retail), payment_methods |
PSV | Service public | Toilettes publiques, eau potable, bornes EV | opening_times (24/7 ou horaires), type (public_toilets/drinking_water/electric_charging), accessibilité, coût |
RVA | Aire camping‑car | Aire de stationnement vans/camping‑cars | capacity (véhicules, camping-cars, emplacements), amenities (électricité, eau, vidange), opening_times/stay_limits, tarifs |
Exemples : "p_types": ["PSV"] pour lister uniquement les services publics • "p_types": ["RVA","CAMP"] pour aires et campings.
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/offset) : 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.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": [...]
}
]
}
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
object_contact,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 — vues et fonctions du schéma
api(ex.api.v_hot,api.v_objects,api.v_needed,api.get_object_resource) 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.
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_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_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 :
| 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 :
| 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.
| 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_hours | number | Durée moyenne (h) |
difficulty_level | number | Niveau (échelle interne) |
elevation_gain | 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.
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).