Référence de l’API partenaires
Clients
Lire, rechercher, créer et modifier les clients (propriétaires) d'une organisation, et vérifier un doublon avant une création. Un client appartient à l'organisation entière, pas à un site ; il garde son site d'origine (siteId), le site où sa fiche a été créée.
Règle de visibilité, commune à toute l'API : une organisation qui a ouvert tous ses sites vous montre tous ses clients. Une organisation qui ne vous a ouvert que certains sites vous montre seulement les clients nés sur ces sites (et leurs animaux), même si un client né ailleurs vient se faire soigner sur un site ouvert. Hors de ce périmètre, tout répond 404 CLIENT_NOT_FOUND, jamais 403.
Brouillon seulement : l'API ne fusionne, ne désactive ni ne supprime aucun client, et ne donne jamais d'accord de contact (email, SMS, courrier) ; ces gestes restent à la clinique.
Lister les clients
GET/api/partner/v1/clients#
Rend les clients de l'organisation que vous pouvez voir (tous si l'organisation vous a ouvert tous ses sites, sinon ceux nés sur les sites ouverts), clients désactivés compris (active: false). Tri par updatedAt puis id, croissant : c'est la liste de synchronisation, à parcourir par cursor et à reprendre par updated_since. Une fiche créée ou modifiée n'y apparaît qu'environ 60 secondes après l'écriture ; sa lecture par GET /clients/{id} est immédiate.
Les filtres q, phone et email sont des recherches : ils se combinent entre eux et rendent aussi une fiche tout juste créée. N'exige que clients:read.
Paramètres
| qrequête · string | Texte cherché dans le prénom, le nom ou la raison sociale (contient, casse et accents ignorés), ou dans le téléphone principal tel qu'il a été saisi. 100 caractères au plus. Le téléphone mobile n'est pas cherché ici : utilisez |
| phonerequête · string | Numéro complet, comparé au téléphone principal OU au mobile, quel que soit le format ( |
| emailrequête · string | Adresse email exacte, casse ignorée. 255 caractères au plus. |
| updated_sincerequête · date-time | Ne rend que les fiches dont |
| cursorrequête · string | Curseur opaque rendu par la page précédente ( |
| limitrequête · integer | Nombre de fiches par page, de 1 à 200. Au-delà de 200, ramené à 200. Défaut :50 |
Réponse
200Une page de clients.
Champs de la réponse (2)
| itemsClient[] | |
| iduuid | Identifiant du client. |
| publicIdstring | Identifiant public partageable ( |
| organizationIduuid | Organisation du client. |
| siteIduuid | Site d'origine : celui où la fiche a été créée. Le client reste celui de toute l'organisation ; ce site décide de sa visibilité quand l'organisation ne vous a ouvert que certains sites. |
| typeenum |
INDIVIDUALPROFESSIONALpeut être null |
| civilityenum | Civilité : MRMRSMSDRpeut être null |
| firstNamestring | Prénom. Toujours rempli pour un client créé par l'API ; peut manquer sur une fiche reprise d'un ancien logiciel. peut être null |
| lastNamestring | Nom. |
| companyNamestring | Raison sociale. peut être null |
| sirenstring | Numéro SIREN, en lecture seule (saisi par la clinique). peut être null |
| emailstring | Adresse email. peut être null |
| phonestring | Téléphone principal, tel qu'il a été saisi. Unique dans l'organisation. peut être null |
| mobilePhonestring | Téléphone mobile, tel qu'il a été saisi. peut être null |
| addressClientAddress | Adresse postale. L'objet est toujours présent ; ses champs sont nuls quand l'adresse n'est pas renseignée. |
| linestring | Adresse composée sur une ligne, telle qu'elle s'imprime sur les documents. Lecture seule : recomposée à chaque modification des autres champs. peut être null |
| streetstring | Voie (numéro et rue). peut être null |
| postalCodestring | Code postal. peut être null |
| citystring | Ville. peut être null |
| countrystring | Pays. peut être null |
| birthDatedate | Date de naissance du client. peut être null |
| consentsClientConsents | Accords de contact donnés par le client. |
| emailboolean | Le client accepte d'être contacté par email. |
| smsboolean | Le client accepte d'être contacté par SMS. |
| mailboolean | Le client accepte d'être contacté par courrier. |
| preferredChannelenum | Canal préféré pour les envois manuels de la clinique. EMAILSMSPHONEpeut être null |
| activeboolean |
|
| createdAtdate-time | Date de création de la fiche. Peut être nulle sur une fiche reprise d'un ancien logiciel. peut être null |
| updatedAtdate-time | Clé de synchronisation, à la microseconde : date de dernière modification, à défaut date de création. C'est la valeur que lit |
| nextCursorstring | Curseur opaque de la page suivante, à repasser tel quel dans |
Erreurs propres à cette opération
| 400 INVALID_FIELD |
|
Et les erreurs communes à toutes les opérations : erreurs et limites.
Créer un client
POST/api/partner/v1/clients#
Crée un client dans l'organisation, avec pour site d'origine le site désigné par site_id (ou Treats-Site-Id), implicite si l'organisation ne vous a ouvert qu'un site. Le client naît sans aucun accord de contact : c'est la clinique ou le propriétaire qui les donne. Exige clients:write.
Le téléphone principal est unique dans toute l'organisation, sites non ouverts compris : vérifiez d'abord par POST /clients/duplicate-check ou GET /clients?phone=. Tous les champs refusés sont rendus en une seule réponse 400 INVALID_FIELD, et tout champ hors contrat est refusé, y compris dans address et consents. Les textes ne doivent contenir aucune balise HTML.
Paramètres
| site_idrequête · uuid | Site d'origine du client. Obligatoire si l'organisation vous a ouvert plusieurs sites (sinon le seul site ouvert). Peut aussi passer en en-tête |
| Treats-Site-Iden-tête · uuid | Équivalent de |
| Idempotency-Keyen-tête · stringrequis | Clé unique de l'envoi (un UUID). Le même envoi répété avec la même clé n'est appliqué qu'une fois pendant 24 h. |
Corps de la requête application/json
| firstNamestringrequis | Prénom. |
| lastNamestringrequis | Nom. |
| phonestring | Téléphone principal : chiffres, espaces, |
| emailstring | Adresse email (format vérifié). |
| mobilePhonestring | Téléphone mobile, même format que |
| typeenum | Type de client (casse ignorée). INDIVIDUALPROFESSIONALdéfaut "INDIVIDUAL" |
| civilityenum | Civilité (casse ignorée). MRMRSMSDR |
| companyNamestring | Raison sociale. |
| addressobject | Adresse postale. Aucun champ n'est obligatoire ; la ligne composée ( |
| streetstring | Voie (numéro et rue). |
| postalCodestring | Code postal. |
| citystring | Ville. |
| countrystring | Pays. |
| birthDatedate | Date de naissance du client ( |
| consentsobject | Accords de contact. Seul |
| emailboolean | Seul |
| smsboolean | Seul |
| mailboolean | Seul |
| preferredChannelenum | Canal préféré pour les envois manuels (casse ignorée). EMAILSMSPHONE |
Réponse
201Le client créé.
Champs de la réponse (20)
| iduuid | Identifiant du client. |
| publicIdstring | Identifiant public partageable ( |
| organizationIduuid | Organisation du client. |
| siteIduuid | Site d'origine : celui où la fiche a été créée. Le client reste celui de toute l'organisation ; ce site décide de sa visibilité quand l'organisation ne vous a ouvert que certains sites. |
| typeenum |
INDIVIDUALPROFESSIONALpeut être null |
| civilityenum | Civilité : MRMRSMSDRpeut être null |
| firstNamestring | Prénom. Toujours rempli pour un client créé par l'API ; peut manquer sur une fiche reprise d'un ancien logiciel. peut être null |
| lastNamestring | Nom. |
| companyNamestring | Raison sociale. peut être null |
| sirenstring | Numéro SIREN, en lecture seule (saisi par la clinique). peut être null |
| emailstring | Adresse email. peut être null |
| phonestring | Téléphone principal, tel qu'il a été saisi. Unique dans l'organisation. peut être null |
| mobilePhonestring | Téléphone mobile, tel qu'il a été saisi. peut être null |
| addressClientAddress | Adresse postale. L'objet est toujours présent ; ses champs sont nuls quand l'adresse n'est pas renseignée. |
| linestring | Adresse composée sur une ligne, telle qu'elle s'imprime sur les documents. Lecture seule : recomposée à chaque modification des autres champs. peut être null |
| streetstring | Voie (numéro et rue). peut être null |
| postalCodestring | Code postal. peut être null |
| citystring | Ville. peut être null |
| countrystring | Pays. peut être null |
| birthDatedate | Date de naissance du client. peut être null |
| consentsClientConsents | Accords de contact donnés par le client. |
| emailboolean | Le client accepte d'être contacté par email. |
| smsboolean | Le client accepte d'être contacté par SMS. |
| mailboolean | Le client accepte d'être contacté par courrier. |
| preferredChannelenum | Canal préféré pour les envois manuels de la clinique. EMAILSMSPHONEpeut être null |
| activeboolean |
|
| createdAtdate-time | Date de création de la fiche. Peut être nulle sur une fiche reprise d'un ancien logiciel. peut être null |
| updatedAtdate-time | Clé de synchronisation, à la microseconde : date de dernière modification, à défaut date de création. C'est la valeur que lit |
Erreurs propres à cette opération
| 400 INVALID_FIELD | Champ obligatoire absent ( |
| 400 SITE_ID_REQUIRED | L'organisation vous a ouvert plusieurs sites et aucun |
| 400 INVALID_SITE_ID |
|
| 400 INVALID_REQUEST | Refus résiduel de Treats sur une donnée que les contrôles ci-dessus n'ont pas arrêtée (filet de sécurité). |
| 404 SITE_NOT_FOUND | Le site demandé n'est pas un site que l'organisation vous a ouvert. |
| 409 CLIENT_DUPLICATE | Un client de l'organisation porte déjà ce téléphone principal, y compris sur un site qui ne vous est pas ouvert. La réponse ne donne ni l'identifiant ni le site de cette fiche. |
Et les erreurs communes à toutes les opérations : erreurs et limites.
Notifications envoyées :client.created
Lire un client
GET/api/partner/v1/clients/{id}#
Rend la fiche d'un client visible (organisation entière si tous les sites vous sont ouverts, sinon client né sur un site ouvert). Lecture immédiate, sans le délai de la liste. Un client d'une autre organisation, d'un site non ouvert ou inconnu répond 404 CLIENT_NOT_FOUND. Exige clients:read.
Paramètres
| idchemin · uuidrequis | Identifiant du client ( |
Réponse
200La fiche du client.
Champs de la réponse (20)
| iduuid | Identifiant du client. |
| publicIdstring | Identifiant public partageable ( |
| organizationIduuid | Organisation du client. |
| siteIduuid | Site d'origine : celui où la fiche a été créée. Le client reste celui de toute l'organisation ; ce site décide de sa visibilité quand l'organisation ne vous a ouvert que certains sites. |
| typeenum |
INDIVIDUALPROFESSIONALpeut être null |
| civilityenum | Civilité : MRMRSMSDRpeut être null |
| firstNamestring | Prénom. Toujours rempli pour un client créé par l'API ; peut manquer sur une fiche reprise d'un ancien logiciel. peut être null |
| lastNamestring | Nom. |
| companyNamestring | Raison sociale. peut être null |
| sirenstring | Numéro SIREN, en lecture seule (saisi par la clinique). peut être null |
| emailstring | Adresse email. peut être null |
| phonestring | Téléphone principal, tel qu'il a été saisi. Unique dans l'organisation. peut être null |
| mobilePhonestring | Téléphone mobile, tel qu'il a été saisi. peut être null |
| addressClientAddress | Adresse postale. L'objet est toujours présent ; ses champs sont nuls quand l'adresse n'est pas renseignée. |
| linestring | Adresse composée sur une ligne, telle qu'elle s'imprime sur les documents. Lecture seule : recomposée à chaque modification des autres champs. peut être null |
| streetstring | Voie (numéro et rue). peut être null |
| postalCodestring | Code postal. peut être null |
| citystring | Ville. peut être null |
| countrystring | Pays. peut être null |
| birthDatedate | Date de naissance du client. peut être null |
| consentsClientConsents | Accords de contact donnés par le client. |
| emailboolean | Le client accepte d'être contacté par email. |
| smsboolean | Le client accepte d'être contacté par SMS. |
| mailboolean | Le client accepte d'être contacté par courrier. |
| preferredChannelenum | Canal préféré pour les envois manuels de la clinique. EMAILSMSPHONEpeut être null |
| activeboolean |
|
| createdAtdate-time | Date de création de la fiche. Peut être nulle sur une fiche reprise d'un ancien logiciel. peut être null |
| updatedAtdate-time | Clé de synchronisation, à la microseconde : date de dernière modification, à défaut date de création. C'est la valeur que lit |
Erreurs propres à cette opération
| 404 CLIENT_NOT_FOUND | Client inconnu, d'une autre organisation, ou né sur un site qui ne vous est pas ouvert. |
| 404 NOT_FOUND |
|
Et les erreurs communes à toutes les opérations : erreurs et limites.
Modifier un client
PATCH/api/partner/v1/clients/{id}#
Modifie les champs envoyés : champ absent = inchangé, champ à null = vidé. Se vident : email, mobilePhone, companyName, chaque champ d'address, et address: null (toute l'adresse). Ne se vident pas (400 INVALID_FIELD, « ne peut pas être vidé ») : firstName, lastName, type, civility, phone (le remplacer), birthDate, preferredChannel, consents.*. Un corps vide {} ne change rien et rend la fiche.
Le client doit garder un téléphone principal ou un email : vider l'email d'un client sans téléphone est refusé. Un accord de contact peut être retiré (false, à la demande du client), jamais donné (true refusé). Un nouveau téléphone déjà porté par un autre client de l'organisation répond 409 CLIENT_DUPLICATE. Exige clients:write.
Paramètres
| idchemin · uuidrequis | Identifiant du client. |
| site_idrequête · uuid | Site au nom duquel l'écriture est faite (journal). Facultatif : à défaut, le site d'origine du client s'il vous est ouvert, sinon le seul site ouvert. La fiche reste celle de l'organisation. |
| Treats-Site-Iden-tête · uuid | Équivalent de |
Corps de la requête application/json
| firstNamestring | Prénom. Non vidable, ni à |
| lastNamestring | Nom. Non vidable, ni à |
| phonestring | Téléphone principal (même format qu'à la création). Non vidable : le remplacer. Déjà porté par un autre client : |
| emailstring | Adresse email. |
| mobilePhonestring | Téléphone mobile. |
| typeenum | Type de client. Non vidable. INDIVIDUALPROFESSIONAL |
| civilityenum | Civilité. Non vidable. MRMRSMSDR |
| companyNamestring | Raison sociale. |
| addressobject | Adresse : seuls les champs envoyés changent, un champ à |
| streetstring | Voie. |
| postalCodestring | Code postal. |
| citystring | Ville. |
| countrystring | Pays. |
| birthDatedate | Date de naissance, passée ou du jour, pas avant 1900. Non vidable. |
| consentsobject | Retrait d'accords de contact : seul |
| emailboolean |
|
| smsboolean |
|
| mailboolean |
|
| preferredChannelenum | Canal préféré. Non vidable. EMAILSMSPHONE |
Réponse
200La fiche modifiée.
Champs de la réponse (20)
| iduuid | Identifiant du client. |
| publicIdstring | Identifiant public partageable ( |
| organizationIduuid | Organisation du client. |
| siteIduuid | Site d'origine : celui où la fiche a été créée. Le client reste celui de toute l'organisation ; ce site décide de sa visibilité quand l'organisation ne vous a ouvert que certains sites. |
| typeenum |
INDIVIDUALPROFESSIONALpeut être null |
| civilityenum | Civilité : MRMRSMSDRpeut être null |
| firstNamestring | Prénom. Toujours rempli pour un client créé par l'API ; peut manquer sur une fiche reprise d'un ancien logiciel. peut être null |
| lastNamestring | Nom. |
| companyNamestring | Raison sociale. peut être null |
| sirenstring | Numéro SIREN, en lecture seule (saisi par la clinique). peut être null |
| emailstring | Adresse email. peut être null |
| phonestring | Téléphone principal, tel qu'il a été saisi. Unique dans l'organisation. peut être null |
| mobilePhonestring | Téléphone mobile, tel qu'il a été saisi. peut être null |
| addressClientAddress | Adresse postale. L'objet est toujours présent ; ses champs sont nuls quand l'adresse n'est pas renseignée. |
| linestring | Adresse composée sur une ligne, telle qu'elle s'imprime sur les documents. Lecture seule : recomposée à chaque modification des autres champs. peut être null |
| streetstring | Voie (numéro et rue). peut être null |
| postalCodestring | Code postal. peut être null |
| citystring | Ville. peut être null |
| countrystring | Pays. peut être null |
| birthDatedate | Date de naissance du client. peut être null |
| consentsClientConsents | Accords de contact donnés par le client. |
| emailboolean | Le client accepte d'être contacté par email. |
| smsboolean | Le client accepte d'être contacté par SMS. |
| mailboolean | Le client accepte d'être contacté par courrier. |
| preferredChannelenum | Canal préféré pour les envois manuels de la clinique. EMAILSMSPHONEpeut être null |
| activeboolean |
|
| createdAtdate-time | Date de création de la fiche. Peut être nulle sur une fiche reprise d'un ancien logiciel. peut être null |
| updatedAtdate-time | Clé de synchronisation, à la microseconde : date de dernière modification, à défaut date de création. C'est la valeur que lit |
Erreurs propres à cette opération
| 400 INVALID_FIELD | Champ non vidable envoyé à |
| 400 SITE_ID_REQUIRED | Aucun |
| 400 INVALID_SITE_ID |
|
| 400 INVALID_REQUEST | Refus résiduel de Treats sur une donnée que les contrôles ci-dessus n'ont pas arrêtée (filet de sécurité). |
| 404 CLIENT_NOT_FOUND | Client inconnu, d'une autre organisation, ou né sur un site qui ne vous est pas ouvert. |
| 404 NOT_FOUND |
|
| 404 SITE_NOT_FOUND | Le site demandé n'est pas un site que l'organisation vous a ouvert. |
| 409 CLIENT_DUPLICATE | Le nouveau téléphone principal est déjà porté par un autre client de l'organisation, y compris sur un site qui ne vous est pas ouvert. Ni l'identifiant ni le site de cette fiche ne sont rendus. |
Et les erreurs communes à toutes les opérations : erreurs et limites.
Vérifier un doublon avant création
POST/api/partner/v1/clients/duplicate-check#
Dit si POST /clients accepterait ce téléphone, et rend les fiches proches que vous pouvez voir (même téléphone principal, ou même nom et prénom). La recherche porte sur toute l'organisation ; une fiche d'un site qui ne vous est pas ouvert fait passer phoneAvailable à false mais n'apparaît jamais dans candidates. Ne crée et ne modifie rien. Exige clients:read. Route de lecture malgré la méthode POST : pas d'en-tête Idempotency-Key.
Corps de la requête application/json
| phonestring | Téléphone à vérifier, même format que pour |
| firstNamestring | Prénom. Pris en compte seulement avec |
| lastNamestring | Nom. Pris en compte seulement avec |
Réponse
200Disponibilité du téléphone et fiches proches visibles.
Champs de la réponse (2)
| phoneAvailableboolean |
|
| candidatesClientDuplicateCandidate[] | Fiches proches que vous pouvez voir, d'abord celles au même téléphone puis celles au même nom. Une fiche d'un site qui ne vous est pas ouvert n'y figure jamais. Liste vide si aucune. |
| clientIduuid | Identifiant du client existant (à lire par |
| publicIdstring | Identifiant public ( |
| siteIduuid | Site d'origine du client existant. |
| firstNamestring | Prénom du client existant. peut être null |
| lastNamestring | Nom du client existant. |
| matchenum |
PHONENAME |
Erreurs propres à cette opération
| 400 INVALID_FIELD | Ni |
| 404 CLIENT_NOT_FOUND | L'organisation ne vous ouvre plus aucun site. |
Et les erreurs communes à toutes les opérations : erreurs et limites.