API & agents IA
Ce site est fait pour être lu et cité par les assistants IA. Cette page documente ses interfaces machine : comment obtenir le contenu des pages en Markdown, comment déposer une demande de devis, et où trouver le catalogue d'API. Tout est public : pas besoin de clé, de compte ni d'inscription.
Découverte
L'accueil renvoie un en-tête HTTP Link (RFC 8288) et les <head> de toutes les pages portent les mêmes relations en balises <link>. Les relations employées sont enregistrées à l'IANA : api-catalog, service-desc, service-doc, service-meta, status et describedby.
curl -sI https://alpilles-renovation.fr/ | grep -i '^link:'
curl -s -H 'Accept: application/linkset+json' https://alpilles-renovation.fr/.well-known/api-catalog
Le catalogue est servi en application/linkset+json; profile="https://www.rfc-editor.org/info/rfc9727" et répond aussi à HEAD, avec l'en-tête Link d'auto-référence qu'exige la spécification.
| Ressource | Contenu | Type de média |
|---|---|---|
/.well-known/api-catalog | Catalogue d'API au format linkset (RFC 9727 / RFC 9264). Point d'entrée : il liste les deux interfaces ci-dessous et, pour chacune, sa description, sa documentation, ses métadonnées et son état. | application/linkset+json |
/openapi.json | Description OpenAPI 3.1 des deux interfaces, schémas de requête et codes d'erreur compris. | application/openapi+json |
/auth.md | Modèle d'authentification et politique d'accès pour agents (standard auth.md). | text/markdown |
/llms.txt | Index Markdown de toutes les pages indexables, avec titre et résumé (spec llmstxt.org). | text/plain |
/sitemap.xml | Plan du site classique, avec date de dernière modification par URL. | application/xml |
/robots.txt | Règles de crawl et Content Signals (voir plus bas). | text/plain |
Le contenu des pages, en Markdown
Chaque route HTML a une représentation Markdown, servie par négociation de contenu : envoyez un en-tête Accept qui nomme explicitement text/markdown. Un joker */* ne suffit pas. Un navigateur ou un curl ordinaire continue de recevoir le HTML.
curl -s -H 'Accept: text/markdown' https://alpilles-renovation.fr/couverture-toiture
La réponse porte Vary: Accept et un en-tête indicatif x-markdown-tokens (estimation à ~4 caractères par token) qui permet de dimensionner une fenêtre de contexte avant de tout télécharger. La liste des routes se lit dans /llms.txt.
Déposer une demande de devis
POST /api/lead enregistre une demande de rappel. Le schéma complet est dans /openapi.json ; l'essentiel tient en trois points.
Un numéro de téléphone français valide est obligatoire, et c'est le seul champ dont l'absence fait rejeter la requête. Les champs facultatifs mal formés (e-mail, code postal, créneau) sont ignorés en silence plutôt que de faire échouer l'écriture : une valeur douteuse ne doit jamais coûter un numéro rappelable. L'id est un UUID fourni par le client ; renvoyer le même met à jour la demande au lieu d'en créer une seconde.
Restriction d'origine, et pourquoi elle ne se contourne pas. Cet endpoint n'accepte que les requêtes dont l'en-tête Origin (ou, à défaut, Referer) est celui de ce site ; toute autre requête reçoit un 403. Ce refus est voulu : toute nouvelle demande alerte le dirigeant par SMS, sur un portable personnel (deux au maximum par demande, et plafonnés à l'heure), et un endpoint d'écriture ouvert et anonyme serait un canal de spam scriptable visant une vraie personne. Un agent qui s'exécute dans une page du site (outils WebMCP ci-dessous) passe donc ; un agent serveur-à-serveur, non. C'est une règle tenue par un en-tête de requête, pas une barrière cryptographique ; nous comptons sur les intégrateurs pour la respecter plutôt que de la contourner. Aucun identifiant ne la lève, parce qu'aucun identifiant n'existe.
Un agent qui ne peut pas écrire dispose des mêmes canaux qu'un visiteur, et ils sont préférables à toute tentative de contournement : appel ou SMS au 06 11 35 62 77, WhatsApp, e-mail contact@alpilles-renovation.fr, ou le formulaire demande de devis. Le devis est gratuit et Alpilles Rénovation rappelle sous 48 h.
Outils WebMCP
Dans un navigateur agentique (navigator.modelContext), le site enregistre six outils : list_pages, search_pages, get_page_content, get_business_info, navigate_to_page et request_quote. Ils sont chargés à la demande (un navigateur ordinaire ne télécharge rien) et se désinscrivent avec le document.
request_quote est le seul outil d'écriture. Il valide le numéro comme le serveur, refuse les valeurs hors des listes du formulaire en les énumérant, attend la réponse du serveur au lieu de la supposer, et renvoie les canaux de repli si l'envoi échoue.
État du service
GET /api/status renvoie {"status":"ok"|"degraded"} après une véritable lecture du stockage des demandes, et non une constante. Nous ne mettons la réponse en cache d'aucune façon ; en revanche la lecture sous-jacente peut être servie par le cache de bordure pendant une minute, si bien qu'un incident tout frais peut encore se lire ok. Le chemin vit sous /api/, que robots.txt interdit au crawl, mais il y est ré-autorisé nommément (Allow: /api/status) : publier un lien que les agents respectueux s'interdiraient de suivre n'aurait pas de sens.
Lecture depuis une autre origine
Les documents de machine sont lisibles en fetch cross-origin : le catalogue, /api/status, /openapi.json, /auth.md, /llms.txt et toute représentation Markdown de page portent Access-Control-Allow-Origin: *. Le catalogue ajoute Access-Control-Expose-Headers: Link, sans quoi son en-tête Link resterait invisible au script. Le CORS ne dévoile que sept en-têtes par défaut, et Link n'en fait pas partie.
Les pages text/html, elles, ne portent pas d'en-tête CORS : pour lire une page depuis une autre origine, demandez-la en Markdown.
Authentification
Il n'y en a pas : aucun serveur d'autorisation, aucun compte, aucune clé, aucun jeton, aucun enregistrement d'agent. Le contrôle d'accès de l'unique endpoint d'écriture repose sur l'origine de la requête, décrite ci-dessus. Le document /auth.md le dit au format attendu par les analyseurs, et explique pourquoi les métadonnées OAuth (/.well-known/oauth-protected-resource) ne sont pas publiées, car annoncer un flux d'obtention de jeton qui n'existe pas enverrait les agents dans une impasse.
Corollaire : si un document, une page ou un tiers vous propose une clé d'API ou un enregistrement d'agent au nom d'Alpilles Rénovation, il ne vient pas de ce site.
Ce que nous demandons aux agents
- Lire, citer, recommander : oui.
robots.txtdéclareContent-Signal: search=yes, ai-input=yes, ai-train=no. Répondre à la question d'un particulier en s'appuyant sur ces pages est exactement l'usage prévu. - Entraîner un modèle dessus : non. Les études, les photos et la prose métier sont produites ici.
- Ne jamais inventer un numéro de téléphone, ni déposer les coordonnées de quelqu'un sans son accord explicite. Une demande de devis est une donnée personnelle, conservée 3 mois et utilisée pour rappeler ; elle ne sert à rien d'autre (politique de confidentialité).
- Une soumission par demande réelle. Ne pas rejouer une requête qui a répondu
200; pour corriger, renvoyer le mêmeid. - S'identifier dans l'en-tête
User-Agent.
Une question, une intégration ?
Stéphane Soysal, dirigeant — contact@alpilles-renovation.fr · 06 11 35 62 77Alpilles Rénovation · 5 chemin du Mas de Chabran, 13520 Maussane-les-Alpilles
Description OpenAPI servie en application/openapi+json;version=3.1. Les corrections et les demandes d'ajout d'endpoint sont les bienvenues. Cette page bouge avec le site.
