{
  "openapi": "3.0.3",
  "info": {
    "title": "API Melkal",
    "version": "V1",
    "description": "API REST de Melkal : lire, créer et modifier les fiches clients.\n\nLa clé API se passe dans le paramètre d'adresse api_key, pour toutes les requêtes. Les dates sont du texte (AAAA-MM-JJ HH:MM:SS, heure locale de l'entreprise, sans fuseau). Tous les refus renvoient 401 : le message de l'erreur dit la cause. Documentation : https://melkal.com/manuel/api-sommaire.html"
  },
  "servers": [
    {
      "url": "{adresseApi}",
      "description": "L'adresse de votre application Melkal, affichée dans Réglages > API & Make > Clé et adresse de l'API.",
      "variables": {
        "adresseApi": {
          "default": "https://app00api.exemple.fr",
          "description": "Votre adresse API, sans barre oblique finale."
        }
      }
    }
  ],
  "tags": [
    {
      "name": "Test"
    },
    {
      "name": "Clients"
    }
  ],
  "security": [
    {
      "cleApi": []
    }
  ],
  "paths": {
    "/api/V1/hello": {
      "get": {
        "tags": [
          "Test"
        ],
        "summary": "Tester la connexion",
        "description": "Vérifie que le serveur répond, que l'API est activée et que la clé est la bonne. Ne renvoie aucune donnée.",
        "operationId": "hello",
        "responses": {
          "200": {
            "description": "Réussi.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Hello"
                }
              }
            }
          },
          "401": {
            "description": "Refus : clé non reconnue, API non activée, ou paramètre invalide. Le message dit la cause.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/api_key"
          }
        ]
      }
    },
    "/api/V1/client": {
      "get": {
        "tags": [
          "Clients"
        ],
        "summary": "Rechercher un client",
        "description": "Retrouve un seul client (le premier qui correspond) et renvoie sa fiche.",
        "operationId": "rechercherClient",
        "parameters": [
          {
            "$ref": "#/components/parameters/api_key"
          },
          {
            "name": "rechercheType",
            "in": "query",
            "required": true,
            "description": "Le critère : code (numéro du client), id, uuid, idExterne, barcode (code-barre), lienSocial (email, mobile, téléphone, réseau).",
            "schema": {
              "type": "string",
              "enum": [
                "code",
                "id",
                "uuid",
                "idExterne",
                "barcode",
                "lienSocial"
              ]
            }
          },
          {
            "name": "recherche",
            "in": "query",
            "required": true,
            "description": "La valeur cherchée.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussi.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Client"
                }
              }
            }
          },
          "401": {
            "description": "Refus : clé non reconnue, API non activée, ou paramètre invalide. Le message dit la cause.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "404": {
            "description": "Aucun client trouvé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Clients"
        ],
        "summary": "Créer un client (ou le créer / le mettre à jour)",
        "description": "Crée un client. Avec clientModif=true, un client déjà existant est mis à jour au lieu d'être refusé.",
        "operationId": "creerClient",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClientCreation"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Réussi.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClientReponse"
                }
              }
            }
          },
          "401": {
            "description": "Refus : clé non reconnue, API non activée, ou paramètre invalide. Le message dit la cause.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/api_key"
          }
        ]
      },
      "put": {
        "tags": [
          "Clients"
        ],
        "summary": "Modifier un client",
        "description": "Modifie un client existant, identifié par sectionRecherche. Seul ce qui est envoyé est changé.",
        "operationId": "modifierClient",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClientModification"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Réussi.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClientReponse"
                }
              }
            }
          },
          "401": {
            "description": "Refus : clé non reconnue, API non activée, ou paramètre invalide. Le message dit la cause.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "404": {
            "description": "Aucun client trouvé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/api_key"
          }
        ]
      }
    },
    "/api/V1/clients_initial": {
      "get": {
        "tags": [
          "Clients"
        ],
        "summary": "Lister les clients, étape 1",
        "description": "Envoie les filtres et reçoit un token à utiliser avec clients_token. Les clients de la corbeille et le client anonyme ne sont pas listés.",
        "operationId": "listerClientsEtape1",
        "parameters": [
          {
            "$ref": "#/components/parameters/api_key"
          },
          {
            "name": "nbParPage",
            "in": "query",
            "required": true,
            "description": "Nombre de clients par page, de 1 à 100.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "filtreParDateCrea",
            "in": "query",
            "required": false,
            "description": "Sens du filtre sur la date de création.",
            "schema": {
              "type": "string",
              "enum": [
                "avantDateCrea",
                "apresDateCrea",
                "leDateCrea"
              ]
            }
          },
          {
            "name": "dateCrea",
            "in": "query",
            "required": false,
            "description": "AAAA-MM-JJ ou AAAA-MM-JJ HH:MM:SS.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filtreParDateModif",
            "in": "query",
            "required": false,
            "description": "Sens du filtre sur la date de modification. xJoursModif : dateModif est un nombre de jours.",
            "schema": {
              "type": "string",
              "enum": [
                "avantDateModif",
                "apresDateModif",
                "leDateModif",
                "xJoursModif"
              ]
            }
          },
          {
            "name": "dateModif",
            "in": "query",
            "required": false,
            "description": "Date, ou nombre de jours avec xJoursModif.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filtreParDateModifAPI",
            "in": "query",
            "required": false,
            "description": "Sens du filtre sur la date de modification par l'API.",
            "schema": {
              "type": "string",
              "enum": [
                "avantDateModifAPI",
                "apresDateModifAPI",
                "leDateModifAPI"
              ]
            }
          },
          {
            "name": "dateModifAPI",
            "in": "query",
            "required": false,
            "description": "AAAA-MM-JJ ou AAAA-MM-JJ HH:MM:SS.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filtreParDateVt",
            "in": "query",
            "required": false,
            "description": "Sens du filtre sur la date de dernière vente. xJoursVt : dateVt est un nombre de jours.",
            "schema": {
              "type": "string",
              "enum": [
                "avantDateVt",
                "apresDateVt",
                "leDateVt",
                "xJoursVt"
              ]
            }
          },
          {
            "name": "dateVt",
            "in": "query",
            "required": false,
            "description": "Date, ou nombre de jours avec xJoursVt.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filtreParJoursPrecedents",
            "in": "query",
            "required": false,
            "description": "Quelle date regarder pour nbJoursPrecedents.",
            "schema": {
              "type": "string",
              "enum": [
                "nbJoursCrea",
                "nbJoursModif",
                "nbJoursAPI",
                "nbJoursVt"
              ]
            }
          },
          {
            "name": "nbJoursPrecedents",
            "in": "query",
            "required": false,
            "description": "Les clients dont la date tombe dans ces derniers jours (0 : aujourd'hui seulement ; sinon aujourd'hui exclu).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "uuid",
            "in": "query",
            "required": false,
            "description": "UUID séparés par des virgules (100 au maximum, version 4).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "codebarre",
            "in": "query",
            "required": false,
            "description": "Codes-barres de 8 ou 13 chiffres séparés par des virgules (100 au maximum).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussi.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListeInitiale"
                }
              }
            }
          },
          "401": {
            "description": "Refus : clé non reconnue, API non activée, ou paramètre invalide. Le message dit la cause.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "404": {
            "description": "Aucun client trouvé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/api/V1/clients_token": {
      "get": {
        "tags": [
          "Clients"
        ],
        "summary": "Lister les clients, étape 2",
        "description": "Lit une page de la liste préparée par clients_initial. Une page au-delà de la dernière renvoie 404.",
        "operationId": "listerClientsEtape2",
        "parameters": [
          {
            "$ref": "#/components/parameters/api_key"
          },
          {
            "name": "token",
            "in": "query",
            "required": true,
            "description": "Le token reçu de clients_initial.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": true,
            "description": "Numéro de la page, à partir de 1.",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussi.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListePage"
                }
              }
            }
          },
          "401": {
            "description": "Refus : clé non reconnue, API non activée, ou paramètre invalide. Le message dit la cause.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "404": {
            "description": "Aucun client trouvé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "cleApi": {
        "type": "apiKey",
        "in": "query",
        "name": "api_key",
        "description": "La clé API, visible dans Réglages > API & Make."
      }
    },
    "parameters": {
      "api_key": {
        "name": "api_key",
        "in": "query",
        "required": true,
        "description": "Votre clé API.",
        "schema": {
          "type": "string"
        }
      }
    },
    "schemas": {
      "Erreur": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string",
                "description": "Code général : error-401, error-404, error-500 (ou apiKey-error pour hello)."
              },
              "message": {
                "type": "string",
                "description": "La cause précise, préfixée par « Message de Melkal: »."
              },
              "status": {
                "type": "integer",
                "description": "Le code HTTP."
              }
            }
          }
        },
        "description": "Réponse d'erreur."
      },
      "Hello": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "Toujours « hello »."
          },
          "message": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          }
        },
        "description": "Réponse de la route hello."
      },
      "ClientBase": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "description": "Identifiant du client dans Melkal."
          },
          "code": {
            "type": "string",
            "description": "Numéro (code) du client."
          },
          "uuid": {
            "type": "string",
            "description": "Identifiant unique universel de la fiche."
          },
          "idExterne": {
            "type": "string",
            "description": "Identifiant donné au client par une application extérieure."
          },
          "nom": {
            "type": "string"
          },
          "prenom": {
            "type": "string"
          },
          "entreprise": {
            "type": "string"
          },
          "anniversaire": {
            "type": "string",
            "description": "JJMM sur quatre chiffres (« 1503 » pour le 15 mars). Vide s'il n'est pas renseigné."
          },
          "email": {
            "type": "string"
          },
          "mobile": {
            "type": "string"
          },
          "tel": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "description": "Type de client."
          },
          "suivi": {
            "type": "string",
            "description": "Vendeur qui suit le client."
          },
          "apparence": {
            "type": "string"
          },
          "statut": {
            "type": "string"
          },
          "prive": {
            "type": "boolean"
          },
          "corbeille": {
            "type": "boolean"
          },
          "anonyme": {
            "type": "boolean"
          },
          "datePremiereVente": {
            "type": "string"
          },
          "dateDerniereVente": {
            "type": "string"
          },
          "dateCreation": {
            "type": "string",
            "description": "AAAA-MM-JJ HH:MM:SS, heure locale de l'entreprise."
          },
          "dateDerniereModification": {
            "type": "string"
          },
          "dateDerniereModificationViaAPI": {
            "type": "string",
            "description": "Vide si la fiche n'a jamais été modifiée par l'API."
          },
          "adresse": {
            "type": "object",
            "properties": {
              "adresse_remarques": {
                "type": "string"
              },
              "adresse_ligne1": {
                "type": "string"
              },
              "adresse_ligne2": {
                "type": "string"
              },
              "adresse_cp": {
                "type": "string"
              },
              "adresse_ville": {
                "type": "string"
              }
            }
          },
          "notes": {
            "type": "object",
            "properties": {
              "descriptif": {
                "type": "string"
              },
              "note1": {
                "type": "string"
              },
              "note2": {
                "type": "string"
              },
              "note3": {
                "type": "string"
              },
              "note4": {
                "type": "string"
              },
              "note5": {
                "type": "string"
              },
              "note6": {
                "type": "string"
              }
            }
          },
          "finances": {
            "type": "object",
            "properties": {
              "tarif": {
                "type": "string"
              },
              "detteMax": {
                "type": "string",
                "description": "Montant en euros, sous forme de texte."
              },
              "remiseAuto": {
                "type": "string"
              },
              "echeanceNbJours": {
                "type": "integer"
              },
              "compte": {
                "type": "string",
                "description": "Compte comptable."
              },
              "franchiseTVA": {
                "type": "boolean"
              },
              "facturation": {
                "type": "string"
              },
              "echeanceFindemois": {
                "type": "boolean"
              },
              "solde": {
                "type": "string",
                "description": "Montant en euros, sous forme de texte."
              }
            }
          },
          "eshop": {
            "type": "object",
            "properties": {
              "idClientEshop": {
                "type": "integer"
              },
              "creeViaEshop": {
                "type": "boolean"
              }
            }
          },
          "geo": {
            "type": "object",
            "properties": {
              "map_latitude": {
                "type": "string"
              },
              "map_longitude": {
                "type": "string"
              },
              "map_placeId": {
                "type": "string"
              },
              "map_googleFiche": {
                "type": "string"
              },
              "map_googleInfos": {
                "type": "string"
              }
            }
          },
          "facturation": {
            "type": "object",
            "properties": {
              "facture_entetePerso": {
                "type": "string"
              },
              "facture_piedPerso": {
                "type": "string"
              },
              "numTVA": {
                "type": "string"
              },
              "facture_entetePersoSurFact": {
                "type": "boolean"
              },
              "facture_piedPersoSurFact": {
                "type": "boolean"
              }
            }
          },
          "livraison": {
            "type": "object",
            "properties": {
              "livraison_coordonnees": {
                "type": "string"
              },
              "livraison_entetePersoSurBL": {
                "type": "boolean"
              },
              "livraison_piedPersoSurBL": {
                "type": "boolean"
              }
            }
          },
          "devis": {
            "type": "object",
            "properties": {
              "devis_entetePersoSurDevis": {
                "type": "boolean"
              },
              "devis_piedPersoSurDevis": {
                "type": "boolean"
              }
            }
          }
        },
        "description": "Propriétés communes d'une fiche client."
      },
      "Client": {
        "description": "Fiche client, telle que la renvoie la recherche d'un client.",
        "allOf": [
          {
            "$ref": "#/components/schemas/ClientBase"
          },
          {
            "type": "object",
            "properties": {
              "famille": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "prenom": {
                      "type": "string"
                    },
                    "anniversaire": {
                      "type": "string"
                    },
                    "statut": {
                      "type": "string"
                    },
                    "aspect": {
                      "type": "string"
                    },
                    "id": {
                      "type": "integer"
                    }
                  }
                }
              },
              "liens": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "lien_id": {
                      "type": "integer"
                    },
                    "lien_contenu": {
                      "type": "string"
                    },
                    "lien_type": {
                      "type": "string",
                      "description": "MOBILE, EMAIL, TEL, FACEBOOK, TWITTER, INSTAGRAM ou TIKTOK."
                    },
                    "lien_pubAutorisee": {
                      "type": "boolean",
                      "description": "Opt-in publicité."
                    },
                    "lien_remarques": {
                      "type": "string"
                    },
                    "lien_membreFamille": {
                      "type": "string"
                    }
                  }
                }
              },
              "codesbarres": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "codebarre_id": {
                      "type": "integer"
                    },
                    "codebarre_contenu": {
                      "type": "string"
                    },
                    "codebarre_type": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "ClientListe": {
        "description": "Client d'une page de liste : comme la fiche, sans famille, liens ni codesbarres, avec ean et les réseaux. Attention : l'anniversaire y est le jour et le mois collés, sans zéro devant.",
        "allOf": [
          {
            "$ref": "#/components/schemas/ClientBase"
          },
          {
            "type": "object",
            "properties": {
              "ean": {
                "type": "string",
                "description": "Code-barre interne."
              },
              "facebook": {
                "type": "string"
              },
              "x": {
                "type": "string"
              },
              "insta": {
                "type": "string"
              },
              "tiktok": {
                "type": "string"
              }
            }
          }
        ]
      },
      "ListeInitiale": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "À envoyer à clients_token."
          },
          "nbClients": {
            "type": "integer"
          },
          "nbParPage": {
            "type": "integer"
          },
          "nbPages": {
            "type": "integer"
          }
        },
        "description": "Réponse de clients_initial."
      },
      "ListePage": {
        "type": "object",
        "properties": {
          "numPage": {
            "type": "integer"
          },
          "liste": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClientListe"
            }
          }
        },
        "description": "Réponse de clients_token."
      },
      "ClientCreation": {
        "type": "object",
        "properties": {
          "clientModif": {
            "type": "boolean",
            "description": "true : si le client existe déjà, il est mis à jour au lieu d'être refusé. Par défaut false."
          },
          "nom": {
            "type": "string",
            "description": "80 caractères au maximum."
          },
          "prenom": {
            "type": "string",
            "description": "80 caractères au maximum."
          },
          "anniversaire": {
            "type": "string",
            "description": "JJMM sur quatre chiffres."
          },
          "type": {
            "type": "string",
            "description": "Libellé du type de client, tel que dans Melkal."
          },
          "tarif": {
            "type": "string",
            "description": "Libellé du tarif."
          },
          "suivi": {
            "type": "string",
            "description": "Nom du vendeur qui suit le client."
          },
          "compte": {
            "type": "string",
            "description": "Compte comptable : doit commencer par 411 (ou 9 ou 0)."
          },
          "uuid": {
            "type": "string",
            "description": "UUID version 4. Créé par Melkal s'il est absent."
          },
          "idExterne": {
            "type": "string",
            "description": "Votre identifiant du client, 200 caractères au maximum."
          },
          "ean": {
            "type": "string",
            "description": "Code-barre interne : EAN 8 valide commençant par 8."
          },
          "sectionEntreprise": {
            "type": "object",
            "properties": {
              "entreprise": {
                "type": "string"
              },
              "idTva": {
                "type": "string",
                "description": "Numéro de TVA intracommunautaire."
              },
              "adresseLivr": {
                "type": "string",
                "description": "Adresse de livraison."
              }
            }
          },
          "sectionSocial": {
            "type": "object",
            "properties": {
              "email": {
                "type": "string"
              },
              "emailPub": {
                "type": "boolean",
                "description": "Opt-in publicité."
              },
              "mobile": {
                "type": "string"
              },
              "mobilePub": {
                "type": "boolean"
              },
              "tel": {
                "type": "string"
              },
              "instagram": {
                "type": "string"
              },
              "tiktok": {
                "type": "string"
              },
              "facebook": {
                "type": "string"
              },
              "x": {
                "type": "string"
              }
            }
          },
          "sectionAdresse": {
            "type": "object",
            "properties": {
              "remarques": {
                "type": "string"
              },
              "adresse1": {
                "type": "string"
              },
              "adresse2": {
                "type": "string"
              },
              "cp": {
                "type": "string"
              },
              "ville": {
                "type": "string"
              }
            }
          },
          "sectionNotes": {
            "type": "object",
            "properties": {
              "descriptif": {
                "type": "string"
              },
              "note1": {
                "type": "string"
              },
              "note2": {
                "type": "string"
              },
              "note3": {
                "type": "string"
              },
              "note4": {
                "type": "string"
              },
              "note5": {
                "type": "string"
              },
              "note6": {
                "type": "string"
              }
            }
          }
        },
        "description": "Corps de la création (POST)."
      },
      "ClientModification": {
        "type": "object",
        "properties": {
          "sectionRecherche": {
            "type": "object",
            "properties": {
              "rechercheType": {
                "type": "string",
                "enum": [
                  "code",
                  "id",
                  "uuid",
                  "idExterne",
                  "barcode",
                  "lienSocial"
                ]
              },
              "recherche": {
                "type": "string"
              }
            },
            "description": "Quel client modifier.",
            "required": [
              "rechercheType",
              "recherche"
            ]
          },
          "sectionModif": {
            "type": "object",
            "properties": {
              "nom": {
                "type": "string"
              },
              "prenom": {
                "type": "string"
              },
              "anniversaire": {
                "type": "string",
                "description": "JJMM sur quatre chiffres. La valeur spéciale « ----- » (cinq tirets) vide la valeur existante."
              },
              "type": {
                "type": "string"
              },
              "tarif": {
                "type": "string",
                "description": "Libellé du tarif. La valeur spéciale « ----- » (cinq tirets) vide la valeur existante."
              },
              "suivi": {
                "type": "string",
                "description": "Nom du vendeur. La valeur spéciale « ----- » (cinq tirets) vide la valeur existante."
              },
              "compte": {
                "type": "string"
              },
              "uuid": {
                "type": "string"
              },
              "idExterne": {
                "type": "string",
                "description": "Votre identifiant. La valeur spéciale « ----- » (cinq tirets) vide la valeur existante."
              },
              "sectionCodebarre": {
                "type": "object",
                "properties": {
                  "ean": {
                    "type": "string",
                    "description": "EAN 8 valide commençant par 8."
                  },
                  "eanAdd": {
                    "type": "boolean",
                    "description": "true : ajoute le code-barre ; false ou absent : remplace."
                  }
                }
              },
              "sectionEntreprise": {
                "type": "object",
                "properties": {
                  "entreprise": {
                    "type": "string"
                  },
                  "idTva": {
                    "type": "string",
                    "description": "Numéro de TVA intracommunautaire."
                  },
                  "adresseLivr": {
                    "type": "string",
                    "description": "Adresse de livraison."
                  }
                }
              },
              "sectionSocial": {
                "type": "object",
                "properties": {
                  "sectionEmail": {
                    "type": "object",
                    "properties": {
                      "email": {
                        "type": "string"
                      },
                      "emailPub": {
                        "type": "boolean",
                        "description": "Opt-in publicité."
                      },
                      "emailAdd": {
                        "type": "boolean",
                        "description": "true : ajoute un contact ; false ou absent : remplace le contact existant."
                      }
                    }
                  },
                  "sectionMobile": {
                    "type": "object",
                    "properties": {
                      "mobile": {
                        "type": "string"
                      },
                      "mobilePub": {
                        "type": "boolean",
                        "description": "Opt-in publicité."
                      },
                      "mobileAdd": {
                        "type": "boolean",
                        "description": "true : ajoute un contact ; false ou absent : remplace le contact existant."
                      }
                    }
                  },
                  "sectionTel": {
                    "type": "object",
                    "properties": {
                      "tel": {
                        "type": "string"
                      },
                      "telPub": {
                        "type": "boolean",
                        "description": "Opt-in publicité."
                      },
                      "telAdd": {
                        "type": "boolean",
                        "description": "true : ajoute un contact ; false ou absent : remplace le contact existant."
                      }
                    }
                  },
                  "sectionInstagram": {
                    "type": "object",
                    "properties": {
                      "instagram": {
                        "type": "string"
                      },
                      "instaPub": {
                        "type": "boolean",
                        "description": "Opt-in publicité."
                      },
                      "instaAdd": {
                        "type": "boolean",
                        "description": "true : ajoute un contact ; false ou absent : remplace le contact existant."
                      }
                    }
                  },
                  "sectionTiktok": {
                    "type": "object",
                    "properties": {
                      "tiktok": {
                        "type": "string"
                      },
                      "tiktokPub": {
                        "type": "boolean",
                        "description": "Opt-in publicité."
                      },
                      "tiktokAdd": {
                        "type": "boolean",
                        "description": "true : ajoute un contact ; false ou absent : remplace le contact existant."
                      }
                    }
                  },
                  "sectionFacebook": {
                    "type": "object",
                    "properties": {
                      "facebook": {
                        "type": "string"
                      },
                      "facebookPub": {
                        "type": "boolean",
                        "description": "Opt-in publicité."
                      },
                      "facebookAdd": {
                        "type": "boolean",
                        "description": "true : ajoute un contact ; false ou absent : remplace le contact existant."
                      }
                    }
                  },
                  "sectionX": {
                    "type": "object",
                    "properties": {
                      "x": {
                        "type": "string"
                      },
                      "xPub": {
                        "type": "boolean",
                        "description": "Opt-in publicité."
                      },
                      "xAdd": {
                        "type": "boolean",
                        "description": "true : ajoute un contact ; false ou absent : remplace le contact existant."
                      }
                    }
                  }
                }
              },
              "sectionAdresse": {
                "type": "object",
                "properties": {
                  "remarques": {
                    "type": "string"
                  },
                  "adresse1": {
                    "type": "string"
                  },
                  "adresse2": {
                    "type": "string"
                  },
                  "cp": {
                    "type": "string"
                  },
                  "ville": {
                    "type": "string"
                  }
                }
              },
              "sectionNotes": {
                "type": "object",
                "properties": {
                  "descriptif": {
                    "type": "string"
                  },
                  "note1": {
                    "type": "string"
                  },
                  "note2": {
                    "type": "string"
                  },
                  "note3": {
                    "type": "string"
                  },
                  "note4": {
                    "type": "string"
                  },
                  "note5": {
                    "type": "string"
                  },
                  "note6": {
                    "type": "string"
                  }
                }
              }
            },
            "description": "Ce qu'il faut changer. Une propriété absente n'est pas touchée. La valeur spéciale « ----- » (cinq tirets) vide la valeur existante."
          }
        },
        "description": "Corps de la modification (PUT).",
        "required": [
          "sectionRecherche",
          "sectionModif"
        ]
      },
      "ClientReponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "code": {
            "type": "string"
          },
          "uuid": {
            "type": "string"
          },
          "ean": {
            "type": "string",
            "description": "Code-barre interne."
          },
          "idExterne": {
            "type": "string"
          },
          "clientCree": {
            "type": "boolean",
            "description": "Présente (true) quand le client vient d'être créé."
          },
          "clientModifie": {
            "type": "boolean",
            "description": "Présente (true) quand un client existant a été mis à jour."
          }
        },
        "description": "Réponse d'une création ou d'une modification."
      }
    }
  }
}
