OTI du SUD · API Documentation complète & bonnes pratiques
v1

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/json
  • Accept: application/json
  • Content-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éthodeDonnées publiquesDonnées étenduesDonné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
Données étendues

Les données étendues incluent : descriptions privées, contacts non-publics, médias non-publiés, informations légales, réductions, politiques de groupe.

Sécurité

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 HTTPMessageCauseSolution
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)
TypeDescription
stringTexte (ex. "Hôtel du Parc").
numberNombre (ex. 12, 3.14).
booleantrue / false.
timestampDate-heure ISO 8601 en UTC (ex. "2024-03-18T09:30:00Z").
enum (code)Valeur codée (ex. "image", "ITI", "published").
arrayListe (ex. ["fr","en"]).
objectSous-ensemble structuré avec ses propres champs.
Astuce

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 :

CodeLibelléUsage principalInformations clés pour le voyageur
ORGOrganisationOTI/CRT, gestion et publicationcontacts (tél, email, site), opening_times, location, descriptions, media
HOTHôtelHébergement hôtelierprices (gammes/périodes), amenities (wifi, parking, breakfast), capacity (chambres), classifications (étoiles, éco-labels)
HPAHébergement particulierGîte / meubléprices, amenities (cuisine, lave-linge, parking), capacity, classifications (épis Gîtes de France)
HLOHébergement loisirRésidences / villagesamenities (piscine, spa, kids_club), prices, capacity, classifications (étoiles, labels)
CAMPCampingTerrain de campingcapacity (emplacements, tentes, camping-cars), amenities (sanitaires, électricité, eau), prices, opening_times
RESRestaurantRestaurationopening_times (service midi/soir), menus (plats/prix), cuisine_types/dietary_tags/allergens, contacts (réservation)
FMAFestival / ManifestationÉvénementsfma & fma_occurrences (dates/horaires), location, ticket/prix, descriptions/media
ITIItinéraireParcours & tracésitinerary (distance, durée, difficulté, dénivelé), itinerary_details (info, parking, équipement), track (KML/GPX), étapes
VILVillageEntité territorialelocation/descriptions (pourquoi visiter), environment_tags (plage, montagne, patrimoine), relations (POI proches)
PCUPoint culture urbaineArts, expositionslocation, descriptions (expo/thème), opening_times, media
PNAPoint nature aventureRandonnée, outdoorlocation (départ/spot), descriptions (activité, consignes), opening_times, amenities (parking, eau)
ASCAssociationStructure associativecontacts (participation/adhésion), descriptions, opening_times (accueil), location
COMCommerceBoutique / retailopening_times, amenities (accessibilité, parking), classifications/tags (retail), payment_methods
PSVService publicToilettes publiques, eau potable, bornes EVopening_times (24/7 ou horaires), type (public_toilets/drinking_water/electric_charging), accessibilité, coût
RVAAire camping‑carAire de stationnement vans/camping‑carscapacity (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.

📦 Ouvrir dans Postman
Collection publique • Tests automatiques • Variables d'environnement
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ètreTypeObligatoireDéfautDescription
p_object_idstringIdentifiant de la ressource à lire.
p_lang_prefsarray<string>["fr"]Préférences de langue (ordre de priorité).
p_track_formatenum "none" | "kml" | "gpx""none"Tracé : par défaut aucun. Mettez "kml" ou "gpx" (type ITI).
p_optionsobject{}Options avancées (voir détails ci-dessous).
p_options — options avancées
OptionTypeDéfautDescription
include_stagesbooleantrueInclure les étapes dans le tracé KML/GPX.
stage_colorstring"red"Couleur des étapes (KML uniquement).
renderbooleantrueGénérer le bloc render avec données formatées.
render_localestringautoLocale pour le formatage (ex. "fr-FR").
render_tzstring"UTC"Fuseau horaire pour le formatage.
render_versionstring"1.0"Version du formatage.
fieldsarray<string>nullLimiter les champs retournés (ex. ["id", "name", "contacts"]).
includearray<string>nullInclure des blocs optionnels (ex. ["render", "actors"]).
org_object_idstringautoPréférence d'organisation pour les descriptions.
include_privatebooleanfalseInclure les données privées (nécessite permissions).
Exemple
{
  "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_stages contrôle l’ajout des étapes.
    • KML : si include_stages=true, vous pouvez régler stage_color (ex. "red", "blue", "green", "orange", "purple", "black", "white", "yellow", "cyan", "magenta", "gray", #RRGGBB ou AABBGGRR).
    • GPX : stage_color est 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ètreTypeObligatoireDéfautDescription
p_cursorstringnullCurseur opaque renvoyé par l’appel précédent.
p_lang_prefsarray<string>["fr"]Préférences de langue.
p_page_sizenumber501 à 200.
p_typesarray<enum>nullRestreindre aux types demandés (ex. ["ITI"]).
p_statusarray<enum>["published"]Statuts acceptés.
p_searchstringnullTerme de recherche (nom normalisé ; insensible aux accents & casse).
p_track_format"none" | "kml" | "gpx""none"
p_include_stagesbooleannullSi vous demandez un tracé KML/GPX, inclure les étapes ?
p_stage_colorstringnullCouleur des étapes (KML uniquement) si include_stages=true.
p_omit_emptybooleanfalseSupprimer 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

  1. Premier appel sans p_cursor.
  2. Lisez info.next_cursor.
  3. Rappelez en passant p_cursor pour 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'objet
  • legal_records[] — Documents légaux
  • meeting_rooms[] — Salles de réunion
  • fma[] — Événements FMA
  • fma_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ètreTypeObligatoireDéfautDescription
p_sincetimestampPoint de départ (UTC).
p_cursorstringnullCurseur opaque.
p_use_sourcebooleanfalseUtiliser la date de mise à jour source plutôt que technique.
p_lang_prefsarray<string>["fr"]Préférences de langue.
p_limitnumber501 à 200.
p_types / p_status / p_searchComme §2.2.
p_track_format / p_include_stages / p_stage_colorComme §2.2 (par défaut, pas de tracé).
p_omit_emptybooleanfalseSupprimer 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)

  1. Appelez avec votre p_since (ex. dernière sync réussie).
  2. Tant que next_cursor n’est pas null, chaînez avec p_cursor.
  3. 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ètreTypeObligatoireDéfautDescription
p_cursor / p_lang_prefs / p_page_sizeComme §2.2
p_filtersobject{}Filtres riches (voir ci-dessous).
p_types / p_status / p_searchComme §2.2
p_track_format / p_include_stages / p_stage_colorComme §2.2
p_omit_emptybooleanfalseSupprimer 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 équipement
  • amenities_all: string[] — tous ces équipements
  • amenity_families_any: string[] — au moins une famille
  • pet_accepted: boolean — animaux acceptés
  • payment_methods_any: string[]
  • environment_tags_any: string[]
  • languages_any: string[]
Médias
  • media_types_any: string[] — ex. ["image","video"]
  • media_published_only: boolean
  • media_must_have_main: boolean
Capacité & Classement
  • capacity_filters: [{ code, min?, max? }]
  • classifications_any: [{ scheme_code, value_code }]
  • tags_any: string[] — slugs
  • meeting_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ètreTypeOblig.DéfautDescription
p_sincetimestampPoint de départ (UTC).
p_cursorstringnullCurseur opaque.
p_use_sourcebooleanfalseComme §2.3.
p_lang_prefsarray<string>["fr"]
p_limitnumber501 à 200.
p_filtersobject{}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.

Nouveau

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ètreTypeObligatoireDéfautDescription
p_object_idstringIdentifiant de l'objet à récupérer.

2.6.2 Récupérer plusieurs objets avec Deep Data : get_objects_with_deep_data

ParamètreTypeObligatoireDéfautDescription
p_object_idsarray<string>Liste des identifiants d'objets.
p_languagesarray<string>["fr"]Préférences de langue.
p_include_mediastring"none"Inclusion des médias : "none", "basic", "full".
p_filtersobject{}Filtres optionnels.

2.6.3 Lister par type avec Deep Data : get_objects_by_type_with_deep_data

ParamètreTypeObligatoireDéfautDescription
p_object_typestringType d'objet ("HOT", "ORG", "RES", etc.).
p_languagesarray<string>["fr"]Préférences de langue.
p_include_mediastring"none"Inclusion des médias.
p_filtersobject{}Filtres optionnels.
p_limitnumber100Nombre maximum d'objets.
p_offsetnumber0Décalage pour la pagination.

2.6.4 Rechercher avec Deep Data : search_objects_with_deep_data

ParamètreTypeObligatoireDéfautDescription
p_search_termstringTerme de recherche.
p_object_typesarray<string>nullTypes d'objets à inclure (null = tous).
p_languagesarray<string>["fr"]Préférences de langue.
p_include_mediastring"none"Inclusion des médias.
p_filtersobject{}Filtres optionnels.
p_limitnumber50Nombre maximum d'objets.
p_offsetnumber0Décalage pour la pagination.

2.6.5 Recherche spécialisée restaurants : search_restaurants_by_cuisine

ParamètreTypeObligatoireDéfautDescription
p_cuisine_typesarray<string>Types de cuisine recherchés (ex. ["local", "veggie"]).
p_languagesarray<string>["fr"]Préférences de langue.
p_limitnumber50Nombre maximum de résultats.
p_offsetnumber0Décalage pour la pagination.

2.6.6 Recherche événements par cuisine : search_events_by_restaurant_cuisine

ParamètreTypeObligatoireDéfautDescription
p_cuisine_typesarray<string>Types de cuisine des restaurants associés.
p_languagesarray<string>["fr"]Préférences de langue.
p_limitnumber50Nombre maximum de résultats.
p_offsetnumber0Dé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 via object_zone.
  • Contenus multilingues object_description et colonnes *_i18n — textes publics, chapôs, infos mobiles stockés soit en JSONB, soit via la table générique i18n_translation exposée dans les vues api.*.
  • 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 via media.place_id.
  • Référentiels ref_code, ref_classification_scheme, ref_classification_value — types, labels, classements et tags reliés aux objets par object_classification et object_capacity.
  • Accessibilité & labels handicap — entrées object_classification avec scheme_code = "HANDICAP_LABEL", valeurs et sous-valeurs (subvalue_ids) pour chaque handicap couvert (moteur, visuel, auditif, mental), justificatifs optionnels via ref_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
BlocTypeÀ quoi ça sertExemple
idstringIdentifiant unique métier"OBJ_000123"
typeenumType d’objet (ex. itinéraire)"ITI"
statusenumStatut de publication"published"
namestringNom affiché"Boucle des Crêtes"
region_codestringCode région/source métier"FR-ARA"
created_at / updated_at / updated_at_source / published_attimestampSuivi de vie (technique + source amont)"2024-03-18T09:30:00Z"
addressobjectAdresse postale (si connue){ "street": "...", "city": "..." }
locationobjectPosition WGS84{ "latitude": 45.76, "longitude": 4.84, "altitude_m": 250 }
descriptionsobjectDescriptions multilingues enrichies (description, description_chapo, description_mobile, description_edition, description_offre_hors_zone, sanitary_measures)voir §3.2
external_idsarray<object>Identifiants externes (SIT, DMS…)[{ "system":"X", "value":"1234" }]
contactsarray<object>Moyens de contact enrichisvoir §3.3
languagesarray<object>Langues parlées[{ "code":"fr", "name":"Français" }]
mediaarray<object>Médias publiésvoir §3.5
capacityarray<object>Capacitésvoir §3.6
amenitiesarray<object>Équipements/Servicesvoir §3.7
environment_tagsarray<object>Tags environnement (éco)voir §3.8
payment_methodsarray<object>Moyens de paiementvoir §3.8
pet_policyobjectPolitique animaux{ "accepted": true, ... }
pricesarray<object>Tarifs (+ périodes)voir §3.9
classificationsarray<object>Labels/Classements (étoiles hôtels, certifications, etc.)voir §3.10
handicap_labelsarray<object>Labellisation Tourisme & Handicapvoir §3.11
tagsarray<object>Tags libresvoir §3.12
discountsarray<object>Réductions et offres spécialesvoir §3.23
group_policiesarray<object>Politiques de groupevoir §3.24
origins / org_linksarray<object>Blocs transparents
actorsarray<object>Acteurs (personnes) liés à l'objetvoir §3.25
legal_recordsarray<object>Enregistrements légaux unifiésvoir §3.26
meeting_roomsarray<object>Salles de réunionvoir §3.13
fma / fma_occurrencesarray<object>Occurrences d'événements/activités
opening_timesobjectHoraires d'ouverture (structure temporelle)voir §3.14
menusarray<object>Menus (restaurants/événements)voir §3.15
placesarray<object>Lieux internesvoir §3.16
sustainability_action_labelsarray<object>Actions RSE + labelsvoir §3.17
incoming_relations / outgoing_relationsarray<object>Relations entrantes/sortantesvoir §3.18
renderobjectDonnées formatées pour l'affichagevoir §3.27
legal_recordsarray<object>Enregistrements légaux et certificationsvoir §3.26
documentsarray<object>Pièces justificatives publiables (référentiel commun)voir §3.21
document_requestsarray<object>Suivi des demandes/remises de documentsvoir §3.22
associated_restaurants_cuisine_types (si type="FMA")array<object>Types de cuisine agrégés via les restaurants liésvoir §3.20
itinerary_details (si type="ITI")objectDétails ITIvoir §3.19
itinerary (si type="ITI")objectRé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.

ChampTypeDescriptionExemple
descriptionstringDescription principale multilingue"Restaurant gastronomique avec vue sur mer..."
description_chapostringChapô/accroche multilingue"Une expérience culinaire unique..."
description_mobilestringDescription optimisée pour mobile"Resto vue mer, spécialités locales"
description_editionstringDescription pour édition papier"Établissement familial depuis 1950..."
description_offre_hors_zonestringDescription pour offres hors zone géographique"Découvrez nos spécialités créoles..."
sanitary_measuresstringMesures sanitaires et protocoles"Gel hydroalcoolique disponible, masques fournis"
Multilingue

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.

Contexte

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.

ChampTypeDescriptionExemple
kind_codestringType de contact (référentiel contact_kind)"email"
kind_namestringLibellé humain du type"E-mail"
kind_descriptionstringDescription du type"Adresse électronique"
icon_urlstring (URL)Icône du type"https://cdn.example.com/email.svg"
valuestringAdresse/numéro/URL de contact"contact@hotel-exemple.fr"
is_publicbooleanVisible publiquement ?true
is_primarybooleanCanal prioritaire ?true
rolestringRôle (code : booking, info, …)"booking"
positionnumberOrdre d'affichage conseillé1

Types de contacts disponibles

Le système supporte plusieurs types de contacts via le référentiel contact_kind :

CodeNomDescriptionFormat attendu
emailE-mailAdresse électroniqueemail@domain.com
phoneTéléphoneNuméro de téléphone+262 262 12 34 56
mobileMobileNuméro de mobile+262 692 12 34 56
websiteSite webURL du site internethttps://www.hotel-exemple.fr
facebookFacebookPage Facebookhttps://facebook.com/hotel-exemple
instagramInstagramCompte Instagramhttps://instagram.com/hotel_exemple
whatsappWhatsAppContact WhatsApp+262 692 12 34 56
bookingRéservationLien de réservationhttps://booking.com/hotel-exemple

Exemple concret : Contacts d'un hôtel

Exemple
{
  "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

Affichage

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.

Note sur les variantes

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).

Important

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.

ChampTypeDescriptionExemple
codestringCode ISO 639-1 de la langue"fr"
namestringNom de la langue"Français"

Langues supportées

Le système supporte les principales langues via le référentiel ref_language :

CodeNomDescriptionUsage typique
frFrançaisLangue officielle de La RéunionLangue principale
enAnglaisLangue internationaleTourisme international
esEspagnolLangue latineTourisme hispanophone
deAllemandLangue germaniqueTourisme germanophone
itItalienLangue latineTourisme italophone
ptPortugaisLangue lusophoneTourisme brésilien
zhChinoisLangue asiatiqueTourisme chinois
jaJaponaisLangue asiatiqueTourisme japonais

Exemple concret : Langues d'un hôtel

Exemple
{
  "languages": [
    {
      "code": "fr",
      "name": "Français"
    },
    {
      "code": "en",
      "name": "Anglais"
    },
    {
      "code": "de",
      "name": "Allemand"
    },
    {
      "code": "es",
      "name": "Espagnol"
    }
  ]
}

Utilisation pratique

Filtrage

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.

Important

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.

ChampTypeDescriptionExemple
idstringIdentifiant unique du média"media_123"
type_codestringType de média (référentiel media_type)"image"
type_namestringNom du type de média"Image"
type_descriptionstringDescription du type de média"Photos et illustrations"
icon_urlstring (URL)Icône représentant le type"https://cdn.example.com/image.svg"
titlestringTitre/légende du média"Vue panoramique de l'hôtel"
creditstringCrédit photo/vidéo"© Hôtel Exemple"
urlstring (URL)URL directe du fichier"https://cdn.example.com/hotel-view.jpg"
is_mainbooleanMédia principal de l'établissement ?true
visibilitystringNiveau de visibilité"public"
positionnumberOrdre d'affichage1
widthnumberLargeur en pixels (si connue)1920
heightnumberHauteur 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 :

CodeNomDescriptionFormats typiques
imageImagePhotos et illustrationsJPG, PNG, WebP
videoVidéoVidéos promotionnellesMP4, WebM
logoLogoLogo de l'établissementPNG, SVG
brochure_pdfBrochure PDFDocumentation imprimablePDF
menu_pdfMenu PDFMenu au format PDFPDF
audioAudioFichiers audioMP3, WAV
documentDocumentAutres documentsPDF, DOC

Exemple concret : Médias d'un hôtel

Exemple
{
  "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
    }
  ]
}
Variante menus

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

Affichage

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.

Important

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.

ChampTypeDescriptionExemple
metric_codestringCode de la métrique (référentiel ref_capacity_metric)"beds"
metric_namestringNom de la métrique"Lits"
icon_urlstring (URL)Icône représentant la métrique"https://cdn.example.com/bed.svg"
valuenumberValeur numérique de la capacité50
unitstringUnité 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 :

CodeNomDescriptionUsage typique
bedsLitsNombre total de litsHôtels, gîtes
roomsChambresNombre de chambresHôtels, meublés
coversCouvertsCapacité restaurantRestaurants, cafés
seatsPlaces assisesPlaces en salleRestaurants, salles
max_capacityCapacité maxCapacité maximale totaleÉvénements, salles
parking_spacesPlaces parkingNombre de places de parkingTous établissements
poolsPiscinesNombre de piscinesHôtels, campings
tennis_courtsCourts de tennisNombre de courtsComplexes sportifs

Exemple concret : Capacités d'un hôtel

Exemple
{
  "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

Filtrage

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).

Important

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.

ChampTypeDescriptionExemple
codestringCode de l'équipement (référentiel amenity)"WIFI"
namestringNom de l'équipement"WiFi gratuit"
icon_urlstring (URL)Icône représentant l'équipement"https://cdn.example.com/wifi.svg"
familyobjectFamille 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 :

CodeNomDescriptionÉquipements typiques
connectivityConnectivitéServices internet et communicationWiFi, 4G, téléphone
comfortConfortÉquipements de confortClimatisation, chauffage, minibar
outdoorExtérieurEspaces et activités extérieuresPiscine, jardin, terrasse
wellnessBien-êtreServices de bien-êtreSpa, sauna, fitness
diningRestaurationServices de restaurationRestaurant, bar, petit-déjeuner
businessBusinessServices professionnelsSalle de réunion, photocopieur
accessibilityAccessibilitéÉquipements d'accessibilitéAscenseur, rampe, chambre adaptée
transportTransportServices de transportParking, navette, location vélo

Équipements populaires

Voici quelques équipements couramment utilisés :

CodeNomFamilleDescription
WIFIWiFi gratuitconnectivityAccès internet sans fil
PARKINGParkingtransportPlace de stationnement
POOLPiscineoutdoorBassin de natation
RESTAURANTRestaurantdiningService de restauration
ACClimatisationcomfortAir conditionné
SPASpawellnessCentre de bien-être
ELEVATORAscenseuraccessibilityÉquipement d'accessibilité
MEETING_ROOMSalle de réunionbusinessEspace de travail

Exemple concret : Équipements d'un hôtel

Exemple
{
  "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

Filtrage

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.

Important

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

ChampTypeDescriptionExemple
codestringCode de référence"beach"
namestringNom affiché"Plage"
icon_urlstring (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 :

CodeNomDescriptionUsage typique
beachPlageProximité de la plageHôtels côtiers
mountainMontagneEnvironnement montagnardGîtes, refuges
forestForêtProximité de forêtsCampings, gîtes
city_centerCentre-villeEn centre-villeHôtels urbains
heritagePatrimoineProche de sites patrimoniauxHôtels historiques
volcanoVolcanProximité volcaniqueSpécifique à La Réunion
lagoonLagonProximité du lagonHôtels tropicaux
gardenJardinJardin 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 :

CodeNomDescriptionUsage typique
cashEspècesPaiement en liquidePetits établissements
cardCarte bancairePaiement par carteStandard
checkChèquePaiement par chèqueRéservations longues
transferVirementVirement bancaireGroupes, entreprises
paypalPayPalPaiement en ligneRéservations web
apple_payApple PayPaiement mobile AppleClients Apple
google_payGoogle PayPaiement mobile GoogleClients Android
voucherBon cadeauPaiement par bonOffres spéciales

Exemple concret : Hôtel côtier

Exemple
{
  "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

Filtrage

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.

Important

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

ChampTypeDescriptionExemple
kindobjectType de tarif enrichi : { id, code, name, position, icon_url }{"code": "adult", "name": "Adulte"}
unitobjectUnité enrichie : { id, code, name, position, icon_url }{"code": "per_night", "name": "Par nuit"}
amountnumberMontant de base (optionnel si fourchette)120.00
amount_maxnumberMontant maximum (pour fourchettes de prix)180.00
currencystringDevise (ISO 4217)"EUR"
valid_fromdateDate de début de validité du tarif"2024-01-01"
valid_todateDate de fin de validité du tarif"2024-12-31"
conditionsstringConditions, notes, restrictions"Petit-déjeuner inclus"
periodsarray<object>Périodes détaillées imbriquéesVoir structure ci-dessous

Types de tarifs disponibles

Le système supporte plusieurs types de tarifs via le référentiel price_kind :

CodeNomDescriptionUsage typique
adultAdulteTarif adulte standardHôtels, restaurants
childEnfantTarif enfant (généralement réduit)Hôtels, activités
seniorSéniorTarif senior (généralement réduit)Hôtels, musées
groupGroupeTarif de groupe (généralement réduit)Hôtels, restaurants
packageForfaitForfait tout inclusHôtels, agences
studentÉtudiantTarif étudiantMusées, activités
freeGratuitAccès gratuitMusées, parcs
localRésidentTarif résident localActivités, parcs

Unités de tarification disponibles

Le système supporte plusieurs unités via le référentiel price_unit :

CodeNomDescriptionUsage typique
per_nightPar nuitTarif par nuitéeHôtels, gîtes
per_personPar personneTarif par personneRestaurants, activités
per_groupPar groupeTarif forfaitaire groupeGuides, activités
per_entryPar entréeTarif d'entrée uniqueMusées, parcs
per_hourPar heureTarif horaireLocation, services
per_dayPar jourTarif journalierLocation véhicules
per_weekPar semaineTarif hebdomadaireLocation longue durée
per_monthPar moisTarif mensuelLocation 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 :

ChampTypeDescriptionExemple
idstringIdentifiant unique de la période"uuid-period-1"
start_datedateDate de début de la période"2024-07-01"
end_datedateDate de fin de la période"2024-08-31"
start_timetimeHeure de début (format HH:MM)"15:00"
end_timetimeHeure de fin (format HH:MM)"11:00"
notestringNote spécifique à la période"Haute saison"

Exemple concret : Tarification hôtel complexe

Exemple
{
  "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

Calcul de prix

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.

Important

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.

ChampTypeDescriptionExemple
schemestringCode du schéma de classification"hot_stars"
scheme_namestringNom du schéma/organisme"Classement hôtelier"
valuestringCode de la valeur/grade"4"
value_namestringLibellé de la valeur"4 étoiles"
awarded_atdateDate d'obtention"2024-01-15"
valid_untildateDate d'expiration (si applicable)"2025-01-15"
statusenumStatut de la classification"active"

Types de classifications disponibles

Le système supporte plusieurs types de classifications via le référentiel ref_classification_scheme :

CodeNomDescriptionValeurs possibles
hot_starsClassement hôtelierÉtoiles officielles hôtels1 à 5 étoiles
camp_starsClassement campingÉtoiles officielles campings1 à 5 étoiles
meuble_starsClassement meublésÉtoiles meublés de tourisme1 à 5 étoiles
gites_epicsGîtes de France (épis)Niveau Gîtes de France1 à 5 épis
clevacances_keysClévacances (clés)Niveau Clévacances1 à 5 clés
green_keyLa Clef VerteLabel environnementalCertifié / Non certifié
eu_ecolabelÉcolabel EuropéenLabel environnemental UECertifié / Non certifié
tourisme_handicapTourisme & HandicapAccessibilité (multi-sélection)Moteur, Visuel, Auditif, Mental

Exemple concret : Hôtel 4 étoiles

Exemple
{
  "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

Filtrage

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.

Important

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.

ChampTypeDescription
schemeobject{ code, name } — devrait valoir HANDICAP_LABEL / « Tourisme & Handicap ».
valueobjectNiveau 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_untildateDates d’obtention et d’échéance.
statusenumrequested, granted, suspended, expired (suivi cycle de vie).
documentobject | nullJustificatif { id, title, url } référencé via ref_document.
source / notestring | nullMétadonnées internes optionnelles.
Exemple
{
  "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.

ChampTypeDescriptionExemple
slugstringIdentifiant lisible (URL-friendly)"romantique"
namestringLibellé affiché"Romantique"
colorstringCouleur d'affichage (CSS/hex)"#FF6B6B"
iconstringNom/code de l'icône"heart"
icon_urlstring (URL)URL de l'icône"https://cdn.example.com/heart.svg"

Types de tags populaires

Voici quelques exemples de tags couramment utilisés :

SlugNomDescriptionCouleur typique
romantiqueRomantiqueIdéal pour couples#FF6B6B (rose)
familialFamilialAdapté aux familles#4ECDC4 (turquoise)
luxeLuxeÉtablissement haut de gamme#FFD93D (doré)
authentiqueAuthentiqueExpérience locale authentique#6BCF7F (vert)
ecologiqueÉcologiqueEngagement environnemental#4D96FF (bleu)
historiqueHistoriquePatrimoine historique#8B4513 (marron)
moderneModerneDesign contemporain#9B59B6 (violet)
tranquilleTranquilleEnvironnement calme#95A5A6 (gris)

Exemple concret : Tags d'un hôtel de charme

Exemple
{
  "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

Filtrage

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.

Important

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

ChampTypeDescriptionExemple
namestringNom de la salle"Salle des Palmiers"
surfacenumberSurface en m²120
cap_theatrenumberCapacité en format théâtre80
cap_unumberCapacité en format U24
cap_classroomnumberCapacité en format classe40
cap_boardroomnumberCapacité en format conseil16
cap_cocktailnumberCapacité en format cocktail100
cap_banquetnumberCapacité en format banquet60
equipmentarray<object>Équipements disponiblesVoir structure ci-dessous

Formats de salle expliqués

Les différentes capacités correspondent aux formats d'organisation d'événements :

FormatDescriptionUsage typiqueDensité
cap_theatreThéâtre (toutes les chaises face à la scène)Présentations, conférencesLa plus élevée
cap_classroomClasse (tables individuelles face à l'avant)Formations, coursÉlevée
cap_uU (tables en forme de U)Réunions interactivesMoyenne
cap_boardroomConseil (table rectangulaire)Réunions de directionFaible
cap_cocktailCocktail (debout, circulation libre)Réseautage, apéritifsTrès élevée
cap_banquetBanquet (tables rondes)Repas, galasMoyenne

Équipements disponibles

Le système supporte plusieurs types d'équipements via le référentiel meeting_equipment :

CodeNomDescriptionUsage typique
projectorVidéoprojecteurProjection d'écranPrésentations
screenÉcran de projectionÉcran fixe ou mobilePrésentations
sound_systemSystème audioSonorisationConférences
microphoneMicrophoneMicro fixe ou mobilePrésentations
whiteboardTableau blancTableau effaçableFormations
flipchartPaperboardTableau à feuillesBrainstorming
wifiWiFiAccès internetConnectivité
air_conditioningClimatisationContrôle températureConfort
natural_lightÉclairage naturelFenêtres, lumière du jourConfort
cateringRestaurationService traiteurÉvénements

Exemple concret : Salle de conférence

Exemple
{
  "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

Sélection de salle

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.

Important

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 :

ChampTypeDescription
PeriodeOuverturesarray<object>Périodes d'ouverture pour l'année courante et suivante
PeriodeOuverturesAnneeSuivantesarray<object>Périodes d'ouverture pour les années suivantes

Structure d'une période d'ouverture

ChampTypeDescription
IDstringIdentifiant unique de la période
OrdrenumberOrdre d'affichage
SyndicObjectIdstringIdentifiant de l'objet
DatedebutdateDate de début de la période
DatefindateDate de fin de la période
Joursfermeturearray<string>Jours de fermeture (codes des jours)
[jour]heuredebut1/2stringHeures de début des créneaux (ex. "lundiheuredebut1")
[jour]heurefin1/2stringHeures 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)
Exemple
{
  "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)
ChampTypeDescription
idstringIdentifiant du menu
namestringNom du menu (ex. "Menu déjeuner")
descriptionstringDescription du menu
positionnumberOrdre d'affichage
is_activebooleanMenu actif ?
valid_from / valid_todatePériode de validité
items[]array<object>Articles du menu

Articles de menu (items[])

ChampTypeDescription
idstringIdentifiant de l'article
namestringNom du plat
descriptionstringDescription du plat
positionnumberOrdre dans le menu
price_amount / price_amount_maxnumberPrix (ou fourchette)
price_currencystringDevise (ex. "EUR")
categoryobject{ id, code, name } (ex. "Entrée", "Plat principal")
unitobject{ 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.

ChampTypeDescriptionExemple
idstringIdentifiant du média"media_123"
titlestringTitre du média"Photo du plat principal"
descriptionstringDescription du média"Vue rapprochée du plat"
urlstring (URL)URL du fichier média"https://cdn.example.com/plat.jpg"
creditstringCrédit photo/vidéo"© Restaurant XYZ"
width / heightnumberDimensions (si connues)1920, 1080
is_mainbooleanMédia principal de l'article ?true
is_publishedbooleanMédia publié ?true
positionnumberOrdre d'affichage1
media_typeobjectType de média{ "id": "1", "code": "image", "name": "Image" }
Affichage

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.

ChampTypeDescription
object_action_idstringIdentifiant de l’action
actionobject{ code, label, description, icon_url, category{…}, position }
labelobject{ 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.

Exemple
{
  "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.

ChampTypeDescription
idstringIdentifiant unique de la réduction
namestringNom de l'offre
descriptionstringDescription détaillée
discount_percentnumberPourcentage de réduction (0-100)
discount_amountnumberMontant de réduction fixe
currencystringDevise (ISO 4217)
conditionsstringConditions d'application
valid_from / valid_todatePériode de validité
is_activebooleanOffre active ?
positionnumberOrdre d'affichage
Exemple
{
  "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.

ChampTypeDescription
idstringIdentifiant unique de la politique
namestringNom de la politique
descriptionstringDescription détaillée
min_sizenumberTaille minimale du groupe
max_sizenumberTaille maximale du groupe
notesstringNotes et conditions particulières
is_activebooleanPolitique active ?
positionnumberOrdre d'affichage
Exemple
{
  "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.).

ChampTypeDescription
idstringIdentifiant unique de l'acteur
display_namestringNom d'affichage complet
first_namestringPrénom
last_namestringNom de famille
genderenumGenre (M, F, O)
roleobjectRôle de l'acteur : { id, code, name } - Le code correspond à ref_actor_role.code
is_primarybooleanActeur principal ?
valid_from / valid_todatePériode de validité du rôle
visibilityenumVisibilité (public, private)
notestringNote ou commentaire
contactsarray<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.

CodeLibelléDescriptionUsage typique
directorDirecteurResponsable de l'établissementHôtels, restaurants, attractions
receptionistRéceptionnisteAccueil et service clientHôtels, offices de tourisme
guideGuideGuide touristique ou accompagnateurAgences, sites touristiques
managerGestionnaireResponsable opérationnelÉtablissements divers
chefChefChef de cuisineRestaurants, hôtels
ownerPropriétairePropriétaire de l'établissementPetits commerces, gîtes
Référentiel

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.

Exemple
{
  "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.

ChampTypeDescription
idstringIdentifiant unique de l'enregistrement
typeobjectType de document : { id, code, name, category }
valuestringValeur du document (numéro, référence)
statusenumStatut (active, expired, pending, suspended)
valid_from / valid_todatePériode de validité
validity_modeenumMode de validité (fixed_end_date, tacit_renewal, forever)
issuerstringOrganisme émetteur
documentobjectJustificatif : { id, url, title, visibility }
notesstringNotes et commentaires
created_at / updated_attimestampHorodatage
Exemple
{
  "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.

ChampTypeDescription
langstringCode langue (ex. "fr")
localestringLocale complète (ex. "fr-FR")
timezonestringFuseau horaire (ex. "UTC")
versionstringVersion du formatage (ex. "1.0")
contact_linesarray<string>Lignes de contact formatées
media_linesarray<string>Lignes de médias formatées
capacity_linesarray<string>Lignes de capacité formatées
amenity_linesarray<string>Lignes d'équipements formatées
price_linesarray<string>Lignes de tarifs formatées
classification_linesarray<string>Lignes de classements formatées
discount_linesarray<string>Lignes de réductions formatées
group_policy_linesarray<string>Lignes de politiques de groupe formatées
actor_linesarray<string>Lignes d'acteurs formatées
legal_record_linesarray<string>Lignes d'enregistrements légaux formatées
menu_item_linesarray<string>Lignes d'articles de menu formatées
Exemple
{
  "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 alternatifs
  • practices[] : { code, name, icon_url } (ex. "hiking", "mtb")
  • sections[] : segments/tronçons
  • stages[] : étapes (avec leur propre media[])
  • 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.

ChampTypeDescription
associated_object_idstringIdentifiant de l’objet lié (identique à target.id, conservé pour compatibilité)
targetobject | null{ id, type, name } résolu automatiquement ; peut être null si l’objet n’est plus publié
role_iduuidRôle éditorial attribué (mapper via ref_iti_assoc_role pour récupérer code/libellé)
notestring | nullCommentaire libre (ex. conseil d’étape)
created_attimestampDate de création du lien
updated_attimestampDerniè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.

Exemple
"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

ChampTypeDescription
distance_kmnumberDistance totale (km)
duration_hoursnumberDurée moyenne (h)
difficulty_levelnumberNiveau (échelle interne)
elevation_gainnumberDénivelé + (m)
is_loopbooleanBoucle ?
trackstring | nullKML/GPX (XML texte) — uniquement si demandé
track_format"kml" | "gpx" | nullFormat 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[].

ChampTypeDescription
idstringIdentifiant du type de cuisine
codestringCode fonctionnel (ex. "veggie")
namestringLibellé affiché
descriptionstring | nullDescription optionnelle
positionnumber | nullOrdre 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).

Exemple
"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.

ChampTypeDescription
idstringIdentifiant unique du document
urlstringURL de téléchargement (soumise aux contrôles de visibilité)
titlestring|nullTitre humain affichable
issuerstring|nullSource officielle
descriptionstring|nullNotes complémentaires
valid_from / valid_todate|nullPériode de validité
visibilityenum"public" ou "private"
positionnumber|nullOrdre d’affichage suggéré
tagsarray<string>Raccourcis métiers (ex. ["legal", "rse"])
Exemple
"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"]
  }
]
Agrégation

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.

ChampTypeDescription
idstringIdentifiant unique de la demande
document_idstringRéférence vers documents[] / ref_document
statusenum"requested", "received", "expired", "rejected"
requested_attimestampDate/heure de la demande
due_attimestamp|nullÉchéance attendue (optionnelle)
delivered_attimestamp|nullDate de réception de la pièce
visibilityenumAlignée sur la visibilité du document remis
requested_bystring|nullIdentité (email ou service) à l’origine de la demande
notesstring|nullCommentaire interne sur la demande
Exemple
"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é"
  }
]
Usage

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

CodeLibelléDescription
hotelHôtelÉtablissement hôtelier classique
giteGîteGîte rural, gîte d'étape
campingCampingCamping, aire de camping-car
chambre_hoteChambre d'hôteChambre d'hôte, B&B
residenceRésidenceRésidence de tourisme
aubergeAubergeAuberge de jeunesse

room_type

CodeLibelléDescription
singleChambre simple1 lit simple
doubleChambre double1 lit double
twinChambre twin2 lits simples
tripleChambre triple3 lits
familyChambre familiale4+ lits
suiteSuiteSuite de luxe

tourism_type

CodeLibelléDescription
culturalCulturelMusées, monuments, patrimoine
natureNatureParcs, randonnées, observation
adventureAventureSports extrêmes, activités
wellnessBien-êtreSpa, relaxation, thermalisme
gastronomyGastronomieDégustation, cuisine locale
businessAffairesCongrès, séminaires

ref_legal_type

CodeLibelléCatégorieDescription
SIRETSIRETbusinessNuméro SIRET de l'entreprise
SIRENSIRENbusinessNuméro SIREN de l'entreprise
VATN° TVAbusinessNuméro de TVA intracommunautaire
LICENSELicenceaccommodationLicence d'exploitation
TAX_SEJOURTaxe de séjouraccommodationEnregistrement taxe de séjour
INSURANCEAssurancebusinessPolice d'assurance
PERMITAutorisationbusinessPermis d'exploitation

legal_validity_mode

CodeLibelléDescription
fixed_end_dateDate de fin fixeLe document expire à une date précise
tacit_renewalRenouvellement taciteLe document se renouvelle automatiquement
foreverPermanentLe document n'a pas de date d'expiration

ref_capacity_metric

CodeLibelléDescription
bedsLitsNombre de lits disponibles
roomsChambresNombre de chambres
max_capacityCapacité maxCapacité maximale d'accueil
seatsPlaces assisesNombre de places assises (restaurants)
parking_spacesPlaces de parkingNombre de places de stationnement
meeting_roomsSalles de réunionNombre de salles de réunion

ref_actor_role

CodeLibelléDescription
directorDirecteurDirecteur de l'établissement
managerGestionnaireGestionnaire, responsable
receptionistRéceptionnisteAccueil, réception
guideGuideGuide touristique, accompagnateur
chefChefChef de cuisine
waiterServeurServeur, personnel de salle
maintenanceMaintenancePersonnel de maintenance
securitySécuritéAgent de sécurité

client_type

CodeLibelléDescription
individualIndividuelClient individuel
familyFamilleFamille avec enfants
business_travelerVoyageur d'affairesClient professionnel
groupGroupeGroupe organisé
seniorSéniorPersonne âgée
studentÉtudiantÉtudiant/jeune

service_type

CodeLibelléDescription
accommodationHébergementServices d'hébergement
restaurantRestaurationServices de restauration
transportTransportServices de transport
activityActivitéActivités touristiques
entertainmentDivertissementServices de divertissement
wellnessBien-êtreServices de bien-être

transport_type

CodeLibelléDescription
airplaneAvionTransport aérien
trainTrainTransport ferroviaire
busBusTransport par bus
carVoitureTransport automobile
boatBateauTransport maritime
walkingMarcheDéplacement à pied

activity_type

CodeLibelléDescription
hikingRandonnéeRandonnée pédestre
divingPlongéePlongée sous-marine
museum_visitVisite muséeVisite de musée
beachPlageActivités de plage
culturalCulturelActivités culturelles
adventureAventureSports d'aventure

destination_type

CodeLibelléDescription
urbanUrbainDestination urbaine
coastalCôtierDestination côtière
mountainMontagneDestination montagnarde
ruralRuralDestination rurale
islandÎleDestination insulaire
desertDésertDestination désertique

price_kind

CodeLibelléDescription
adulteAdulteTarif adulte
enfantEnfantTarif enfant
groupeGroupeTarif de groupe
gratuitGratuitEntrée gratuite
seniorSéniorTarif sénior
etudiantÉtudiantTarif étudiant

price_unit

CodeLibelléDescription
par_personnePar personnePrix par personne
par_nuitPar nuitPrix par nuitée
par_heurePar heurePrix par heure
par_jourPar jourPrix par jour
forfaitForfaitPrix forfaitaire
gratuitGratuitEntrée gratuite

season_type

CodeLibelléDescription
high_seasonHaute saisonPériode de haute saison
low_seasonBasse saisonPériode de basse saison
winterHiverSaison hivernale
summerÉtéSaison estivale
cyclone_seasonSaison cycloniquePériode cyclonique
shoulder_seasonMi-saisonPériode intermédiaire

promotion_type

CodeLibelléDescription
early_bookingRéservation anticipéeRéduction réservation anticipée
last_minuteDernière minuteOffre dernière minute
loyaltyFidélitéRéduction fidélité
groupGroupeRéduction groupe
seasonalSaisonnièreOffre saisonnière
packageForfaitRéduction forfait

package_type

CodeLibelléDescription
all_inclusiveTout inclusForfait tout inclus
half_boardDemi-pensionHébergement + petit-déjeuner + dîner
full_boardPension complèteHébergement + tous les repas
flight_hotelVol + HôtelForfait transport + hébergement
activity_packageForfait activitéHébergement + activités
romanticRomantiqueForfait romantique

cuisine_type

CodeLibelléDescription
creoleCréoleCuisine créole locale
metropolitanMétropolitaineCuisine française métropolitaine
veganVéganCuisine végétalienne
vegetarianVégétarienneCuisine végétarienne
seafoodFruits de merCuisine de fruits de mer
localLocaleCuisine locale traditionnelle

menu_category

CodeLibelléDescription
entreeEntréePlats d'entrée
mainPlat principalPlats principaux
dessertDessertDesserts
drinkBoissonBoissons
appetizerAmuse-boucheAmuse-bouches
sideAccompagnementAccompagnements

dietary_tag

CodeLibelléDescription
vegetarianVégétarienConvient aux végétariens
veganVéganConvient aux végans
halalHalalCertifié halal
kosherCasherCertifié casher
gluten_freeSans glutenSans gluten
lactose_freeSans lactoseSans lactose

allergen

CodeLibelléDescription
glutenGlutenContient du gluten
dairyLaitContient des produits laitiers
nutsNoixContient des noix
eggsŒufsContient des œufs
soySojaContient du soja
shellfishCrustacésContient des crustacés

event_type

CodeLibelléDescription
festivalFestivalFestival culturel
conferenceConférenceConférence professionnelle
weddingMariageCérémonie de mariage
exhibitionExpositionExposition artistique
concertConcertConcert musical
sportSportÉvénement sportif

iti_practice

CodeLibelléDescription
randonnee_pedestreRandonnée pédestreRandonnée à pied
velo_vttVélo/VTTCyclisme et VTT
equitationÉquitationRandonnée équestre
kayakKayakNavigation en kayak
plongeePlongéePlongée sous-marine
escaladeEscaladeEscalade et varappe

contact_kind

CodeLibelléDescription
phoneTéléphoneNuméro de téléphone
emailEmailAdresse email
whatsappWhatsAppContact WhatsApp
websiteSite webSite internet
addressAdresseAdresse physique
faxFaxNuméro de fax

social_network

CodeLibelléDescription
facebookFacebookPage Facebook
instagramInstagramCompte Instagram
youtubeYouTubeChaîne YouTube
twitterTwitterCompte Twitter
linkedinLinkedInPage LinkedIn
tiktokTikTokCompte TikTok

media_type

CodeLibelléDescription
photoPhotoImage photographique
videoVidéoVidéo
logoLogoLogo de l'établissement
brochure_pdfBrochure PDFDocument PDF
audioAudioFichier audio
panoramaPanoramaImage panoramique

environment_tag

CodeLibelléDescription
plagePlageEnvironnement de plage
montagneMontagneEnvironnement montagnard
patrimoinePatrimoineSite patrimonial
foretForêtEnvironnement forestier
urbainUrbainEnvironnement urbain
ruralRuralEnvironnement rural

amenity_family

CodeLibelléDescription
comfortsConfortsÉquipements de confort
servicesServicesServices proposés
outdoorExtérieurÉquipements extérieurs
sportsSportsÉquipements sportifs
wellnessBien-êtreÉquipements bien-être
businessAffairesÉquipements professionnels

ref_object_relation_type

CodeLibelléDescription
parent_ofParent deRelation parent-enfant
part_ofPartie deFait partie de
partner_ofPartenaire dePartenariat commercial
near_toPrès deProximité géographique
managed_byGéré parGestion administrative
owned_byPropriété dePropriété

ref_classification_scheme

CodeLibelléDescription
hot_starsÉtoiles hôtelClassification hôtelière
tourisme_handicapTourisme & HandicapLabel accessibilité
eco_labelÉcolabelCertification environnementale
quality_labelLabel qualitéLabel de qualité
heritagePatrimoineClassification patrimoniale
gastronomyGastronomieLabel gastronomique

insurance_type

CodeLibelléDescription
travelVoyageAssurance voyage
medicalMédicaleAssurance médicale
cancellationAnnulationAssurance annulation
liabilityResponsabilitéAssurance responsabilité
propertyBiensAssurance des biens
activityActivitéAssurance activité

assistance_type

CodeLibelléDescription
customer_serviceService clientAssistance clientèle
emergencyUrgenceAssistance d'urgence
legalLégaleAssistance juridique
medicalMédicaleAssistance médicale
technicalTechniqueAssistance technique
conciergeConciergerieService de conciergerie

feedback_type

CodeLibelléDescription
online_reviewAvis en ligneAvis client en ligne
complaintPlaintePlainte client
suggestionSuggestionSuggestion d'amélioration
complimentComplimentFélicitation client
ratingNoteÉvaluation numérique
surveyEnquêteEnquête de satisfaction

partnership_type

CodeLibelléDescription
hotelHôtelPartenariat hôtelier
airlineCompagnie aériennePartenariat aérien
local_businessCommerce localPartenariat local
tour_operatorTour-opérateurPartenariat tour-opérateur
restaurantRestaurantPartenariat restauration
activity_providerPrestataire d'activitésPartenariat 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_color pour 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_prefs prend un ordre de préférence (ex. ["en","fr"]).
  • Si un champ n’existe pas, attendez-vous à [], {} ou null suivant le bloc.

Deep Data & Performance

  • Utilisez les fonctions Deep Data pour éviter les appels multiples.
  • Activez render: true pour des données formatées prêtes à l'affichage.
  • Utilisez fields et include pour limiter les données retournées.

Recherches spécialisées

  • Préférez search_restaurants_by_cuisine aux filtres génériques.
  • Utilisez search_events_by_restaurant_cuisine pour 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[] et outgoing_relations[] : relations séparées par sens.

Options avancées

  • org_object_id : priorise les descriptions d'une organisation spécifique.
  • render_locale et render_tz : contrôlent le formatage des données.
  • include_private : accès aux données privées (nécessite permissions).