Guide d'intégration · API Datacopro
Comment lister le portefeuille de copropriétés confiées à un cabinet de syndic, le filtrer — par statut, par tag, par utilisateur — et récupérer la fiche complète d'une copropriété.
Ce document décrit uniquement le contrat de l'API Datacopro : quels appels effectuer, dans quel ordre, avec quels paramètres, et pourquoi. Aucune connaissance d'un logiciel de gestion de copropriétés en particulier n'est nécessaire pour le suivre.
Deux objets sont en jeu. Chaque copropriété appartient à un cabinet.
Le regroupement de toutes les copropriétés confiées à un même cabinet de syndic.
adresse (la voie), à ne pas confondre avec l'objet englobantLe périmètre autorisé n'est pas le même selon la route :
Dans les deux cas, une autorisation manquante renvoie un 403.
Toutes les routes de ce guide sont préfixées /v2 et servies depuis https://syndic.datacopro.org en production, ou https://preprod-syndic.datacopro.org sur la plateforme de test.
Sans le paramètre statut, la route restreint systématiquement aux copropriétés actives — même quand un autre filtre (tag, utilisateur…) est fourni par ailleurs. Pour voir les copropriétés clôturées, il faut ajouter explicitement filters[statut], qui remplace alors ce défaut :
Un filtre sur un autre champ (ex. les copropriétés taguées « Prospect ») se combine avec ce défaut plutôt que de le remplacer :
Le cabinet est le seul point d'entrée qui renvoie « toutes les copropriétés de ce cabinet » en un seul appel.
Le filtrage est appliqué après récupération de la totalité des copropriétés du cabinet — pas de filtre poussé en base, et pas de pagination disponible sur cette route. Sur un grand portefeuille, le coût de l'appel reste proportionnel à la taille totale du cabinet, pas à la taille du résultat filtré.
ou, si seul l'email de l'utilisateur est connu côté client (comparaison exacte, via l'opérateur __eq — voir Paramètres transverses) :
collaborateurs est un champ standard de la copropriété. Le mécanisme de filtre de l'API sait descendre dans un champ imbriqué (champ.sousChamp) et, quand ce champ est une liste, retient la copropriété dès qu'un élément de la liste correspond — ce n'est pas un paramètre dédié à la notion de « portefeuille utilisateur », c'est une conséquence du filtrage générique appliqué à un champ qui existe déjà. Il fonctionne même si collaborateurs ne fait pas partie des champs renvoyés par cette route (voir limite ci-dessous) : un champ peut servir de critère de filtre sans figurer dans la réponse.
collaborateurs ne recense que les utilisateurs ayant un rôle assistant, comptable ou gestionnaire sur la copropriété — un utilisateur avec un autre type de rôle n'y apparaît pas.filters[collaborateurs.role]=gestionnaire ne se combine pas de façon fiable avec filters[collaborateurs.id] : chaque filtre est vérifié indépendamment sur l'ensemble des collaborateurs de la copropriété, pas sur la même personne — une copropriété peut donc être retenue à tort si l'utilisateur visé y est comptable pendant qu'un autre y est gestionnaire. Pour confirmer le rôle exact d'une personne précise, il faut consulter la fiche complète de la copropriété (parcours 3), qui renvoie le rôle de chaque collaborateur.collaborateurs dans sa réponse : le filtre agit, mais pour voir qui sont les collaborateurs il faut consulter la fiche complète de chaque copropriété (parcours 3).Renvoie l'ensemble des champs listés en Modèle & périmètre (identifiant, référence de mandat, libellé, adresse, statut, étape d'intégration, tags, code/moyens d'accès, notes internes, collaborateurs), sans paramètre supplémentaire à fournir.
| Méthode | Route | Rôle |
|---|---|---|
| GET | /v2/domaines/{idDomaine}/copros | Portefeuille de copropriétés d'un cabinet, filtrable par statut, tag ou utilisateur. |
| GET | /v2/copro/{idCopro} | Fiche complète d'une copropriété. |
filters[champ]=valeur — champ peut être un chemin imbriqué séparé par un point (ex. collaborateurs.id). Comportement par défaut selon le type :
>, >=, <, <=, != directement dans la valeurUn opérateur explicite peut être ajouté en suffixant le nom du champ par __ :
__eqégal__diffdifférent__containscontient__ncontainsne contient pas__gt / __gtesupérieur (ou égal)__lt / __lteinférieur (ou égal)__empty / __nemptyvide / non videPlusieurs filtres passés ensemble (filters[statut]=active&filters[tags]=Prospect) sont combinés en ET — chacun est cependant vérifié indépendamment sur l'ensemble des éléments d'un champ liste (voir la limite du Parcours 2 pour le cas où cela compte).
displays[]=champ restreint les champs renvoyés à ceux listés (ou les exclut si préfixés par !, ex. displays[]=!note pour tout renvoyer sauf les notes internes). Sans ce paramètre, tous les champs par défaut de la fiche sont renvoyés — il n'est donc pas nécessaire pour obtenir les champs cités en Modèle & périmètre, déjà présents par défaut.
displays ne peut pas faire apparaître un champ qui n'est pas déjà servi par la route (ex. collaborateurs sur le portefeuille de cabinet, voir Parcours 2).
collaborateurs de chaque copropriété, qui ne couvre que trois rôles (assistant, comptable, gestionnaire), et qui n'est renvoyé que par la fiche complète — pas par le portefeuille de cabinet, même quand on filtre dessus.filters[collaborateurs.*] séparées) ne garantit pas qu'ils portent sur la même personne : chaque filtre est vérifié indépendamment sur la liste des collaborateurs.statut et statutIntegration répondent à deux questions différentes : une copropriété peut être « active » (statut) tout en étant encore à une étape antérieure à « Copro active / Intégration approuvée » (statutIntegration).filters[collaborateurs.id]=<id> sur la route du portefeuille de cabinet — cela couvre les trois rôles assistant/comptable/gestionnaire confondus. Pour confirmer que cette personne y intervient précisément comme gestionnaire (et pas seulement comptable ou assistant), il faut vérifier le rôle sur la fiche complète de chaque copropriété obtenue (Parcours 3) : un filtre combiné sur l'identité et sur le rôle n'apporte pas cette garantie à lui seul.collaborateurs fait exception : présent uniquement sur la fiche complète.statut (voir Parcours 1). Les clôturées doivent être demandées explicitement via filters[statut]=cloturée, qui remplace alors ce défaut.