Skip to content

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éthodePathScope
GET/contactscontacts:read
GET/contacts/:idcontacts:read
POST/contactscontacts:write
PATCH/contacts/:idcontacts:write
DELETE/contacts/:idcontacts:delete

Pas de PUT pour les contacts (utiliser PATCH).

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_clientsclients.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 clientId est orphelin (visible uniquement via UI agence)
  • La suppression d'un client ne supprime pas ses contacts (seulement le lien contact_clients)
  • Si vous lisez /contacts et 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

ParamTypeDéfautDescription
limitint50Max résultats (clamp 1-100)
offsetint0Offset

Réponse 200

json
{
  "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

json
{
  "firstName": "Jean",
  "lastName": "Dupont",
  "email": "jean@acme.fr",
  "phone": "+33 6 12 34 56 78",
  "position": "Directeur achats",
  "clientId": 42
}

clientId n'est pas stocké dans contacts : il sert uniquement à créer la ligne contact_clients après création.

Réponses

  • 201 : contact créé (sans clientId dans la réponse — le lien est créé séparément)
  • 400 clientId invalide pour cette agence : si clientId est fourni mais hors agence
  • 400 Données invalides : Zod a échoué

Webhook émis

contact.created avec { "contact": <objet créé> }.


PATCH /contacts/:id

Mise à jour partielle. Champs optionnels.

clientId ne 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

bash
curl -X DELETE \
  -H "x-api-key: spk_..." \
  https://beta.stormeo.io/api/public/v1/contacts/42

StormeoOS API