Guide cas concret · API Datacopro v2 · Assemblées générales
Tenir une AG
De l'ouverture de la séance à l'envoi du procès-verbal : feuille de présence et pouvoirs, votes par correspondance, enregistrement des votes, calcul des majorités et second vote, corrections en séance, clôture.
Périmètre : une assemblée, résolution par résolutionLe jour de la séancePrérequis : guide « Préparer l'ordre du jour »
À propos de ce guide
Ce guide décrit uniquement le contrat de l'API Datacopro. Vous n'avez besoin de connaître aucun logiciel de tenue d'assemblée en particulier. Les parcours reprennent l'enchaînement d'appels d'un outil de tenue d'AG en ligne utilisé en production, cité ponctuellement à titre d'illustration.
Toutes les routes sont préfixées par https://syndic.datacopro.org/v2 et scopées par /copro/{idCopro}/assemblee/{idAg}. Les dates s'échangent au format AAAA-MM-JJ HH:MM:SS. Pendant la séance, trois objets s'ajoutent à l'assemblée et à ses résolutions.
Présence presences[]
coproprietaire : le copropriétaire présent ou représenté
type : physique, visio, audio, correspondance, autre
idPremiereResolution, idDerniereResolution : la plage de résolutions pour laquelle il compte
representant, representantAdresse : le mandataire s'il est représenté (texte libre)
dateReceptionVPC : réception du vote par correspondance
resolutionRevote : le second vote créé automatiquement (art. 25-1 / 26-1)
libellePv, contenuPv, commentaire : textes du procès-verbal
Séance sur l'assemblée
dateReelle : ouverture effective de la séance
dateFermeture : clôture de la séance
dateEnvoiPv : envoi du procès-verbal
estAvecVotes : votes nominatifs, ou résultats seuls
L'ordre de parcours des résolutions
Une présence couvre une plage de résolutions, de idPremiereResolution à idDerniereResolution. Cette plage se lit dans l'ordre de parcours de la séance : chaque résolution de premier niveau par numero croissant, suivie de son éventuel second vote, puis de ses sous-résolutions (par numero, chacune suivie de son éventuel second vote). Reconstituez cet ordre côté client : c'est lui qui détermine qui peut voter sur quoi.
Exemple : feuille de présence lue en plages de résolutions
Copropriétaire
1
2
3
3 bis (second vote)
4
4.1
4.2
5
M. Durand (présent)
●
●
●
●
●
●
●
●
Mme Leroy (arrivée en cours)
·
·
●
●
●
●
●
●
SCI Horizon (représentée, partie)
●
●
●
●
·
·
·
·
M. Petit (correspondance)
●
●
●
●
●
●
●
●
Les majorités telles que l'API les calcule
Référence
Seuil (strictement supérieur)
Base
Second vote si refusée
simple · art. 24
1/2 des tantièmes
Votes exprimés (pour + contre), hors abstentions et défaillants
Non
absolue · art. 25
1/2 des tantièmes
Tous les tantièmes de la clé
Si revotable et « pour » > 1/3 des tantièmes : second vote en simple
double · art. 26
2/3 des tantièmes et 1/2 des copropriétaires
Tous les tantièmes et tous les copropriétaires de la clé
Si revotable, « pour » > 1/3 des tantièmes et majorité des votants en nombre : second vote en absolue
unanimité
Totalité
Tous les tantièmes de la clé
Non
sans vote
Aucun
Toujours acceptée
Non
Limite
Les seuils sont appliqués en « strictement supérieur ». Une résolution à l'art. 26 qui recueille exactement les 2/3 des tantièmes est donc calculée comme refusée, alors que la loi exige « au moins » les 2/3. Sur une assemblée avec votes, le résultat ne peut pas être forcé. Vérifiez ce cas limite de votre côté et, s'il se présente, consignez la correction dans le texte ou le commentaire du procès-verbal, et signalez-le au support Datacopro.
Le nombre de copropriétaires et le total des tantièmes sont établis selon les lots détenus à la date d'ouverture (dateReelle), ou à défaut à la date prévisionnelle. Les copropriétaires sans lot n'apparaissent pas dans la feuille de présence renvoyée.
02
Contrôle d'accès
Chaque appel est authentifié par un jeton OAuth. Le client doit être autorisé sur la copropriété, sinon l'API répond 403 ("User not allowed"). L'API vérifie que l'assemblée appartient à la copropriété et la résolution à l'assemblée. Les copropriétaires n'ont pas d'accès direct : si vous proposez le vote en ligne à des copropriétaires, c'est votre logiciel qui recueille leurs votes et les transmet à l'API avec son propre jeton.
03
Parcours fonctionnels
A
Charger la séance et ouvrir l'assemblée
Cas d'usage : le président de séance ouvre l'assemblée. Il faut afficher l'ordre du jour, les tantièmes de chacun et l'heure d'ouverture.
GET/copro/{idCopro}/assemblee/{idAg}.json
Sans displays, la réponse contient l'ordre du jour, les présences et les votes déjà enregistrés (y compris les votes par correspondance saisis en amont). C'est un appel lourd : réservez-le au chargement initial, et relisez ensuite une seule résolution avec GET …/resolution/{idRes}.json quand seul son état vous intéresse.
GET/copro/{idCopro}/cle/{idCle}.json
Une fois par clé distincte utilisée dans l'ordre du jour : tantiemesParLot donne les tantièmes de chaque lot. Écartez les lots cédés avant la date de la séance (lot.dateCession antérieure à cette date), pour rester cohérent avec le calcul de l'API. Ces données servent à afficher le poids de chaque votant. Le calcul officiel reste fait par l'API.
Pourquoi
Les tantièmes d'un vote dépendent de la clé de chaque résolution. Deux résolutions de l'ordre du jour ne pèsent pas forcément pareil pour un même copropriétaire. Mettez ces clés en cache pour la durée de la séance.
PUT/copro/{idCopro}/assemblee/{idAg}.json
{ "dateReelle": "2026-06-18 18:42:00" }
À n'envoyer que si dateReelle est encore vide. Cette date marque le début de la séance pour tous les logiciels qui lisent l'assemblée. Elle sert aussi de date de référence pour déterminer qui est copropriétaire au moment du calcul.
B
Émarger : présents, représentés, votes par correspondance
Cas d'usage : un copropriétaire arrive pendant la résolution 3 ; un autre est représenté par un mandataire ; un troisième a envoyé un formulaire de vote par correspondance.
premiereResolution : identifiant de la résolution en cours au moment de l'arrivée (la première de l'ordre de parcours pour quelqu'un présent dès l'ouverture).
derniereResolution : identifiant de la dernière résolution de l'ordre de parcours. Ces deux champs sont obligatoires pour une assemblée avec votes.
Mandat : renseignez representant (nom du mandataire) et representantAdresse. La présence reste celle du copropriétaire représenté.
Vote par correspondance : "type": "correspondance" et dateReceptionVPC (date de réception du formulaire), puis enregistrez ses votes comme les autres (parcours C).
Réponse 201 avec la présence.
Limite : doublons
L'API n'empêche pas d'enregistrer deux présences pour le même copropriétaire, et ne contrôle ni le nombre de pouvoirs par mandataire ni l'appartenance du copropriétaire à la copropriété. Avant chaque ajout, relisez presences[] et vérifiez qu'aucune présence de ce copropriétaire ne couvre déjà la résolution en cours. Plafonnez vous-même les pouvoirs selon les règles légales.
Limite : dates
N'envoyez pas dateArrivee et dateDepart ensemble à la création : l'API rejette une heure de départ postérieure à l'heure d'arrivée (400 « Dates de début et de fin mal définies »). La plage de résolutions suffit à établir la participation.
Départ en cours de séance, ou changement de mode de participation. La présence n'est pas désignée par un identifiant : elle est retrouvée par coproprietaire + resolution, une résolution quelconque comprise dans sa plage. Pour un départ, derniereResolution vaut la résolution en cours s'il a déjà voté dessus, sinon celle qui la précède dans l'ordre de parcours. Attention : ce peut être un second vote ou une sous-résolution (dans l'exemple ci-dessus, la résolution qui précède la 4 est « 3 bis », pas la 3).
Illustration
Un outil de tenue d'AG en ligne applique cette règle quand un participant quitte la visioconférence : s'il a voté sur la résolution active, il reste compté pour elle, sinon sa plage s'arrête à la résolution précédente.
Limite
Sur une assemblée sans votes (estAvecVotes à false), les présences n'ont pas de plage : elles ne peuvent être ni modifiées ni supprimées par cette route (400 « Presence introuvable »). Émargez avec soin dès la création.
C
Enregistrer les votes d'une résolution
Cas d'usage : la résolution 3 est soumise au vote ; les votes arrivent (en salle, en ligne, par correspondance).
Chaque votant doit avoir une présence dont la plage couvre cette résolution, sinon l'appel est refusé.
Ne faites voter que des copropriétaires qui détiennent des tantièmes dans la clé de la résolution. L'API accepte le vote d'un copropriétaire sans tantièmes dans cette clé : il pèse zéro tantième mais compte dans le nombre de votants, ce qui fausse la double majorité (art. 26) et peut faire échouer le calcul.
L'appel fonctionne en remplacement par votant : renvoyer un copropriétaire qui a déjà voté remplace son vote. Vous pouvez donc renvoyer à chaque synchronisation la liste complète des votes de la résolution.
Les tantièmes et une éventuelle réduction (copropriétaire détenant plus de la moitié des tantièmes de la clé) sont calculés par l'API selon le paramétrage de la copropriété. Le résultat apparaît dans tantiemes et estReduit.
Sur une assemblée sans votes, n'enregistrez pas de votes : passez directement au parcours D avec un résultat forcé.
Réponse 201 avec la liste des votes enregistrés.
Limite : valeurs et erreurs partielles
N'envoyez que les quatre valeurs exactes pour, contre, s'abstient, défaillant (avec apostrophe et accent). Une valeur inconnue n'est pas rejetée : elle est enregistrée comme contre, alors que la réponse 201 renvoie la valeur telle que vous l'avez envoyée. Seule une relecture de la résolution montre la valeur réellement stockée. Si un votant du lot est en erreur (non présent), la réponse est un 400, mais les votes placés avant lui dans la liste ont déjà été enregistrés. Après un 400, relisez la résolution avant de réessayer.
Limite : saisie a posteriori
Les tantièmes d'un vote sont établis selon les lots détenus le jour de l'appel, alors que le résultat est calculé à la date de la séance. Si vous saisissez les votes après coup et qu'un lot a changé de mains entre-temps, les deux peuvent diverger.
Pourquoi ce n'est pas fini
Enregistrer les votes ne calcule pas le résultat. estVotee reste à false tant que vous n'avez pas appelé la route du parcours D.
D
Clore le vote et calculer le résultat
Cas d'usage : le président annonce la fin du vote de la résolution 3 ; le résultat et le texte du procès-verbal doivent être enregistrés.
{
"calcul": {},
"libellePV": "Désignation du syndic",
"contenuPv": "L'assemblée générale désigne en qualité de syndic…",
"commentaires": "M. Durand demande que figure au PV…"
}
calcul présent : l'API calcule le résultat à partir des votes enregistrés et met à jour estVotee, estAcceptee, estReduit. Sans calcul, seuls les textes sont mis à jour.
calcul.revote vaut true par défaut : si la résolution est revotable et que les conditions sont réunies, le second vote est créé automatiquement.
Assemblée sans votes, résolution revotable refusée : un second vote est créé systématiquement, sans condition du tiers. Si les conditions légales du second vote ne sont pas réunies, envoyez "revote": false dans calcul. Si la majorité a été changée pour une majorité non revotable sans remettre revotable à 0, l'appel échoue en 500.
calcul.sansObjet: true : la résolution est déclarée sans objet (par exemple la variante 4.2 lorsque la variante 4.1 a été adoptée).
Assemblée sans votes : calcul.acceptee (true/false) est obligatoire et fixe le résultat. Il est interdit sur une assemblée avec votes.
Réponse 202 avec la résolution, dont le résultat.
Limite : libellé écrasé
Envoyez toujours libellePV. S'il est absent, l'API le remplace par libelleConvocation, ce qui efface un libellé de PV déjà saisi.
Illustration
Un outil de tenue d'AG en ligne enchaîne, pour chaque résolution : synchronisation des présences, envoi de tous les votes, appel à resoudre avec calcul, puis un PUT de la résolution par langue pour écrire le contenuPv et le libellePV définitifs.
Le second vote (passerelle art. 25-1 / 26-1)
Si la résolution 3 (art. 25, revotable) est refusée mais recueille plus du tiers des tantièmes, la réponse de resoudre contient une resolutionRevote. C'est une nouvelle résolution, à la majorité immédiatement inférieure (simple après absolue, absolue après double), placée juste après l'originale dans l'ordre de parcours. Les présences qui s'arrêtaient à la résolution d'origine sont prolongées jusqu'à elle.
Récupérez l'id de resolutionRevote.
Enregistrez les votes sur cet identifiant (parcours C).
Appelez resoudre sur cet identifiant.
Limite
Ne recalculez jamais la résolution d'origine tant que son second vote existe. Selon le nouveau résultat, l'API répond soit une erreur 500 générique, soit un 202 qui marque l'originale adoptée en laissant subsister le second vote, ses votes et son résultat : le procès-verbal devient incohérent sans aucune erreur. Pour recompter la résolution d'origine, réinitialisez-la d'abord (parcours E), ce qui supprime le second vote.
Limite : prolongation automatique des présences
Quand une résolution est ajoutée en fin d'ordre de parcours ou qu'un second vote est créé, l'API prolonge jusqu'à elle les présences qui s'arrêtaient à la résolution précédente, y compris celles de copropriétaires déjà partis : quelqu'un qui a voté la 3 puis quitté la séance apparaît alors présent pour le second vote. Après chaque création de second vote ou ajout en fin de séance, relisez presences[] et réappliquez les départs enregistrés (parcours B).
E
Corriger en séance
Cas d'usage : un vote a été clos trop tôt, la clé de répartition annoncée était erronée, ou l'assemblée amende le texte.
Remet la résolution à l'état « non votée » et supprime son second vote éventuel (avec ses votes). Les textes et commentaires sont conservés. Avec "votes": 1, les votes de la résolution sont aussi supprimés. Sans ce paramètre, ils sont conservés et vous pouvez rappeler resoudre directement.
Changer la clé d'une résolution déjà votée
PUT …/resolution/{idRes}.json avec {"cle": idNouvelleCle}, puis vérifiez la clé renvoyée (une clé invalide est ignorée sans erreur).
PUT …/resolution/{idRes}/reinitialiser.json avec {"votes": 1}.
Renvoyez tous les votes (parcours C) : les tantièmes sont recalculés avec la nouvelle clé au moment de l'enregistrement.
Rappelez resoudre (parcours D).
Pourquoi
Les tantièmes sont figés sur chaque vote au moment où il est enregistré. Changer la clé sans renvoyer les votes laisserait des votes pondérés selon l'ancienne clé. Procédez de la même façon pour un changement de majorité avant de recalculer.
Amender, ou ajouter une résolution en séance
Un amendement se note avec PUT …/resolution/{idRes}.json et {"amendee": true, "contenuPv": "…texte amendé…"}. Une sous-résolution peut aussi être ajoutée en séance (POST …/resolution.json avec resolutionParente, voir le guide de préparation). Si elle devient la dernière de l'ordre de parcours, les présences qui couraient jusqu'à la fin sont prolongées automatiquement, y compris celles des copropriétaires partis : réappliquez les départs (voir l'encadré du parcours D).
F
Clôturer la séance, annuler ou recommencer
Cas d'usage : toutes les résolutions ont été traitées, le président lève la séance.
PUT/copro/{idCopro}/assemblee/{idAg}.json
{ "dateFermeture": "2026-06-18 21:05:00" }
Avant d'envoyer cette date, vérifiez que chaque résolution de l'ordre de parcours, second vote compris, a estVotee à true. Relisez les résolutions concernées juste avant la clôture plutôt que de vous fier à un état mis en cache pendant la séance.
Effet
Une fois dateFermeture renseignée, l'API refuse l'ajout et la suppression de résolutions. Les autres modifications (textes, votes, présences, résultats) restent possibles, par exemple pour corriger le procès-verbal.
Annule l'assemblée (statut annulée). La valeur confirmée est aussi acceptée, et PUT …/ouvrir.json remet le statut à ouverte. Pensez à encoder l'accent dans l'URL.
Limite : code HTTP
Ces deux routes répondent 200 même lorsque la demande est refusée (statut invalide, par exemple). Le vrai résultat est dans le champ code du corps (202 en cas de succès, 400 sinon). Le statut ne verrouille rien : une assemblée annulée reste modifiable.
Efface la séance : dateReelle et dateFermeture sont vidées, toutes les présences et tous les votes sont supprimés, les résultats, les seconds votes, les textes de PV et les commentaires des résolutions sont effacés, et les documents de PV et de feuille de présence sont retirés (un document déjà utilisé dans un envoi est seulement détaché). Le statut et dateEnvoiPv ne sont pas modifiés : si le PV avait été marqué envoyé, videz aussi dateEnvoiPv par un PUT. Cette opération est irréversible : réservez-la à une séance tenue par erreur, avec une confirmation explicite de l'utilisateur.
G
Déposer le procès-verbal
Cas d'usage : le PV et la feuille de présence ont été produits, signés, puis envoyés aux copropriétaires.
{
"libelle": "Procès-verbal de l'AG du 18 juin 2026",
"fichier": { "mode": "base64", "nom": "pv-ag-2026.pdf", "valeur": "JVBERi0xLjcK…" }
}
{type} : pv (procès-verbal), pv-signe (version signée), presence (feuille de présence), document-pv (annexe). L'API ne génère pas le procès-verbal : elle stocke les textes par résolution (libellePv, contenuPv, commentaire) et les documents que vous produisez.
PUT/copro/{idCopro}/assemblee/{idAg}.json
{ "dateEnvoiPv": "2026-06-25 10:00:00" }
Marque l'assemblée comme terminée pour les logiciels qui la lisent. À envoyer une fois le PV réellement expédié.
GET/copro/{idCopro}/assemblee/{idAg}/logs.json
Historique des créations, modifications et suppressions sur l'assemblée, ses résolutions, ses présences et ses accès, du plus récent au plus ancien. Les votes n'y figurent pas, et un élément supprimé (résolution, présence) disparaît de l'historique avec lui. Pour pouvoir répondre à une contestation, conservez votre propre journal des présences et des votes reçus.
04
Référence des endpoints
Chemins relatifs à /copro/{idCopro}/assemblee/{idAg}, sauf mention contraire.
Méthode
Route
Rôle
GET
.json
Lire l'assemblée : ordre du jour, présences, votes, résultats.
PUT
.json
Ouvrir (dateReelle), clôturer (dateFermeture), marquer le PV envoyé (dateEnvoiPv).
GET
/copro/{idCopro}/cle/{idCle}.json
Tantièmes par lot d'une clé.
POST
/presence.json
Émarger un copropriétaire (présent, représenté, par correspondance).
PUT
/presence.json
Modifier une présence (départ, mode), désignée par copropriétaire + résolution.
DELETE
/presence.json
Supprimer une présence, désignée par copropriétaire + résolution.
POST
/resolution/{idRes}/votes.json
Enregistrer ou remplacer plusieurs votes.
POST
/resolution/{idRes}/vote.json
Enregistrer un seul vote ({coproprietaire, vote}).
PUT
/resolution/{idRes}/resoudre.json
Calculer ou fixer le résultat, écrire les textes du PV.
PUT
/resolution/{idRes}/reinitialiser.json
Annuler le résultat (et les votes avec votes=1).
PUT
/resolution/{idRes}.json
Amender, changer la clé ou la majorité, écrire le PV par langue.
PUT
/cloturer/{statut}.json
Passer le statut à confirmée ou annulée.
PUT
/ouvrir.json
Remettre le statut à ouverte.
PUT
/reinitialiser.json
Effacer toute la séance (irréversible).
POST
/document/{type}.json
Déposer PV, PV signé, feuille de présence.
GET
/logs.json
Historique des modifications (hors votes).
N'utilisez pas PUT …/resolution/{idRes}/calculer.json : cette route répond systématiquement une erreur. Le calcul passe par resoudre avec calcul.
05
Paramètres transverses
Paramètre
Usage pendant la séance
displays
Sans paramètre, ou avec des exclusions seulement, l'assemblée arrive complète, votes et présences compris. Dès qu'une inclusion est présente, les votes et présences ne sont chargés que si vous demandez resolutions.* ou presences.*. Une liste ou un objet s'inclut avec .* et s'exclut avec !champ.*. Sur une résolution seule, !votesResolution.* retire les votes.
locale
FR ou NL : lire ou écrire les textes du PV dans une langue donnée (assemblées multilingues).
Réponses : les lectures renvoient l'objet directement. Les écritures renvoient une enveloppe {"message": …, "error": …, "code": …}, l'objet créé ou modifié étant dans message. Une erreur inattendue renvoie un 500 au message générique : conservez le corps de votre requête pour pouvoir la diagnostiquer.
06
Limites & pièges connus
Voter ne calcule pas. Appelez resoudre avec calcul pour obtenir estVotee et estAcceptee.
Prolongation automatique des présences, y compris des partants, à la création d'un second vote ou d'une résolution en fin de séance. Réappliquez les départs.
Votes hors clé : un votant sans tantièmes dans la clé est accepté et fausse le décompte en nombre.
Présences sans garde-fou. Pas de contrôle des doublons ni du nombre de pouvoirs par mandataire. Vérifiez avant chaque ajout.
Présence désignée par copropriétaire + résolution, et impossible à modifier ou supprimer sur une assemblée sans votes.
Valeur de vote inconnue enregistrée « contre » alors que la réponse la renvoie telle quelle, et enregistrement partiel d'un lot de votes en erreur.
Tantièmes figés au moment du vote. Après un changement de clé, réinitialisez avec votes=1 et renvoyez les votes.
Seuils en « strictement supérieur » : l'égalité exacte à 2/3 (art. 26) est calculée comme un refus.
Second vote automatique : ne recalculez pas la résolution d'origine tant que son second vote existe (500, ou 202 qui laisse un second vote orphelin). Réinitialisez-la d'abord.
libellePV à renvoyer à chaque appel de resoudre, sinon il est remplacé par le libellé de convocation.
Statuts sans effet de verrou, et routes cloturer / ouvrir en HTTP 200 même en cas de refus : lisez code dans le corps.
La clôture ne bloque que l'ajout et la suppression de résolutions.
reinitialiser sur l'assemblée efface toute la séance, présences et votes compris, mais ne vide pas dateEnvoiPv.
Route calculer hors service : utilisez resoudre.
07
Questions de validation
J'ai envoyé tous les votes d'une résolution et reçu un 201. La résolution est-elle adoptée ou rejetée ?
Pas encore : les votes sont enregistrés, mais le résultat n'est pas calculé (estVotee vaut false). Appelez PUT …/resoudre.json avec calcul et libellePV, puis lisez estAcceptee. Voir parcours C et D.
Un copropriétaire quitte la séance pendant la résolution 4. Comment l'enregistrer sans fausser les votes suivants ?
Envoyez PUT …/presence.json avec coproprietaire, une resolution comprise dans sa plage, et derniereResolution : la 4 s'il a déjà voté dessus, sinon la résolution qui précède la 4 dans l'ordre de parcours (le second vote « 3 bis » s'il existe, ou la dernière sous-résolution de la 3). Il ne pourra plus voter au-delà. Si un second vote ou une résolution de fin de séance est créé ensuite, vérifiez que sa présence n'a pas été prolongée automatiquement. Sur une assemblée sans votes, cette modification est impossible. Voir parcours B.
La résolution 3 (art. 25, revotable) est refusée avec 40 % des tantièmes de sa clé. Que dois-je faire pour le second vote ?
Rien pour le créer : resoudre a créé automatiquement une resolutionRevote à la majorité simple, et les présences qui s'arrêtaient à la 3 ont été prolongées jusqu'à elle, y compris celles des copropriétaires partis après la 3 : réappliquez leurs départs. Enregistrez ensuite les votes sur son identifiant, puis appelez resoudre sur ce même identifiant. Ne recalculez pas la résolution d'origine tant que ce second vote existe (erreur 500 ou second vote orphelin). Pour la recompter, réinitialisez-la d'abord, ce qui supprime le second vote. Voir parcours D et E.