{"openapi":"3.1.0","info":{"title":"API publique de Pausila","version":"1.0.0","summary":"Praticiens de bien-être corporel, pratiques, prix et guides de pausila.fr, en lecture seule.","description":"API ouverte : sans clé, sans compte, sans inscription. Lecture seule (GET), réponses en JSON. Les données sont celles des pages publiques de https://pausila.fr. Aucune adresse ne réserve : la réservation se fait sur la page du profil. Limite : 60 appels par heure, par adresse IP et par adresse de l'API. Version : les adresses /api/v1 gardent leurs paramètres et leurs champs ; un changement incompatible passe par /api/v2. Les mêmes outils existent en serveur MCP : https://pausila.fr/mcp.","contact":{"name":"Pausila","url":"https://pausila.fr/developpeurs"}},"servers":[{"url":"https://pausila.fr"}],"externalDocs":{"description":"Documentation","url":"https://pausila.fr/developpeurs"},"security":[],"paths":{"/api/v1/recommend-practice":{"get":{"operationId":"recommend_practice","summary":"Questionnaire : quelle pratique","description":"À utiliser quand une personne ne sait pas quelle pratique choisir. Retourne, question après question, le questionnaire de Pausila, le même que https://pausila.fr/quiz : la personne dit ce qu'elle ressent, le nom de la pratique arrive à la fin. Appeler sans réponse pour recevoir la première question, puis rappeler en ajoutant l'identifiant de chaque réponse choisie. Au bout du chemin : la pratique proposée, ses pratiques proches et ce qu'il faut savoir avant. Poser les questions à la personne, ne pas répondre à sa place. Ce n'est pas un avis médical.","parameters":[{"name":"answers","in":"query","required":false,"description":"Identifiants des réponses déjà données, dans l'ordre (ex. ['douleur', 'dos']). Vide ou absent : première question.","schema":{"maxItems":12,"type":"array","items":{"type":"string","minLength":1,"maxLength":40}}}],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"etape":{"type":"string","enum":["question","resultat"]},"chemin_lu":{"type":"array","items":{"type":"string"},"description":"Réponses reconnues, dans l'ordre."},"question":{"description":"Étape `question` : la question à poser.","type":"object","properties":{"id":{"type":"string"},"titre":{"type":"string"},"reponses":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"}},"required":["id","label"],"additionalProperties":{}}}},"required":["id","titre","reponses"],"additionalProperties":{}},"reponse_inconnue":{"type":"object","properties":{},"additionalProperties":{}},"pratique":{"description":"Étape `resultat` : la pratique proposée.","type":"object","properties":{"slug":{"type":"string"},"nom":{"type":"string"},"description":{"type":["string","null"]}},"required":["slug","nom","description"],"additionalProperties":{}},"pratiques_proches":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"nom":{"type":"string"}},"required":["slug","nom"],"additionalProperties":{}}},"a_savoir_avant":{},"suite":{"type":"string","description":"Appel suivant à faire."},"url":{"type":"string"}},"required":["etape","chemin_lu","suite"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/search-practitioners":{"get":{"operationId":"search_practitioners","summary":"Rechercher des praticiens","description":"À utiliser quand une personne cherche un praticien dans une ville ou pour une pratique. Recherche des praticiens de massage bien-être Pausila publiés, avec filtres optionnels par ville, code postal, massage ou pratique (slug), ou 'femme pour femme' (accueil réservé aux femmes, déclaré par le profil ; le genre de la personne qui masse n'est pas déclaré). Retourne au maximum 20 profils avec slug, nom, ville, massages et pratiques, et note Google.","parameters":[{"name":"ville","in":"query","required":false,"description":"Filtre exact sur la ville (insensible à la casse).","schema":{"type":"string","minLength":1,"maxLength":80}},{"name":"code_postal","in":"query","required":false,"description":"Filtre exact sur le code postal FR.","schema":{"type":"string","minLength":2,"maxLength":10}},{"name":"specialty_slug","in":"query","required":false,"description":"Slug d'un massage ou d'une pratique (ex: 'drainage-lymphatique', 'kobido', 'tantrique').","schema":{"type":"string","minLength":2,"maxLength":80}},{"name":"femme_uniquement","in":"query","required":false,"description":"Ne renvoyer que les profils « femme pour femme » : accueil réservé aux femmes, déclaré par le profil. Ne filtre pas sur le genre de la personne qui masse.","schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"description":"Nombre maximum de résultats (défaut 10).","schema":{"type":"integer","minimum":1,"maximum":20}}],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"count":{"type":"number","description":"Nombre de profils rendus."},"results":{"type":"array","items":{"type":"object","properties":{"slug":{"type":["string","null"]},"nom":{"type":["string","null"]},"cabinet":{"type":["string","null"]},"ville":{"type":["string","null"]},"google_rating":{"type":["number","null"]},"google_rating_count":{"type":["number","null"]},"specialties":{"type":"array","items":{"type":"string"}},"profile_url":{"type":"string"}},"required":["slug","nom","cabinet","ville","google_rating","google_rating_count","specialties","profile_url"],"additionalProperties":{}},"description":"Profils : slug, nom, ville, pratiques, note de la fiche Google, adresse du profil."}},"required":["count","results"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/get-practitioner":{"get":{"operationId":"get_practitioner","summary":"Détails d'un praticien","description":"À utiliser quand une personne veut le détail d'un praticien trouvé avec `search_practitioners` : prestations, prix, lieu. Retourne les détails publics du profil d'un praticien Pausila à partir de son slug (ex. 'admin-test-58310') : pratiques, prestations actives, communes de pratique et adresse du profil public. Pour chaque prestation : identifiant, nom, durée en minutes, prix en euros, `au_cabinet` (la personne vient chez le praticien), `a_domicile` (le praticien se déplace) et, à domicile, `frais_deplacement_eur`, qui remplacent le prix du déplacement (0 : déplacement offert ; au cabinet, aucun frais). La note Google est celle de la fiche Google du praticien, pas un avis Pausila. Aucune rue ni code postal. La réservation se fait sur la page du profil.","parameters":[{"name":"slug","in":"query","required":true,"description":"Slug du profil praticien.","schema":{"type":"string","minLength":1,"maxLength":120}}],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"slug":{"type":["string","null"]},"display_name":{"type":["string","null"]},"nom":{"type":["string","null"]},"cabinet":{"type":["string","null"]},"ville":{"type":["string","null"]},"editorial_summary":{"description":"Présentation du profil.","type":["string","null"]},"serves_female_only":{"description":"Accueil réservé aux femmes, déclaré par le profil.","type":["boolean","null"]},"style_tags":{},"practicing_since_year":{"type":["number","null"]},"practitioner_specialties":{"type":"array","items":{"type":"object","properties":{"specialty":{"type":"string"}},"required":["specialty"],"additionalProperties":{}},"description":"Pratiques déclarées."},"note_google":{"anyOf":[{"type":"object","properties":{"note":{"type":"number"},"nombre_avis":{"type":["number","null"]},"source":{"type":"string"}},"required":["note","nombre_avis","source"],"additionalProperties":{}},{"type":"null"}],"description":"Note de la fiche Google du praticien, pas un avis Pausila."},"practitioner_services":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"duration_min":{"type":["number","null"]},"price_eur":{"type":["number","null"]},"price_currency":{"type":["string","null"]},"au_cabinet":{"type":"boolean"},"a_domicile":{"type":"boolean"},"frais_deplacement_eur":{"type":["number","null"]}},"required":["id","name","duration_min","price_eur","price_currency","au_cabinet","a_domicile","frais_deplacement_eur"],"additionalProperties":{}},"description":"Prestations actives."},"practitioner_locations":{"type":"array","items":{"type":"object","properties":{"location_type":{"type":["string","null"]},"ville":{"type":["string","null"]}},"required":["location_type","ville"],"additionalProperties":{}},"description":"Communes de pratique, sans rue ni code postal."},"profile_url":{"type":"string","description":"Page du profil, où se fait la réservation."}},"required":["slug","display_name","nom","cabinet","ville","editorial_summary","serves_female_only","style_tags","practicing_since_year","practitioner_specialties","note_google","practitioner_services","practitioner_locations","profile_url"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/list-specialties":{"get":{"operationId":"list_specialties","summary":"Lister les massages et pratiques","description":"À utiliser pour connaître les pratiques proposées et leurs slugs, avant une recherche de praticiens. Retourne la liste canonique des massages et pratiques proposés sur Pausila (nom, slug, catégorie). Utile pour choisir un `specialty_slug` valide avant d'appeler `search_practitioners`.","parameters":[],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"count":{"type":"number","description":"Nombre de pratiques."},"specialties":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"nom":{"type":"string"},"category_slug":{"type":["string","null"]}},"required":["slug","nom","category_slug"],"additionalProperties":{}},"description":"Pratiques publiées : slug, nom, catégorie."}},"required":["count","specialties"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/get-price-barometer":{"get":{"operationId":"get_price_barometer","summary":"Prix affichés d'une séance","description":"À utiliser quand une personne demande combien coûte une séance. Retourne le relevé des prix affichés par les praticiens sur Pausila, le même que https://pausila.fr/tarif-massage : prix médian et quartiles en euros par durée, et pour une heure par pratique, par région (Île-de-France ou reste de la France) et par lieu. Chaque chiffre porte sa date de relevé et le nombre de praticiens comptés. Aucun prix par ville. Ces prix décrivent les praticiens présents sur Pausila, pas le marché français.","parameters":[],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"releve_le":{"type":"string","description":"Date du relevé."},"phrase_citable":{"type":"string","description":"Phrase prête à citer, avec sa date."},"par_duree":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}},"description":"Prix médian et quartiles en euros, par durée."},"une_heure_par_pratique":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}},"description":"Prix d'une heure, par pratique."},"une_heure_par_region":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}},"description":"Prix d'une heure : Île-de-France, reste de la France."},"une_heure_par_lieu":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}},"description":"Prix d'une heure : au cabinet, à domicile."},"methode":{"description":"Méthode du relevé."},"limites":{"description":"Limites du relevé."},"url":{"type":"string","description":"Page du relevé."}},"required":["releve_le","phrase_citable","par_duree","une_heure_par_pratique","une_heure_par_region","une_heure_par_lieu","methode","limites","url"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/get-guided-massage":{"get":{"operationId":"get_guided_massage","summary":"Massage guidé, geste par geste","description":"À utiliser quand une personne veut masser quelqu'un chez elle ou se masser elle-même, geste par geste. Retourne les gestes du massage guidé de Pausila, pour masser quelqu'un chez soi (`a_deux`, https://pausila.fr/comment-faire-un-massage) ou se masser soi-même (`soi_meme`, https://pausila.fr/automassage). Sans `zone` : la liste des zones et leur durée. Avec `zone` : le matériel, chaque geste avec sa durée en secondes, ce qu'il ne faut pas faire et les précautions à dire avant de commencer. Les durées sont des repères. Aucun effet de soin n'est promis ; une douleur qui dure se montre à un professionnel de santé.","parameters":[{"name":"mode","in":"query","required":true,"description":"`a_deux` : masser quelqu'un. `soi_meme` : automassage.","schema":{"type":"string","enum":["a_deux","soi_meme"]}},{"name":"zone","in":"query","required":false,"description":"Identifiant de la zone (ex. 'dos', 'nuque'). Absent : liste des zones du mode.","schema":{"type":"string","minLength":1,"maxLength":40}}],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mode":{"type":"string","description":"`a_deux` ou `soi_meme`."},"zones":{"description":"Sans `zone` : les zones du mode.","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"nom":{"type":"string"},"pour_quel_moment":{"type":"string"},"duree_secondes":{"type":"number"}},"required":["id","nom","pour_quel_moment","duree_secondes"],"additionalProperties":{}}},"zone_inconnue":{"type":"string"},"zone":{"type":"string"},"nom":{"type":"string"},"pour_quel_moment":{"type":"string"},"materiel":{},"duree_secondes":{"type":"number"},"precautions":{"description":"À dire avant de commencer."},"gestes":{"description":"Avec `zone` : chaque geste et sa durée.","type":"array","items":{"type":"object","properties":{"titre":{"type":"string"},"texte":{"type":"string"},"secondes":{"type":"number"}},"required":["titre","texte","secondes"],"additionalProperties":{}}},"a_eviter":{},"url":{"type":"string","description":"Page du massage guidé."}},"required":["mode","url"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/search-schools":{"get":{"operationId":"search_schools","summary":"Rechercher des écoles de formation","description":"À utiliser quand une personne cherche une école ou une formation au massage, à la réflexologie ou aux soins énergétiques. Recherche dans l'annuaire des écoles et organismes de formation au massage, à la réflexologie et aux soins énergétiques (https://pausila.fr/formations-massage), par pratique enseignée, ville, département, pays ou fédération. Retourne au maximum 20 écoles : nom, ville, site, pratiques relevées sur le site de l'école et adhésions affichées. L'annuaire est établi à partir d'informations publiques : Pausila ne certifie aucune école, ne vérifie pas les adhésions et ne touche aucune commission.","parameters":[{"name":"pratique","in":"query","required":false,"description":"Slug ou nom d'une pratique enseignée (ex. 'shiatsu', 'réflexologie').","schema":{"type":"string","minLength":2,"maxLength":80}},{"name":"ville","in":"query","required":false,"description":"Ville exacte de l'école.","schema":{"type":"string","minLength":1,"maxLength":80}},{"name":"departement","in":"query","required":false,"description":"Code du département français (ex. '69', '2A').","schema":{"type":"string","minLength":2,"maxLength":3}},{"name":"pays","in":"query","required":false,"description":"Code pays ISO à deux lettres (ex. 'FR', 'BE', 'CH').","schema":{"type":"string","minLength":2,"maxLength":2}},{"name":"federation","in":"query","required":false,"description":"Slug d'une fédération, d'un syndicat ou d'une certification (liste : https://pausila.fr/formations-massage/federations).","schema":{"type":"string","minLength":2,"maxLength":60}},{"name":"limit","in":"query","required":false,"description":"Nombre maximum (défaut 10).","schema":{"type":"integer","minimum":1,"maximum":20}}],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"total":{"type":"number","description":"Écoles trouvées en tout."},"count":{"type":"number","description":"Écoles rendues."},"results":{"type":"array","items":{"type":"object","properties":{"nom":{"type":"string"},"description":{"type":["string","null"]},"ville":{"type":["string","null"]},"departement":{"type":["string","null"]},"pays":{"type":["string","null"]},"site":{"type":["string","null"]},"pratiques_relevees":{"type":"array","items":{"type":"string"}},"pratiques_relevees_le":{"type":["string","null"]},"adhesions_affichees":{"type":"array","items":{"type":"string"}},"url":{"type":"string"}},"required":["nom","description","ville","departement","pays","site","pratiques_relevees","pratiques_relevees_le","adhesions_affichees","url"],"additionalProperties":{}},"description":"Écoles : nom, ville, site, pratiques relevées, adhésions affichées."}},"required":["total","count","results"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/search-site":{"get":{"operationId":"search_site","summary":"Chercher dans tout le site","description":"À utiliser pour trouver une page du site (guide, article, pratique, ville, outil, glossaire) à partir de mots. Recherche plein texte dans les pages publiques de https://pausila.fr, le même index que https://pausila.fr/recherche : guides du corps et du bien-être, articles, pages de pratique et de prix, villes, outils gratuits, glossaire, pages pour les praticiens, et les sources citées par les guides (titre, éditeur, date). Retourne au maximum 20 pages (titre, description, rubrique, adresse ; pour une ville ou une pratique, `praticiens` : l'annuaire filtré dessus), la plus proche d'abord. Les profils de praticiens ne sont pas dans cet index : utiliser `search_practitioners`.","parameters":[{"name":"q","in":"query","required":true,"description":"Mots cherchés (ex. 'mal de dos', 'shiatsu', 'bon cadeau').","schema":{"type":"string","minLength":2,"maxLength":100}},{"name":"rubrique","in":"query","required":false,"description":"Limiter à une rubrique : guides, articles, pratiques, villes, outils, glossaire, praticiens, sources.","schema":{"type":"string","enum":["guides","articles","pratiques","villes","outils","glossaire","praticiens","sources"]}},{"name":"limit","in":"query","required":false,"description":"Nombre maximum (défaut 10).","schema":{"type":"integer","minimum":1,"maximum":20}}],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"total":{"type":"number","description":"Pages trouvées en tout."},"count":{"type":"number","description":"Pages rendues."},"par_rubrique":{"description":"Nombre de pages par rubrique."},"results":{"type":"array","items":{"type":"object","properties":{"titre":{"type":"string"},"description":{"type":["string","null"]},"rubrique":{"type":"string"},"url":{"type":"string"},"praticiens":{"type":"string"}},"required":["titre","description","rubrique","url"],"additionalProperties":{}},"description":"Pages, la plus proche d'abord."}},"required":["total","count","par_rubrique","results"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/get-practitioner-slots":{"get":{"operationId":"get_practitioner_slots","summary":"Créneaux libres d'un praticien","description":"À utiliser quand une personne veut savoir quand un praticien est libre. Retourne les prochains créneaux libres d'un praticien Pausila, sur les 14 jours à venir, calculés comme dans la fenêtre de réservation du site : horaires d'ouverture, rendez-vous déjà pris, congés, délai de prévenance et agenda externe du praticien. `mode` : `reception` (au cabinet) ou `travel` (le praticien se déplace). `service_id` : identifiant d'une prestation lu avec `get_practitioner` ; sans lui, la prestation la plus courte du mode ; une prestation inconnue ou absente de ce mode rend une erreur qui liste les prestations actives. Heures de Paris. Un créneau libre au moment de la lecture peut être pris ensuite : la réservation se fait sur la page du profil, qui vérifie le créneau au clic. Aucune réservation par cet outil.","parameters":[{"name":"slug","in":"query","required":true,"description":"Slug du profil praticien.","schema":{"type":"string","minLength":1,"maxLength":120}},{"name":"mode","in":"query","required":false,"description":"`reception` : au cabinet. `travel` : le praticien se déplace.","schema":{"default":"reception","type":"string","enum":["reception","travel"]}},{"name":"service_id","in":"query","required":false,"description":"Identifiant de la prestation (get_practitioner).","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"limit","in":"query","required":false,"description":"Nombre de créneaux, 8 au plus (défaut 5).","schema":{"type":"integer","minimum":1,"maximum":8}}],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mode":{"type":"string","enum":["reception","travel"]},"prestation":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"nom":{"type":"string"},"duree_min":{"type":["number","null"]}},"required":["id","nom","duree_min"],"additionalProperties":{}},{"type":"null"}],"description":"Prestation retenue pour le calcul."},"creneaux":{"type":"array","items":{"type":"object","properties":{"debut":{"type":"string"},"jour":{"type":"string"},"libelle_jour":{"type":"string"},"heure":{"type":"string"}},"required":["debut","jour","libelle_jour","heure"],"additionalProperties":{}},"description":"Créneaux libres, heures de Paris."},"confirmation":{"type":"string","description":"« immédiate » ou « après accord du praticien »."},"agenda_externe":{"type":"string"},"aucune_prestation":{"type":"string"},"fuseau":{"type":"string"},"reserver":{"type":"string","description":"Page du profil, où se fait la réservation."}},"required":["mode","prestation","creneaux","confirmation","fuseau","reserver"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/get-practice-city-facts":{"get":{"operationId":"get_practice_city_facts","summary":"Prix et durée d'une pratique dans une ville","description":"À utiliser quand une personne demande le prix ou la durée d'une pratique dans une ville précise. Retourne l'encadré « En chiffres » d'une page pratique × ville de Pausila (ex. https://pausila.fr/massage-shiatsu/lyon) : nombre de praticiens réservables listés sur la page, fourchette de prix d'une heure de séance en euros (du 10e au 90e centile des prix médians de chaque praticien, prestations de 55 à 65 min) et durée la plus courante, avec la date du relevé. Les chiffres ne paraissent qu'à partir de 3 praticiens sur la page, et la fourchette de prix à partir de 3 praticiens qui affichent un prix pour une heure : en dessous, la valeur est nulle. Ces chiffres décrivent les praticiens présents sur Pausila, pas le marché de la ville. Slugs : `list_specialties` pour la pratique, nom de la commune en minuscules sans accents pour la ville (ex. 'saint-etienne').","parameters":[{"name":"pratique","in":"query","required":true,"description":"Slug de la pratique (ex. 'shiatsu', 'californien').","schema":{"type":"string","minLength":1,"maxLength":80}},{"name":"ville","in":"query","required":true,"description":"Slug de la commune (ex. 'lyon', 'saint-etienne').","schema":{"type":"string","minLength":1,"maxLength":80}}],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trouve":{"description":"Présent quand aucune page n'existe pour cette paire.","type":"boolean","const":false},"page_dediee":{"type":"string"},"message":{"type":"string"},"pratique":{"type":"string"},"ville":{"type":"string"},"praticiens_sur_la_page":{"type":"number"},"url":{"description":"Page pratique × ville.","type":"string"},"chiffres":{"description":"Nul sous le seuil de praticiens.","anyOf":[{"type":"object","properties":{"releve_le":{"type":"string"},"praticiens_reservables":{"type":"number"},"une_heure_prix_bas_eur":{"type":["number","null"]},"une_heure_prix_haut_eur":{"type":["number","null"]},"duree_la_plus_courante_min":{"type":["number","null"]},"lignes":{"type":"array","items":{"type":"string"}}},"required":["releve_le","praticiens_reservables","une_heure_prix_bas_eur","une_heure_prix_haut_eur","duree_la_plus_courante_min","lignes"],"additionalProperties":{}},{"type":"null"}]}},"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/get-practitioner-reviews":{"get":{"operationId":"get_practitioner_reviews","summary":"Avis d'un praticien","description":"À utiliser quand une personne veut lire les avis d'un praticien avant de réserver. Retourne les avis publics d'un praticien Pausila, en deux blocs séparés qui ne se fondent jamais en une seule note. `avis_pausila` : avis laissés sur Pausila après un rendez-vous réservé sur Pausila (moyenne, nombre, 10 plus récents, réponse du praticien). `avis_google` : note et extraits de la fiche Google du praticien, recopiés par Pausila et non lus en direct, avec la date de chaque avis ; ce ne sont pas des avis Pausila et Pausila ne les vérifie pas. Les avis signalés ne sont pas rendus. Aucun nom de client.","parameters":[{"name":"slug","in":"query","required":true,"description":"Slug du profil praticien.","schema":{"type":"string","minLength":1,"maxLength":120}}],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"avis_pausila":{"type":"object","properties":{"source":{"type":"string"},"nombre":{"type":"number"},"moyenne_sur_5":{"type":["number","null"]},"dernier_avis_le":{"type":["string","null"]},"avis":{"type":"array","items":{"type":"object","properties":{"etoiles":{"type":"number"},"commentaire":{"type":["string","null"]},"date":{"type":"string"},"reponse_du_praticien":{"type":["string","null"]}},"required":["etoiles","commentaire","date","reponse_du_praticien"],"additionalProperties":{}}}},"required":["source","nombre","moyenne_sur_5","dernier_avis_le","avis"],"additionalProperties":{},"description":"Avis laissés sur Pausila après un rendez-vous."},"avis_google":{"anyOf":[{"type":"object","properties":{"source":{"type":"string"},"note_sur_5":{"type":["number","null"]},"nombre":{"type":["number","null"]},"fiche_google":{"type":["string","null"]},"extraits":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["source","note_sur_5","nombre","fiche_google","extraits"],"additionalProperties":{}},{"type":"null"}],"description":"Note et extraits de la fiche Google, recopiés ; nul sans fiche."},"url":{"type":"string","description":"Page du profil."}},"required":["avis_pausila","avis_google","url"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/get-guided-pause":{"get":{"operationId":"get_guided_pause","summary":"Pause au travail guidée","description":"À utiliser quand une personne veut une pause de 5 minutes à son poste de travail. Retourne les trois pauses guidées de 5 minutes de Pausila, à faire à son poste, sans personne (https://pausila.fr/pause-au-travail) : `respirer` (respiration lente souvent appelée « cohérence cardiaque » : 5 secondes d'inspiration, 5 secondes d'expiration, 30 respirations, https://pausila.fr/coherence-cardiaque), `nuque` (automassage de la nuque et des épaules sur sa chaise, en vêtements) et `etirer` (se lever et s'étirer). Sans `pause` : la liste. Avec `pause` : matériel, installation, chaque étape avec sa durée en secondes, ce qu'il ne faut pas faire et les sources des gestes. Aucun effet de soin n'est promis ; une douleur ou un stress qui dure se montre à un médecin.","parameters":[{"name":"pause","in":"query","required":false,"description":"Identifiant de la pause. Absent : liste des trois pauses.","schema":{"type":"string","enum":["respirer","nuque","etirer"]}}],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"pauses":{"description":"Sans `pause` : les trois pauses.","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"nom":{"type":"string"},"comment":{"type":"string"},"duree_secondes":{"type":"number"}},"required":["id","nom","comment","duree_secondes"],"additionalProperties":{}}},"pause":{"type":"string"},"nom":{"type":"string"},"comment":{"type":"string"},"materiel":{},"duree_secondes":{"type":"number"},"rythme":{"type":"object","properties":{"inspiration_secondes":{"type":"number"},"expiration_secondes":{"type":"number"},"respirations":{"type":"number"}},"required":["inspiration_secondes","expiration_secondes","respirations"],"additionalProperties":{}},"installation":{},"etapes":{"description":"Avec `pause` : chaque étape et sa durée.","type":"array","items":{"type":"object","properties":{"titre":{"type":"string"},"texte":{"type":"string"},"secondes":{"type":"number"}},"required":["titre","texte","secondes"],"additionalProperties":{}}},"a_eviter":{},"sources":{"type":"array","items":{"type":"object","properties":{"titre":{"type":"string"},"editeur":{"type":"string"},"url":{"type":"string"}},"required":["titre","editeur","url"],"additionalProperties":{}}},"sources_lues_le":{"type":"string"},"url":{"type":"string","description":"Page de la pause."}},"required":["url"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/compute-session-price":{"get":{"operationId":"compute_session_price","summary":"Calculateur de prix de séance (praticien)","description":"À utiliser quand un praticien en micro-entreprise cherche le prix minimum à demander pour une séance. Calcule et retourne le prix minimum d'une séance pour un praticien en micro-entreprise, avec la règle de https://pausila.fr/professionnels/calculateur-tarif : revenu mensuel voulu, charges, coût de chaque séance et cotisations (prélevées sur le chiffre d'affaires) donnent le chiffre d'affaires annuel nécessaire et le prix minimum, arrondi à l'euro supérieur. Dit aussi où en est la TVA (franchise jusqu'à 37500 € de chiffre d'affaires de services, due dès le dépassement au-delà de 41250 €) et le prix TVA comprise quand elle est due. Taux relevés le 15 octobre 2026 sur service-public.fr. Un repère de calcul, pas un conseil comptable ni juridique.","parameters":[{"name":"revenu_mensuel","in":"query","required":true,"description":"Revenu à garder chaque mois, après cotisations et charges, en euros.","schema":{"type":"number","minimum":0,"maximum":100000}},{"name":"semaines_par_an","in":"query","required":true,"description":"Semaines travaillées par an.","schema":{"type":"number","minimum":1,"maximum":52}},{"name":"seances_par_semaine","in":"query","required":true,"description":"Séances par semaine.","schema":{"type":"number","minimum":1,"maximum":100}},{"name":"charges_mensuelles","in":"query","required":false,"description":"Loyer, assurance, téléphone, site… par mois, en euros.","schema":{"default":0,"type":"number","minimum":0,"maximum":100000}},{"name":"cout_par_seance","in":"query","required":false,"description":"Huile, linge, lavage… par séance, en euros.","schema":{"default":0,"type":"number","minimum":0,"maximum":1000}},{"name":"statut","in":"query","required":false,"description":"`bnc` : activité libérale non réglementée. `bic` : prestations de services commerciales.","schema":{"default":"bnc","type":"string","enum":["bnc","bic"]}},{"name":"versement_liberatoire","in":"query","required":false,"description":"Option pour le versement libératoire de l'impôt sur le revenu.","schema":{"default":false,"type":"boolean"}},{"name":"deja_redevable_tva","in":"query","required":false,"description":"Déjà redevable de la TVA (plus de 37 500 € l'an dernier, ou option).","schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"resultat":{"description":"Présent et nul quand il n'y a rien à calculer.","type":"null"},"message":{"type":"string"},"statut":{"description":"Statut retenu.","type":"string"},"taux_prelevements":{"description":"Taux de cotisations appliqué au chiffre d'affaires.","type":"number"},"seances_par_an":{"type":"number"},"chiffre_affaires_annuel_eur":{"type":"number"},"cotisations_annuelles_eur":{"type":"number"},"charges_annuelles_eur":{"type":"number"},"prix_minimum_hors_tva_eur":{"description":"Prix minimum d'une séance, arrondi à l'euro supérieur.","type":"number"},"situation_tva":{"type":"string"},"prix_minimum_tva_comprise_eur":{"type":["number","null"]},"tva_due":{"description":"« maintenant », « au 1er janvier suivant » ou « non (franchise) ».","type":"string"},"taux_releves_le":{"type":"string"},"source":{"description":"Source des taux."},"url":{"type":"string","description":"Page du calculateur."}},"required":["url"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}},"/api/v1/check-presentation-text":{"get":{"operationId":"check_presentation_text","summary":"Vérificateur de texte de présentation (praticien)","description":"À utiliser quand un praticien veut faire relire le texte de présentation de son profil ou de son site. Relit le texte de présentation d'un praticien de bien-être corporel avec les règles de https://pausila.fr/professionnels/verificateur-texte : promesse de soin, mot ou titre réglementé, caution scientifique, terme à connotation sexuelle et, pour un profil Pausila (`cible` = `pausila`), coordonnées en clair. Rend chaque repère avec sa phrase, le mot trouvé et un conseil, plus trois conseils généraux au plus. 4000 caractères au plus. Des repères d'écriture, jamais un avis juridique ni un jugement. Le texte n'est pas conservé.","parameters":[{"name":"texte","in":"query","required":true,"description":"Texte de présentation à relire.","schema":{"type":"string","minLength":1,"maxLength":4000}},{"name":"cible","in":"query","required":false,"description":"`pausila` : profil Pausila (les coordonnées sont signalées). `ailleurs` : site, réseau social.","schema":{"default":"pausila","type":"string","enum":["pausila","ailleurs"]}}],"responses":{"200":{"description":"Réponse de l'outil.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mots":{"type":"number","description":"Nombre de mots du texte."},"reperes":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"phrase":{"type":"string"},"trouve":{"type":"string"},"conseil":{"type":"string"}},"required":["type","phrase","trouve","conseil"],"additionalProperties":{}},"description":"Repères : type, phrase concernée, mot trouvé, conseil."},"conseils":{"type":"array","items":{"type":"string"},"description":"Conseils généraux, trois au plus."},"url":{"type":"string","description":"Page de l'outil."}},"required":["mots","reperes","conseils","url"],"additionalProperties":{}}}}},"400":{"description":"Paramètre manquant, inconnu ou invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Trop d'appels : 60 par heure, par adresse IP et par adresse de l'API.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Erreur du serveur.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[]}}},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","hint"],"properties":{"code":{"type":"string","enum":["invalid_request","not_found","rate_limited","method_not_allowed","server_error"],"description":"Code stable de l'erreur."},"message":{"type":"string","description":"Ce qui s'est passé."},"hint":{"type":"string","description":"Quoi faire pour que l'appel passe."},"docs":{"type":"string","format":"uri","description":"Documentation de l'API."}}}}}}}}