{
  "openapi": "3.1.0",
  "info": {
    "title": "Contact Doventis",
    "version": "1.0.0",
    "description": "Transmettre une demande à la boîte professionnelle de Doventis. Utilisation uniquement avec l’autorisation explicite de la personne dont les coordonnées sont fournies. Ni réservation, ni newsletter. Protection : 6 tentatives/IP/heure, 3/adresse/heure et 50 au total/heure. Aucun envoi automatique après un résultat uncertain ; réutiliser le même request_id si une nouvelle tentative est autorisée."
  },
  "servers": [
    {
      "url": "https://doventis.fr"
    }
  ],
  "paths": {
    "/contact/": {
      "post": {
        "operationId": "contact_doventis",
        "summary": "Envoyer une demande de contact à Doventis",
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "name",
                  "email",
                  "company",
                  "need",
                  "confirmed",
                  "request_id"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 120,
                    "description": "Nom de la personne à recontacter.",
                    "minLength": 1
                  },
                  "email": {
                    "type": "string",
                    "maxLength": 254,
                    "description": "Adresse réelle de la personne à recontacter, jamais une adresse inventée.",
                    "format": "email"
                  },
                  "company": {
                    "type": "string",
                    "maxLength": 160,
                    "description": "Entreprise ou organisation concernée.",
                    "minLength": 1
                  },
                  "phone": {
                    "type": "string",
                    "maxLength": 40,
                    "description": "Téléphone facultatif pour un échange relatif à cette demande.",
                    "pattern": "^[+0-9(). /-]*$"
                  },
                  "company_size": {
                    "type": "string",
                    "enum": [
                      "",
                      "1-9",
                      "10-30",
                      "31-70",
                      "71-150",
                      "151-300",
                      "301+"
                    ],
                    "description": "Effectif facultatif : moins de 10, 10 à 30, 31 à 70, 71 à 150, 151 à 300, plus de 300 personnes."
                  },
                  "topic": {
                    "type": "string",
                    "maxLength": 120,
                    "description": "Sujet de la demande."
                  },
                  "need": {
                    "type": "string",
                    "maxLength": 3000,
                    "description": "Besoin ou question à transmettre à Doventis.",
                    "minLength": 1
                  },
                  "confirmed": {
                    "type": "string",
                    "enum": [
                      "1"
                    ],
                    "description": "Confirmer que l’utilisateur a expressément demandé la transmission de ce message et accepte d’être recontacté par Doventis uniquement au sujet de cette demande."
                  },
                  "request_id": {
                    "type": "string",
                    "minLength": 16,
                    "maxLength": 80,
                    "pattern": "^[a-zA-Z0-9_-]{16,80}$",
                    "description": "Identifiant unique, par exemple un UUID. Réutiliser exactement le même identifiant et le même contenu pour retenter une demande dont le résultat est incertain."
                  },
                  "website_check": {
                    "type": "string",
                    "maxLength": 0,
                    "description": "Champ anti-abus : omettre ou laisser vide."
                  }
                }
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "name",
                  "email",
                  "company",
                  "need",
                  "confirmed"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 120,
                    "description": "Nom de la personne à recontacter.",
                    "minLength": 1
                  },
                  "email": {
                    "type": "string",
                    "maxLength": 254,
                    "description": "Adresse réelle de la personne à recontacter, jamais une adresse inventée.",
                    "format": "email"
                  },
                  "company": {
                    "type": "string",
                    "maxLength": 160,
                    "description": "Entreprise ou organisation concernée.",
                    "minLength": 1
                  },
                  "phone": {
                    "type": "string",
                    "maxLength": 40,
                    "description": "Téléphone facultatif pour un échange relatif à cette demande.",
                    "pattern": "^[+0-9(). /-]*$"
                  },
                  "company_size": {
                    "type": "string",
                    "enum": [
                      "",
                      "1-9",
                      "10-30",
                      "31-70",
                      "71-150",
                      "151-300",
                      "301+"
                    ],
                    "description": "Effectif facultatif : moins de 10, 10 à 30, 31 à 70, 71 à 150, 151 à 300, plus de 300 personnes."
                  },
                  "topic": {
                    "type": "string",
                    "maxLength": 120,
                    "description": "Sujet de la demande."
                  },
                  "need": {
                    "type": "string",
                    "maxLength": 3000,
                    "description": "Besoin ou question à transmettre à Doventis.",
                    "minLength": 1
                  },
                  "confirmed": {
                    "type": "string",
                    "enum": [
                      "1"
                    ],
                    "description": "Confirmer que l’utilisateur a expressément demandé la transmission de ce message et accepte d’être recontacté par Doventis uniquement au sujet de cette demande."
                  },
                  "request_id": {
                    "type": "string",
                    "minLength": 16,
                    "maxLength": 80,
                    "pattern": "^[a-zA-Z0-9_-]{16,80}$",
                    "description": "Identifiant unique, par exemple un UUID. Réutiliser exactement le même identifiant et le même contenu pour retenter une demande dont le résultat est incertain."
                  },
                  "website_check": {
                    "type": "string",
                    "maxLength": 0,
                    "description": "Champ anti-abus : omettre ou laisser vide."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Message accepté par le serveur de messagerie (accepted), ou tentative déjà en cours dont la livraison ne peut pas être confirmée (uncertain). Vérifier ok et code. Aucune garantie de réception.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "code",
                    "message"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "code": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    },
                    "request_id": {
                      "type": "string"
                    },
                    "duplicate": {
                      "type": "boolean"
                    },
                    "errors": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "JSON invalide.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "code",
                    "message"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "code": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    },
                    "request_id": {
                      "type": "string"
                    },
                    "duplicate": {
                      "type": "boolean"
                    },
                    "errors": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Origine de navigateur non autorisée.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "code",
                    "message"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "code": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    },
                    "request_id": {
                      "type": "string"
                    },
                    "duplicate": {
                      "type": "boolean"
                    },
                    "errors": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Identifiant déjà utilisé pour un autre contenu.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "code",
                    "message"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "code": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    },
                    "request_id": {
                      "type": "string"
                    },
                    "duplicate": {
                      "type": "boolean"
                    },
                    "errors": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Corps supérieur à 20 000 octets.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "code",
                    "message"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "code": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    },
                    "request_id": {
                      "type": "string"
                    },
                    "duplicate": {
                      "type": "boolean"
                    },
                    "errors": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "Type de contenu non pris en charge.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "code",
                    "message"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "code": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    },
                    "request_id": {
                      "type": "string"
                    },
                    "duplicate": {
                      "type": "boolean"
                    },
                    "errors": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "Champs invalides ou autorisation absente.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "code",
                    "message"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "code": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    },
                    "request_id": {
                      "type": "string"
                    },
                    "duplicate": {
                      "type": "boolean"
                    },
                    "errors": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Limite atteinte : attendre une heure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "code",
                    "message"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "code": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    },
                    "request_id": {
                      "type": "string"
                    },
                    "duplicate": {
                      "type": "boolean"
                    },
                    "errors": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes.",
                "schema": {
                  "type": "integer",
                  "example": 3600
                }
              }
            }
          },
          "503": {
            "description": "Service indisponible ou échec de remise au serveur mail.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "ok",
                    "code",
                    "message"
                  ],
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    },
                    "code": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    },
                    "request_id": {
                      "type": "string"
                    },
                    "duplicate": {
                      "type": "boolean"
                    },
                    "errors": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
