# La specification PUBLIQUE de geoscope, ecrite a la main.
#
# Elle ne decrit que les DEUX adresses ouvertes. Ce n'est pas un extrait du
# document interne : celui-ci est ferme depuis le 07/08/2026 (openapi_url=None
# dans server/app.py). Il repondait 200 en production et publiait la carte des
# quarante adresses du service -- /taches/*, /publier, /stripe/webhook -- avec
# le nom de chaque parametre, sans qu'aucun lien n'y mene.
#
# CE QUI N'EST PAS ICI, ET N'Y SERA PAS :
#   * aucun exemple d'appel automatise vers POST /lead. Cette adresse n'est pas
#     une API de lecture : c'est l'entree du tunnel commercial. Chaque demande
#     acceptee declenche une alerte puis une VRAIE mesure, qui appelle des
#     modeles payants. Un exemple officiel montrant quels champs envoyer serait
#     un robinet a spam facture.
#   * le champ piege du formulaire. Le publier le desarme.
openapi: 3.1.0
info:
  title: geoscope - API publique
  version: "1.0.0"
  description: >
    Les deux seules routes publiques de geoscope. Le reste du service (mesures,
    rapports, facturation) est prive et n'est pas documente ici.
  contact:
    name: Greeneris
    email: hello@greeneris.io
    url: https://geo.greeneris.io

servers:
  - url: https://geo.greeneris.io

paths:
  /health:
    get:
      summary: Verifier que le service repond
      operationId: health
      responses:
        "200":
          description: Le service est debout.
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok: { type: boolean }
              example: { ok: true }
  /lead:
    post:
      summary: Demander un diagnostic gratuit
      description: >
        Ce que le formulaire de https://geo.greeneris.io/ envoie. Chaque demande
        acceptee declenche une mesure reelle et une alerte : cette route n'est
        pas destinee a etre appelee par un programme.
      operationId: lead
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required: [entreprise, email]
              properties:
                entreprise: { type: string, maxLength: 120 }
                email: { type: string, format: email, maxLength: 200 }
                ville: { type: string, maxLength: 80 }
                site_web: { type: string, maxLength: 200 }
                metier: { type: string, maxLength: 80 }
                message: { type: string, maxLength: 1000 }
                objet: { type: string, maxLength: 120 }
      responses:
        "200":
          description: Demande enregistree ; une page HTML de confirmation est renvoyee.
          content: { text/html: { schema: { type: string } } }
        "422":
          description: Nom d'entreprise vide ou adresse email invalide.
          content: { text/html: { schema: { type: string } } }
        "429":
          description: Trop de demandes depuis la meme adresse IP. Une heure d'attente.
          content: { text/html: { schema: { type: string } } }
