Contacts — CRUD
Gestion des contacts (personnes physiques rattachées à des clients via la table de jointure contact_clients).
Source : server/publicApi/routes/crm.ts:166-307. Schéma : insertContactSchema dans shared/schema.ts.
Vue d'ensemble
| Méthode | Path | Scope |
|---|---|---|
GET | /contacts | contacts:read |
GET | /contacts/:id | contacts:read |
POST | /contacts | contacts:write |
PATCH | /contacts/:id | contacts:write |
DELETE | /contacts/:id | contacts:delete |
Pas de
PUTpour les contacts (utiliserPATCH).
Webhooks émis : contact.created, contact.updated, contact.deleted.
Multi-tenant — particularité
La table contacts n'a pas de colonne agencyId directe : le lien tenant passe par contact_clients → clients.agencyId. Un contact est visible pour une clé API si au moins un de ses clients liés appartient à l'agence de la clé.
Conséquences :
- Un contact créé sans
clientIdest orphelin (visible uniquement via UI agence) - La suppression d'un client ne supprime pas ses contacts (seulement le lien
contact_clients) - Si vous lisez
/contactset ne voyez pas un contact, vérifiez qu'il a au moins un lien client dans votre agence
GET /contacts
Liste paginée des contacts ayant au moins un client de l'agence.
Query params
| Param | Type | Défaut | Description |
|---|---|---|---|
limit | int | 50 | Max résultats (clamp 1-100) |
offset | int | 0 | Offset |
Réponse 200
{
"data": [
{ "id": 1, "firstName": "Jean", "lastName": "Dupont", "email": "jean@acme.fr" }
],
"total": 87,
"limit": 50,
"offset": 0
}GET /contacts/:id
Lecture d'un contact. 404 si pas de lien à un client de l'agence.
POST /contacts
Création d'un contact. Si clientId est fourni dans le body, le contact est lié immédiatement à ce client (qui doit appartenir à votre agence, sinon 400).
Body
{
"firstName": "Jean",
"lastName": "Dupont",
"email": "jean@acme.fr",
"phone": "+33 6 12 34 56 78",
"position": "Directeur achats",
"clientId": 42
}
clientIdn'est pas stocké danscontacts: il sert uniquement à créer la lignecontact_clientsaprès création.
Réponses
201: contact créé (sansclientIddans la réponse — le lien est créé séparément)400 clientId invalide pour cette agence: siclientIdest fourni mais hors agence400 Données invalides: Zod a échoué
Webhook émis
contact.created avec { "contact": <objet créé> }.
PATCH /contacts/:id
Mise à jour partielle. Champs optionnels.
clientIdne peut pas être ajouté/changé via PATCH (la liaison passe par d'autres routes UI). Pour changer les liens client, contactez le support ou utilisez l'UI.
Webhook émis
contact.updated.
DELETE /contacts/:id
Suppression définitive du contact + ses liens contact_clients.
Webhook émis
contact.deleted avec { "id": 42 }.
Exemple
curl -X DELETE \
-H "x-api-key: spk_..." \
https://beta.stormeo.io/api/public/v1/contacts/42