{
  "openapi": "3.1.0",
  "info": {
    "title": "API uggo",
    "version": "2026-08-31",
    "summary": "Contacts, sociétés, appels, rendez-vous, deals, leads et objets personnalisés d'un espace uggo.",
    "description": "API REST de uggo, le CRM de prospection et power dialer. Elle lit et écrit les données d'un espace : chaque clé appartient à un espace et n'en voit pas d'autre.\n\n- Authentification : en-tête `Authorization: Bearer lmk_live_…`, clé créée dans Réglages, API. Scope `read` pour lire, `write` pour POST et PATCH.\n- Formules : Premium (Freelance) et Entreprise Plus.\n- Pagination par curseur : `limit`, puis `cursor` = `next_cursor` de la page précédente.\n- Limite : 120 requêtes par fenêtre de 10 secondes et par clé.\n- Erreurs : `{ \"error\": { \"code\", \"message\", \"hint\" } }`, code stable et indication pour corriger.\n- Documentation, webhooks sortants signés et serveur MCP : https://www.uggo.app/developpeurs",
    "contact": {
      "name": "Support uggo",
      "email": "support@uggo.app"
    }
  },
  "externalDocs": {
    "description": "Documentation de l'API, des webhooks et du serveur MCP",
    "url": "https://www.uggo.app/developpeurs"
  },
  "servers": [
    {
      "url": "https://iwmtiwjknbwymbajbzaz.supabase.co/functions/v1/api-v1",
      "description": "Production"
    }
  ],
  "security": [
    {
      "apiKey": []
    }
  ],
  "tags": [
    {
      "name": "API",
      "description": "Point d'entrée."
    },
    {
      "name": "Contacts",
      "description": "Prospects et leurs notes."
    },
    {
      "name": "Companies",
      "description": "Sociétés."
    },
    {
      "name": "Calls",
      "description": "Appels, en lecture seule."
    },
    {
      "name": "Meetings",
      "description": "Rendez-vous et découvertes."
    },
    {
      "name": "Deals",
      "description": "Pipeline."
    },
    {
      "name": "Leads",
      "description": "Leads entrants."
    },
    {
      "name": "Builder",
      "description": "Champs et objets personnalisés."
    }
  ],
  "paths": {
    "/": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "Point d'entrée de l'API",
        "description": "Vérifie la clé et renvoie la version de l'API, les chemins en lecture et les opérations d'écriture.",
        "tags": [
          "API"
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/contacts": {
      "get": {
        "operationId": "listContacts",
        "summary": "Lister les contacts",
        "description": "Liste les contacts de l'espace de la clé, du plus récent au plus ancien, par pages de 50 (jusqu'à 200) avec un curseur. `updated_since` ne renvoie que les lignes modifiées depuis une date.",
        "tags": [
          "Contacts"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      },
      "post": {
        "operationId": "createContact",
        "summary": "Créer un contact",
        "description": "Crée un contact (scope `write`) ; au moins un de first_name, last_name, email, phone ou mobile. `custom_fields.call_status` accepte : nouveau, to_call, not_reachable, callback, called, interested, booked, refused, wrong_number, dnc, mv_timing, mv_cible, no_follow_up.",
        "tags": [
          "Contacts"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactInput"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Contact"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/contacts/{id}": {
      "get": {
        "operationId": "getContact",
        "summary": "Lire un contact",
        "description": "Renvoie un contact de l'espace de la clé par son identifiant.",
        "tags": [
          "Contacts"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Contact"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      },
      "patch": {
        "operationId": "updateContact",
        "summary": "Modifier un contact",
        "description": "Modifie les champs envoyés d'un contact (scope `write`) ; les autres restent tels quels, `null` efface une valeur. Renvoie l'objet modifié.",
        "tags": [
          "Contacts"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Contact"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/contacts/{id}/notes": {
      "get": {
        "operationId": "listContactNotes",
        "summary": "Lister les notes d'un contact",
        "description": "Renvoie les notes d'un contact, de la plus récente à la plus ancienne, jusqu'à `limit` (200 au plus), en une seule page.",
        "tags": [
          "Contacts"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          },
          {
            "$ref": "#/components/parameters/Limit"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NoteList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      },
      "post": {
        "operationId": "createContactNote",
        "summary": "Ajouter une note à un contact",
        "description": "Ajoute une note à un contact (scope `write`), avec `source` = `api`. Le corps ne contient que `content`.",
        "tags": [
          "Contacts"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NoteInput"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Note"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/companies": {
      "get": {
        "operationId": "listCompanies",
        "summary": "Lister les sociétés",
        "description": "Liste les sociétés de l'espace de la clé, du plus récent au plus ancien, par pages de 50 (jusqu'à 200) avec un curseur. `updated_since` ne renvoie que les lignes modifiées depuis une date.",
        "tags": [
          "Companies"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompanyList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      },
      "post": {
        "operationId": "createCompany",
        "summary": "Créer un société",
        "description": "Crée un société dans l'espace de la clé (scope `write`). Renvoie l'objet créé.",
        "tags": [
          "Companies"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompanyInput"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/companies/{id}": {
      "get": {
        "operationId": "getCompany",
        "summary": "Lire un société",
        "description": "Renvoie un société de l'espace de la clé par son identifiant.",
        "tags": [
          "Companies"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      },
      "patch": {
        "operationId": "updateCompany",
        "summary": "Modifier un société",
        "description": "Modifie les champs envoyés d'un société (scope `write`) ; les autres restent tels quels, `null` efface une valeur. Renvoie l'objet modifié.",
        "tags": [
          "Companies"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompanyInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/calls": {
      "get": {
        "operationId": "listCalls",
        "summary": "Lister les appels",
        "description": "Liste les appels de l'espace de la clé, du plus récent au plus ancien, par pages de 50 (jusqu'à 200) avec un curseur. `updated_since` ne renvoie que les lignes modifiées depuis une date.",
        "tags": [
          "Calls"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CallList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/calls/{id}": {
      "get": {
        "operationId": "getCall",
        "summary": "Lire un appel",
        "description": "Renvoie un appel de l'espace de la clé par son identifiant, avec les champs du détail.",
        "tags": [
          "Calls"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CallDetail"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/meetings": {
      "get": {
        "operationId": "listMeetings",
        "summary": "Lister les rendez-vous",
        "description": "Liste les rendez-vous de l'espace de la clé, du plus récent au plus ancien, par pages de 50 (jusqu'à 200) avec un curseur. `updated_since` ne renvoie que les lignes modifiées depuis une date.",
        "tags": [
          "Meetings"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeetingList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      },
      "post": {
        "operationId": "createMeeting",
        "summary": "Créer un rendez-vous",
        "description": "Crée un rendez-vous ou une découverte (scope `write`) : `scheduled_at` requis ; `company_name`, ou un contact ou une société rattachés ; `mission_id` requis hors espace Entreprise. Statut `booked` par défaut.",
        "tags": [
          "Meetings"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MeetingInput"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Meeting"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/meetings/{id}": {
      "get": {
        "operationId": "getMeeting",
        "summary": "Lire un rendez-vous",
        "description": "Renvoie un rendez-vous de l'espace de la clé par son identifiant.",
        "tags": [
          "Meetings"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Meeting"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      },
      "patch": {
        "operationId": "updateMeeting",
        "summary": "Modifier un rendez-vous",
        "description": "Modifie les champs envoyés d'un rendez-vous (scope `write`) ; les autres restent tels quels, `null` efface une valeur. Renvoie l'objet modifié.",
        "tags": [
          "Meetings"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MeetingInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Meeting"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/deals": {
      "get": {
        "operationId": "listDeals",
        "summary": "Lister les deals",
        "description": "Liste les deals de l'espace de la clé, du plus récent au plus ancien, par pages de 50 (jusqu'à 200) avec un curseur. `updated_since` ne renvoie que les lignes modifiées depuis une date.",
        "tags": [
          "Deals"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DealList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      },
      "post": {
        "operationId": "createDeal",
        "summary": "Créer un deal",
        "description": "Crée un deal (scope `write`) sur la première étape ouverte du pipeline, ou sur `stage_id`. Sans `title`, le titre vient de la société ou du contact.",
        "tags": [
          "Deals"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DealCreateInput"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Deal"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/deals/{id}": {
      "get": {
        "operationId": "getDeal",
        "summary": "Lire un deal",
        "description": "Renvoie un deal de l'espace de la clé par son identifiant.",
        "tags": [
          "Deals"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Deal"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      },
      "patch": {
        "operationId": "updateDeal",
        "summary": "Modifier un deal",
        "description": "Modifie les champs envoyés d'un deal (scope `write`) ; les autres restent tels quels, `null` efface une valeur. Renvoie l'objet modifié.",
        "tags": [
          "Deals"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DealUpdateInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Deal"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/leads": {
      "get": {
        "operationId": "listLeads",
        "summary": "Lister les leads entrants",
        "description": "Liste les leads entrants de l'espace de la clé, du plus récent au plus ancien, par pages de 50 (jusqu'à 200) avec un curseur. `updated_since` ne renvoie que les lignes modifiées depuis une date.",
        "tags": [
          "Leads"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      },
      "post": {
        "operationId": "createLead",
        "summary": "Créer un lead",
        "description": "Pousse un lead entrant dans le bac de réception (scope `write`), comme une réponse de formulaire : aucune fiche n'est touchée avant qualification. `identity.email` ou `identity.phone_e164` requis ; `external_id` est unique par espace.",
        "tags": [
          "Leads"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LeadInput"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lead"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/leads/{id}": {
      "get": {
        "operationId": "getLead",
        "summary": "Lire un lead",
        "description": "Renvoie un lead de l'espace de la clé par son identifiant.",
        "tags": [
          "Leads"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lead"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/fields": {
      "get": {
        "operationId": "listFields",
        "summary": "Lister les champs personnalisés",
        "description": "Renvoie le catalogue des champs personnalisés des contacts, sociétés et deals : clés à envoyer dans `custom_fields`, types et choix.",
        "tags": [
          "Builder"
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FieldCatalog"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/objects": {
      "get": {
        "operationId": "listObjects",
        "summary": "Lister les objets personnalisés",
        "description": "Renvoie les objets personnalisés de l'espace (Contrats, Projets…) et leurs champs.",
        "tags": [
          "Builder"
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObjectCatalog"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/objects/{slug}": {
      "get": {
        "operationId": "getObject",
        "summary": "Lire un objet personnalisé",
        "description": "Renvoie un objet personnalisé et ses champs, par son slug.",
        "tags": [
          "Builder"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Slug"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomObject"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/objects/{slug}/records": {
      "get": {
        "operationId": "listObjectRecords",
        "summary": "Lister les fiches d'un objet",
        "description": "Liste les fiches actives d'un objet personnalisé, avec la même pagination que les autres listes ; `q` cherche dans le titre, `archived=true` inclut les archivées.",
        "tags": [
          "Builder"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Slug"
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/UpdatedSince"
          },
          {
            "$ref": "#/components/parameters/Query"
          },
          {
            "$ref": "#/components/parameters/Archived"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecordList"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      },
      "post": {
        "operationId": "createObjectRecord",
        "summary": "Créer une fiche d'objet",
        "description": "Crée une fiche d'objet personnalisé (scope `write`, formule avec le Builder). `data` n'accepte que les clés du catalogue de l'objet.",
        "tags": [
          "Builder"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Slug"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecordCreateInput"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Record"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/objects/{slug}/records/{record_id}": {
      "get": {
        "operationId": "getObjectRecord",
        "summary": "Lire une fiche d'objet",
        "description": "Renvoie une fiche d'objet personnalisé par son identifiant.",
        "tags": [
          "Builder"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Slug"
          },
          {
            "$ref": "#/components/parameters/RecordId"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Record"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      },
      "patch": {
        "operationId": "updateObjectRecord",
        "summary": "Modifier une fiche d'objet",
        "description": "Modifie une fiche d'objet personnalisé (scope `write`, formule avec le Builder) : `data` est fusionné, `archived` archive ou restaure.",
        "tags": [
          "Builder"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/Slug"
          },
          {
            "$ref": "#/components/parameters/RecordId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecordUpdateInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Record"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "422": {
            "$ref": "#/components/responses/Unprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "apiKey": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "lmk_live_…",
        "description": "Clé d'espace créée dans Réglages, API."
      }
    },
    "parameters": {
      "Id": {
        "name": "id",
        "in": "path",
        "required": true,
        "description": "Identifiant de la ressource (uuid).",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "Slug": {
        "name": "slug",
        "in": "path",
        "required": true,
        "description": "Slug de l'objet personnalisé (GET /objects).",
        "schema": {
          "type": "string"
        }
      },
      "RecordId": {
        "name": "record_id",
        "in": "path",
        "required": true,
        "description": "Identifiant de la fiche (uuid).",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      },
      "Limit": {
        "name": "limit",
        "in": "query",
        "required": false,
        "description": "Taille de la page, de 1 à 200.",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 200,
          "default": 50
        }
      },
      "Cursor": {
        "name": "cursor",
        "in": "query",
        "required": false,
        "description": "`next_cursor` de la page précédente (opaque).",
        "schema": {
          "type": "string"
        }
      },
      "UpdatedSince": {
        "name": "updated_since",
        "in": "query",
        "required": false,
        "description": "Ne renvoie que les lignes modifiées depuis cette date (ISO 8601), pour une synchronisation incrémentale.",
        "schema": {
          "type": "string",
          "format": "date-time"
        }
      },
      "Query": {
        "name": "q",
        "in": "query",
        "required": false,
        "description": "Recherche dans le titre des fiches.",
        "schema": {
          "type": "string"
        }
      },
      "Archived": {
        "name": "archived",
        "in": "query",
        "required": false,
        "description": "true inclut les fiches archivées.",
        "schema": {
          "type": "boolean",
          "default": false
        }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Paramètre ou corps invalide (`invalid_request`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Clé absente, inconnue ou révoquée (`unauthorized`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Forbidden": {
        "description": "Scope manquant (`forbidden`) ou formule sans l'API (`plan_gated`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotFound": {
        "description": "Ressource introuvable dans l'espace de la clé (`not_found`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "MethodNotAllowed": {
        "description": "Méthode non prise en charge sur ce chemin (`method_not_allowed`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Conflict": {
        "description": "Déjà existant (`already_exists`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unprocessable": {
        "description": "Référence hors espace ou valeur de champ refusée (`invalid_reference`, `invalid_custom_fields`, `invalid_data`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Plus de 120 requêtes en 10 secondes pour cette clé (`rate_limited`) ; réessayer après `Retry-After` secondes.",
        "headers": {
          "Retry-After": {
            "description": "Secondes à attendre.",
            "schema": {
              "type": "integer"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "ServerError": {
        "description": "Erreur interne (`internal_error`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "schemas": {
      "Contact": {
        "type": "object",
        "description": "Contact (prospect).",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant (uuid)."
          },
          "first_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Prénom."
          },
          "last_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom."
          },
          "email": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse e-mail.",
            "format": "email"
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Téléphone fixe ou principal, de préférence au format E.164 (+33…)."
          },
          "mobile": {
            "type": [
              "string",
              "null"
            ],
            "description": "Téléphone portable, de préférence au format E.164."
          },
          "job_title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Poste."
          },
          "linkedin_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL du profil LinkedIn.",
            "format": "uri"
          },
          "source": {
            "type": [
              "string",
              "null"
            ],
            "description": "Provenance du contact (texte libre : salon, import, site…)."
          },
          "tags": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            },
            "description": "Étiquettes libres."
          },
          "custom_fields": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Champs personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, `null` l'efface. `call_status` porte le statut de prospection d'un contact."
          },
          "company_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Société de rattachement (GET /companies)."
          },
          "mission_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Mission ou campagne de rattachement."
          },
          "callback_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Rappel planifié (ISO 8601)."
          },
          "last_call_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Dernier appel."
          },
          "last_activity_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Dernière activité."
          },
          "nrp_count": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Appels sans réponse d'affilée (NRP)."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Création."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Dernière modification."
          }
        },
        "required": [
          "id",
          "created_at",
          "updated_at"
        ]
      },
      "ContactInput": {
        "type": "object",
        "description": "Champs d'un contact en écriture ; à la création, au moins un de first_name, last_name, email, phone ou mobile.",
        "properties": {
          "first_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Prénom."
          },
          "last_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom."
          },
          "email": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse e-mail.",
            "format": "email"
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Téléphone fixe ou principal, de préférence au format E.164 (+33…)."
          },
          "mobile": {
            "type": [
              "string",
              "null"
            ],
            "description": "Téléphone portable, de préférence au format E.164."
          },
          "job_title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Poste."
          },
          "linkedin_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "URL du profil LinkedIn.",
            "format": "uri"
          },
          "source": {
            "type": [
              "string",
              "null"
            ],
            "description": "Provenance du contact (texte libre : salon, import, site…)."
          },
          "tags": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            },
            "description": "Étiquettes libres."
          },
          "custom_fields": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Champs personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, `null` l'efface. `call_status` porte le statut de prospection d'un contact."
          },
          "company_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Société de rattachement (GET /companies)."
          },
          "mission_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Mission ou campagne de rattachement."
          },
          "callback_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Rappel planifié (ISO 8601)."
          }
        }
      },
      "Company": {
        "type": "object",
        "description": "Société.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant (uuid)."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Raison sociale ou nom d'usage."
          },
          "siren": {
            "type": [
              "string",
              "null"
            ],
            "description": "SIREN (9 chiffres)."
          },
          "naf_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code NAF ou APE."
          },
          "industry": {
            "type": [
              "string",
              "null"
            ],
            "description": "Secteur."
          },
          "size": {
            "type": [
              "string",
              "null"
            ],
            "description": "Tranche d'effectif."
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "description": "Ville."
          },
          "domain": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de domaine (exemple.fr)."
          },
          "website": {
            "type": [
              "string",
              "null"
            ],
            "description": "Site web.",
            "format": "uri"
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Standard."
          },
          "generic_email": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse e-mail générique (contact@…)."
          },
          "tags": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            },
            "description": "Étiquettes libres."
          },
          "custom_fields": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Champs personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, `null` l'efface. `call_status` porte le statut de prospection d'un contact."
          },
          "mission_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Mission ou campagne de rattachement."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Création."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Dernière modification."
          }
        },
        "required": [
          "id",
          "created_at",
          "updated_at"
        ]
      },
      "CompanyInput": {
        "type": "object",
        "description": "Champs d'une société en écriture ; `name` requis à la création.",
        "properties": {
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Raison sociale ou nom d'usage."
          },
          "siren": {
            "type": [
              "string",
              "null"
            ],
            "description": "SIREN (9 chiffres)."
          },
          "naf_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "Code NAF ou APE."
          },
          "industry": {
            "type": [
              "string",
              "null"
            ],
            "description": "Secteur."
          },
          "size": {
            "type": [
              "string",
              "null"
            ],
            "description": "Tranche d'effectif."
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "description": "Ville."
          },
          "domain": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de domaine (exemple.fr)."
          },
          "website": {
            "type": [
              "string",
              "null"
            ],
            "description": "Site web.",
            "format": "uri"
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Standard."
          },
          "generic_email": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse e-mail générique (contact@…)."
          },
          "tags": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            },
            "description": "Étiquettes libres."
          },
          "custom_fields": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Champs personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, `null` l'efface. `call_status` porte le statut de prospection d'un contact."
          },
          "mission_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Mission ou campagne de rattachement."
          }
        }
      },
      "Call": {
        "type": "object",
        "description": "Appel téléphonique.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant (uuid)."
          },
          "contact_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Contact appelé ou appelant."
          },
          "direction": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sens de l'appel.",
            "enum": [
              "inbound",
              "outbound",
              null
            ]
          },
          "remote_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du correspondant."
          },
          "started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Début de l'appel."
          },
          "duration_sec": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Durée en secondes."
          },
          "status": {
            "type": [
              "string",
              "null"
            ],
            "description": "Statut téléphonique (répondu, sans réponse…)."
          },
          "outcome": {
            "type": [
              "string",
              "null"
            ],
            "description": "Résultat noté par le commercial."
          },
          "summary": {
            "type": [
              "string",
              "null"
            ],
            "description": "Résumé rédigé par Hunter."
          },
          "recording_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Lien de l'enregistrement.",
            "format": "uri"
          },
          "mission_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Mission ou campagne."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Création."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Dernière modification."
          }
        },
        "required": [
          "id",
          "created_at",
          "updated_at"
        ]
      },
      "CallDetail": {
        "type": "object",
        "description": "Appel, avec sa transcription.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant (uuid)."
          },
          "contact_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Contact appelé ou appelant."
          },
          "direction": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sens de l'appel.",
            "enum": [
              "inbound",
              "outbound",
              null
            ]
          },
          "remote_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Numéro du correspondant."
          },
          "started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Début de l'appel."
          },
          "duration_sec": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Durée en secondes."
          },
          "status": {
            "type": [
              "string",
              "null"
            ],
            "description": "Statut téléphonique (répondu, sans réponse…)."
          },
          "outcome": {
            "type": [
              "string",
              "null"
            ],
            "description": "Résultat noté par le commercial."
          },
          "summary": {
            "type": [
              "string",
              "null"
            ],
            "description": "Résumé rédigé par Hunter."
          },
          "recording_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Lien de l'enregistrement.",
            "format": "uri"
          },
          "mission_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Mission ou campagne."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Création."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Dernière modification."
          },
          "transcript": {
            "type": [
              "string",
              "null"
            ],
            "description": "Transcription de l'appel."
          }
        },
        "required": [
          "id",
          "created_at",
          "updated_at"
        ]
      },
      "Meeting": {
        "type": "object",
        "description": "Rendez-vous (découverte en espace Entreprise).",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant (uuid)."
          },
          "scheduled_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Date et heure du rendez-vous (ISO 8601). Requis à la création."
          },
          "status": {
            "type": [
              "string",
              "null"
            ],
            "description": "Statut du rendez-vous.",
            "enum": [
              "booked",
              "validated",
              "paid",
              "rescheduled",
              "no_show",
              "cancelled",
              "rejected",
              null
            ]
          },
          "company_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Société du rendez-vous (requis sans crm_contact_id ni crm_company_id rattaché à une société)."
          },
          "contact_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la personne rencontrée."
          },
          "contact_email": {
            "type": [
              "string",
              "null"
            ],
            "description": "E-mail de la personne rencontrée.",
            "format": "email"
          },
          "contact_phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Téléphone de la personne rencontrée."
          },
          "notes": {
            "type": [
              "string",
              "null"
            ],
            "description": "Notes."
          },
          "report": {
            "type": [
              "string",
              "null"
            ],
            "description": "Compte rendu du rendez-vous."
          },
          "crm_contact_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Contact rencontré ; société et coordonnées en sont déduites."
          },
          "crm_company_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Société rencontrée."
          },
          "mission_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Mission du client ; requise hors espace Entreprise."
          },
          "origin": {
            "type": [
              "string",
              "null"
            ],
            "description": "Espace Entreprise : origine de la découverte.",
            "enum": [
              "outbound",
              "inbound",
              null
            ]
          },
          "assigned_user_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Espace Entreprise : closer attribué (membre actif de l'espace)."
          },
          "sdr_user_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Membre qui a posé le rendez-vous."
          },
          "held_auto": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Validé automatiquement à J+5."
          },
          "invite_prospect": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Invite le contact à l'événement d'agenda."
          },
          "calendar_event_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Événement d'agenda lié."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Création."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Dernière modification."
          }
        },
        "required": [
          "id",
          "created_at",
          "updated_at"
        ]
      },
      "MeetingInput": {
        "type": "object",
        "description": "Champs d'un rendez-vous en écriture ; `scheduled_at` requis à la création.",
        "properties": {
          "company_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Société du rendez-vous (requis sans crm_contact_id ni crm_company_id rattaché à une société)."
          },
          "contact_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la personne rencontrée."
          },
          "contact_email": {
            "type": [
              "string",
              "null"
            ],
            "description": "E-mail de la personne rencontrée.",
            "format": "email"
          },
          "contact_phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Téléphone de la personne rencontrée."
          },
          "scheduled_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Date et heure du rendez-vous (ISO 8601). Requis à la création."
          },
          "status": {
            "type": [
              "string",
              "null"
            ],
            "description": "Statut du rendez-vous.",
            "enum": [
              "booked",
              "validated",
              "paid",
              "rescheduled",
              "no_show",
              "cancelled",
              "rejected",
              null
            ]
          },
          "notes": {
            "type": [
              "string",
              "null"
            ],
            "description": "Notes."
          },
          "crm_contact_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Contact rencontré ; société et coordonnées en sont déduites."
          },
          "crm_company_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Société rencontrée."
          },
          "mission_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Mission du client ; requise hors espace Entreprise."
          },
          "origin": {
            "type": [
              "string",
              "null"
            ],
            "description": "Espace Entreprise : origine de la découverte.",
            "enum": [
              "outbound",
              "inbound",
              null
            ]
          },
          "assigned_user_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Espace Entreprise : closer attribué (membre actif de l'espace)."
          },
          "invite_prospect": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Invite le contact à l'événement d'agenda."
          }
        }
      },
      "Deal": {
        "type": "object",
        "description": "Deal du pipeline (opportunité en espace Entreprise).",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant (uuid)."
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Titre du deal."
          },
          "amount": {
            "type": [
              "number",
              "null"
            ],
            "description": "Montant."
          },
          "currency": {
            "type": [
              "string",
              "null"
            ],
            "description": "Devise (EUR…)."
          },
          "probability": {
            "type": [
              "number",
              "null"
            ],
            "description": "Probabilité de gain, de 0 à 100.",
            "minimum": 0,
            "maximum": 100
          },
          "stage_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Étape du pipeline ; won_at, lost_at et lost_reason suivent le type d'étape."
          },
          "contact_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Contact du deal (création seulement)."
          },
          "company_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Société du deal (création seulement ; déduite du contact sinon)."
          },
          "notes": {
            "type": [
              "string",
              "null"
            ],
            "description": "Notes."
          },
          "expected_close_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Date de signature attendue."
          },
          "won_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Gagné le."
          },
          "lost_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Perdu le."
          },
          "lost_reason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Motif de perte."
          },
          "custom_fields": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Champs personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, `null` l'efface. `call_status` porte le statut de prospection d'un contact."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Création."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Dernière modification."
          }
        },
        "required": [
          "id",
          "created_at",
          "updated_at"
        ]
      },
      "DealCreateInput": {
        "type": "object",
        "description": "Champs d'un nouveau deal ; `title` requis sans contact_id ni company_id.",
        "properties": {
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Titre du deal."
          },
          "amount": {
            "type": [
              "number",
              "null"
            ],
            "description": "Montant."
          },
          "probability": {
            "type": [
              "number",
              "null"
            ],
            "description": "Probabilité de gain, de 0 à 100.",
            "minimum": 0,
            "maximum": 100
          },
          "notes": {
            "type": [
              "string",
              "null"
            ],
            "description": "Notes."
          },
          "expected_close_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Date de signature attendue."
          },
          "stage_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Étape du pipeline ; won_at, lost_at et lost_reason suivent le type d'étape."
          },
          "lost_reason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Motif de perte."
          },
          "custom_fields": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Champs personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, `null` l'efface. `call_status` porte le statut de prospection d'un contact."
          },
          "contact_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Contact du deal (création seulement)."
          },
          "company_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Société du deal (création seulement ; déduite du contact sinon)."
          }
        }
      },
      "DealUpdateInput": {
        "type": "object",
        "description": "Champs modifiables d'un deal.",
        "properties": {
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Titre du deal."
          },
          "amount": {
            "type": [
              "number",
              "null"
            ],
            "description": "Montant."
          },
          "probability": {
            "type": [
              "number",
              "null"
            ],
            "description": "Probabilité de gain, de 0 à 100.",
            "minimum": 0,
            "maximum": 100
          },
          "notes": {
            "type": [
              "string",
              "null"
            ],
            "description": "Notes."
          },
          "expected_close_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Date de signature attendue."
          },
          "stage_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Étape du pipeline ; won_at, lost_at et lost_reason suivent le type d'étape."
          },
          "lost_reason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Motif de perte."
          },
          "custom_fields": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Champs personnalisés de l'espace, par clé (catalogue : GET /fields). Fusionnés en PATCH : une clé absente est gardée, `null` l'efface. `call_status` porte le statut de prospection d'un contact."
          }
        }
      },
      "Note": {
        "type": "object",
        "description": "Note d'un contact.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant (uuid)."
          },
          "contact_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Contact de la note."
          },
          "content": {
            "type": [
              "string",
              "null"
            ],
            "description": "Texte de la note."
          },
          "source": {
            "type": [
              "string",
              "null"
            ],
            "description": "Origine (`api` pour une note créée par l'API)."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Création."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Dernière modification."
          }
        },
        "required": [
          "id",
          "contact_id",
          "content",
          "created_at"
        ]
      },
      "NoteInput": {
        "type": "object",
        "description": "Nouvelle note.",
        "properties": {
          "content": {
            "type": "string",
            "minLength": 1,
            "description": "Texte de la note."
          }
        },
        "required": [
          "content"
        ]
      },
      "Lead": {
        "type": "object",
        "description": "Lead entrant, dans le bac de réception.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant (uuid)."
          },
          "source": {
            "type": [
              "string",
              "null"
            ],
            "description": "Origine du lead (`api`, `form`, `signup`…)."
          },
          "form_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Formulaire public d'origine."
          },
          "status": {
            "type": [
              "string",
              "null"
            ],
            "description": "État dans le bac de réception."
          },
          "score": {
            "type": [
              "number",
              "null"
            ],
            "description": "Score de qualification."
          },
          "identity": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Identité du prospect ; `email` ou `phone_e164` requis.",
            "properties": {
              "email": {
                "type": "string",
                "format": "email",
                "description": "E-mail."
              },
              "phone_e164": {
                "type": "string",
                "description": "Téléphone au format E.164 (+33612345678)."
              },
              "first_name": {
                "type": "string",
                "description": "Prénom."
              },
              "last_name": {
                "type": "string",
                "description": "Nom."
              },
              "company": {
                "type": "string",
                "description": "Société."
              },
              "job_title": {
                "type": "string",
                "description": "Poste."
              },
              "website": {
                "type": "string",
                "description": "Site web de la société."
              }
            }
          },
          "payload": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Réponses ou données brutes du formulaire d'origine."
          },
          "utm": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Paramètres UTM de la visite (utm_source, utm_campaign…)."
          },
          "referrer": {
            "type": [
              "string",
              "null"
            ],
            "description": "Page d'origine."
          },
          "contact_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Contact créé ou rapproché."
          },
          "company_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Société créée ou rapprochée."
          },
          "owner_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Membre actif de l'espace à qui confier le lead."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Création."
          },
          "handled_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Traité le."
          }
        },
        "required": [
          "id",
          "created_at"
        ]
      },
      "LeadInput": {
        "type": "object",
        "description": "Lead entrant poussé par un site ou un outil no-code.",
        "properties": {
          "identity": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Identité du prospect ; `email` ou `phone_e164` requis.",
            "properties": {
              "email": {
                "type": "string",
                "format": "email",
                "description": "E-mail."
              },
              "phone_e164": {
                "type": "string",
                "description": "Téléphone au format E.164 (+33612345678)."
              },
              "first_name": {
                "type": "string",
                "description": "Prénom."
              },
              "last_name": {
                "type": "string",
                "description": "Nom."
              },
              "company": {
                "type": "string",
                "description": "Société."
              },
              "job_title": {
                "type": "string",
                "description": "Poste."
              },
              "website": {
                "type": "string",
                "description": "Site web de la société."
              }
            }
          },
          "payload": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Réponses ou données brutes du formulaire d'origine."
          },
          "utm": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Paramètres UTM de la visite (utm_source, utm_campaign…)."
          },
          "referrer": {
            "type": [
              "string",
              "null"
            ],
            "description": "Page d'origine."
          },
          "external_source": {
            "type": [
              "string",
              "null"
            ],
            "description": "Système d'origine (site, Typeform…)."
          },
          "external_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Identifiant dans le système d'origine ; unique par espace."
          },
          "owner_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Membre actif de l'espace à qui confier le lead."
          },
          "score": {
            "type": [
              "number",
              "null"
            ],
            "description": "Score de qualification."
          }
        },
        "required": [
          "identity"
        ]
      },
      "Field": {
        "type": "object",
        "description": "Champ personnalisé de l'espace (Builder).",
        "properties": {
          "objet": {
            "type": "string",
            "description": "Fiche du champ : contact, company, deal, ou obj:<id> pour un objet personnalisé."
          },
          "cle": {
            "type": "string",
            "description": "Clé à envoyer dans custom_fields ou data."
          },
          "libelle": {
            "type": "string",
            "description": "Libellé affiché."
          },
          "type": {
            "type": "string",
            "description": "Type du champ (texte, nombre, date, choix…)."
          },
          "obligatoire": {
            "type": "boolean",
            "description": "Requis à la création."
          },
          "choix": {
            "type": "array",
            "description": "Choix possibles d'une liste ; s'envoient par id (ou par libellé).",
            "items": {
              "type": "object",
              "description": "Choix.",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Identifiant du choix."
                },
                "libelle": {
                  "type": "string",
                  "description": "Libellé."
                }
              },
              "required": [
                "id",
                "libelle"
              ]
            }
          },
          "plusieurs": {
            "type": "boolean",
            "description": "Plusieurs choix possibles."
          },
          "aide": {
            "type": "string",
            "description": "Texte d'aide."
          }
        },
        "required": [
          "objet",
          "cle",
          "libelle",
          "type",
          "obligatoire"
        ]
      },
      "CustomObject": {
        "type": "object",
        "description": "Objet personnalisé de l'espace (Contrats, Projets…).",
        "properties": {
          "slug": {
            "type": "string",
            "description": "Identifiant stable de l'objet, dans les chemins."
          },
          "nom": {
            "type": "string",
            "description": "Nom au singulier."
          },
          "pluriel": {
            "type": "string",
            "description": "Nom au pluriel."
          },
          "champ_titre": {
            "type": "string",
            "description": "Clé du champ qui sert de titre (`nom` par défaut)."
          },
          "champs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Field"
            },
            "description": "Champs de l'objet."
          }
        },
        "required": [
          "slug",
          "nom",
          "pluriel",
          "champ_titre",
          "champs"
        ]
      },
      "Record": {
        "type": "object",
        "description": "Fiche d'un objet personnalisé.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant (uuid)."
          },
          "object": {
            "type": "string",
            "description": "Slug de l'objet."
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Valeur du champ titre."
          },
          "data": {
            "type": "object",
            "additionalProperties": true,
            "description": "Valeurs, par clé de champ."
          },
          "owner_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Responsable de la fiche."
          },
          "created_by": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Auteur ; null pour une création par clé API."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Création."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "Dernière modification."
          },
          "archived_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Archivée le ; null si active."
          }
        },
        "required": [
          "id",
          "object",
          "data",
          "created_at",
          "updated_at"
        ]
      },
      "RecordCreateInput": {
        "type": "object",
        "description": "Nouvelle fiche d'objet.",
        "properties": {
          "data": {
            "type": "object",
            "additionalProperties": true,
            "description": "Valeurs par clé du catalogue de l'objet ; le champ titre est requis."
          },
          "owner_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Responsable (membre actif de l'espace)."
          }
        },
        "required": [
          "data"
        ]
      },
      "RecordUpdateInput": {
        "type": "object",
        "description": "Modification d'une fiche d'objet.",
        "properties": {
          "data": {
            "type": "object",
            "additionalProperties": true,
            "description": "Valeurs à changer, fusionnées ; `null` efface une valeur."
          },
          "owner_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Responsable (membre actif de l'espace)."
          },
          "archived": {
            "type": "boolean",
            "description": "true archive la fiche, false la restaure."
          }
        }
      },
      "ContactList": {
        "type": "object",
        "description": "Page de contacts.",
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Toujours `list`."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Contact"
            },
            "description": "Éléments de la page, du plus récent au plus ancien."
          },
          "has_more": {
            "type": "boolean",
            "description": "Une page suivante existe."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "À passer dans `cursor` pour la page suivante ; null en fin de liste."
          }
        },
        "required": [
          "object",
          "data",
          "has_more",
          "next_cursor"
        ]
      },
      "CompanyList": {
        "type": "object",
        "description": "Page de sociétés.",
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Toujours `list`."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Company"
            },
            "description": "Éléments de la page, du plus récent au plus ancien."
          },
          "has_more": {
            "type": "boolean",
            "description": "Une page suivante existe."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "À passer dans `cursor` pour la page suivante ; null en fin de liste."
          }
        },
        "required": [
          "object",
          "data",
          "has_more",
          "next_cursor"
        ]
      },
      "CallList": {
        "type": "object",
        "description": "Page d'appels.",
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Toujours `list`."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Call"
            },
            "description": "Éléments de la page, du plus récent au plus ancien."
          },
          "has_more": {
            "type": "boolean",
            "description": "Une page suivante existe."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "À passer dans `cursor` pour la page suivante ; null en fin de liste."
          }
        },
        "required": [
          "object",
          "data",
          "has_more",
          "next_cursor"
        ]
      },
      "MeetingList": {
        "type": "object",
        "description": "Page de rendez-vous.",
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Toujours `list`."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Meeting"
            },
            "description": "Éléments de la page, du plus récent au plus ancien."
          },
          "has_more": {
            "type": "boolean",
            "description": "Une page suivante existe."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "À passer dans `cursor` pour la page suivante ; null en fin de liste."
          }
        },
        "required": [
          "object",
          "data",
          "has_more",
          "next_cursor"
        ]
      },
      "DealList": {
        "type": "object",
        "description": "Page de deals.",
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Toujours `list`."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Deal"
            },
            "description": "Éléments de la page, du plus récent au plus ancien."
          },
          "has_more": {
            "type": "boolean",
            "description": "Une page suivante existe."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "À passer dans `cursor` pour la page suivante ; null en fin de liste."
          }
        },
        "required": [
          "object",
          "data",
          "has_more",
          "next_cursor"
        ]
      },
      "LeadList": {
        "type": "object",
        "description": "Page de leads entrants.",
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Toujours `list`."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Lead"
            },
            "description": "Éléments de la page, du plus récent au plus ancien."
          },
          "has_more": {
            "type": "boolean",
            "description": "Une page suivante existe."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "À passer dans `cursor` pour la page suivante ; null en fin de liste."
          }
        },
        "required": [
          "object",
          "data",
          "has_more",
          "next_cursor"
        ]
      },
      "NoteList": {
        "type": "object",
        "description": "Notes d'un contact (une seule page).",
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Toujours `list`."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Note"
            },
            "description": "Éléments de la page, du plus récent au plus ancien."
          },
          "has_more": {
            "type": "boolean",
            "description": "Une page suivante existe."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "À passer dans `cursor` pour la page suivante ; null en fin de liste."
          }
        },
        "required": [
          "object",
          "data",
          "has_more",
          "next_cursor"
        ]
      },
      "RecordList": {
        "type": "object",
        "description": "Page de fiches d'objet.",
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Toujours `list`."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Record"
            },
            "description": "Éléments de la page, du plus récent au plus ancien."
          },
          "has_more": {
            "type": "boolean",
            "description": "Une page suivante existe."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "À passer dans `cursor` pour la page suivante ; null en fin de liste."
          }
        },
        "required": [
          "object",
          "data",
          "has_more",
          "next_cursor"
        ]
      },
      "FieldCatalog": {
        "type": "object",
        "description": "Catalogue des champs.",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Field"
            },
            "description": "Champs."
          }
        },
        "required": [
          "data"
        ]
      },
      "ObjectCatalog": {
        "type": "object",
        "description": "Objets de l'espace.",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CustomObject"
            },
            "description": "Objets."
          }
        },
        "required": [
          "data"
        ]
      },
      "ApiIndex": {
        "type": "object",
        "description": "Point d'entrée de l'API.",
        "properties": {
          "name": {
            "type": "string",
            "description": "Toujours `uggo-api`."
          },
          "version": {
            "type": "string",
            "description": "Version de l'API."
          },
          "resources": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Chemins en lecture."
          },
          "write": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Opérations d'écriture."
          },
          "docs": {
            "type": "string",
            "format": "uri",
            "description": "Cette spécification."
          }
        },
        "required": [
          "name",
          "version",
          "resources",
          "write",
          "docs"
        ]
      },
      "Error": {
        "type": "object",
        "description": "Erreur de l'API.",
        "properties": {
          "error": {
            "type": "object",
            "description": "Détail de l'erreur.",
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "invalid_request",
                  "unauthorized",
                  "forbidden",
                  "plan_gated",
                  "not_found",
                  "method_not_allowed",
                  "already_exists",
                  "invalid_reference",
                  "invalid_custom_fields",
                  "invalid_data",
                  "rate_limited",
                  "internal_error"
                ],
                "description": "Code stable, à tester par programme."
              },
              "message": {
                "type": "string",
                "description": "Ce qui ne va pas, en français."
              },
              "hint": {
                "type": "string",
                "description": "Comment corriger ou quoi faire ensuite."
              }
            },
            "required": [
              "code",
              "message",
              "hint"
            ]
          }
        },
        "required": [
          "error"
        ]
      }
    }
  }
}
