Cadrage
Modèle & périmètre
Le rapprochement bancaire met en relation deux objets qui existent indépendamment l'un de l'autre dans Datacopro, puis les relie par un troisième objet, le lien de rapprochement lui-même.
Transaction bancaire
- id int
- date date
- description string
- libelleSource string
- ibanSource string
- debit / credit int (centimes)
- type string
- typeTransaction string
- compte objet Compte
Écriture bancaire candidate
- id int
- libelle string
- debit / credit int (centimes)
- planComptable objet en lecture / id en écriture
Lien de rapprochement
- id int
- transaction objet Transaction
- ecriture objet Écriture
- montant calculé, lecture seule
- dateRapprochement datetime
Tout ce périmètre est rattaché à une copropriété (idCopro), elle-même optionnellement regroupée dans un domaine (idDomaine) lorsqu'un même mandataire gère plusieurs copropriétés — c'est ce regroupement qui permet de traiter un portefeuille entier en une seule boucle plutôt que copropriété par copropriété. Les écritures, elles, sont en plus rattachées à un exercice comptable précis (une période datée), déterminé par la date du mouvement bancaire — un même compte bancaire peut donc voir ses écritures se répartir sur deux exercices si l'un vient d'être ouvert. Cet exercice n'apparaît pas comme un champ de l'écriture elle-même : c'est l'URL de l'appel (/exercice/{idExercice}/) qui porte ce rattachement.
Deux champs de la transaction se ressemblent mais répondent à des questions différentes : type décrit l'instrument bancaire tel que rapporté par le relevé (par exemple un virement, un chèque, un ordre permanent), tandis que typeTransaction décrit le canal par lequel la transaction est entrée dans Datacopro (voir parcours 3) — c'est ce second champ, et lui seul, qu'il faut renvoyer tel quel lors d'un rapprochement.
Les routes de ce guide se terminent par .{_format} : à ce jour, seule la valeur json est utilisée en pratique (/v2/copro/42/transactions.json).
Cadrage
Contrôle d'accès
Chaque appel qui porte sur une copropriété ou un domaine vérifie que le client authentifié est autorisé sur ce périmètre précis ; dans le cas contraire l'API répond 403, avant même de regarder si la ressource demandée existe.
Ce contrôle est vérifié deux fois de suite sur les appels qui traversent deux niveaux d'imbrication : par exemple, pour rapprocher une écriture, l'API vérifie d'abord que le client est autorisé sur la copropriété de l'URL, puis que l'écriture visée appartient bien à cette même copropriété — un identifiant d'écriture syntaxiquement valide mais rattaché à une autre copropriété est également refusé en 403, même si le client est par ailleurs autorisé sur sa propre copropriété.
Une fois ce contrôle passé, deux autres codes distinguent les refus qui suivent : un 404 pour un identifiant syntaxiquement valide mais qui ne désigne aucune ressource réelle, et un 400 pour toutes les règles de validation métier détaillées dans les parcours ci-dessous (transaction déjà rapprochée, montant incohérent, clé de répartition manquante…).
Parcours 1 / 7
01Repérer le périmètre à traiter
Avant de traiter la banque d'une copropriété, il faut d'abord savoir laquelle traiter. Pour un mandataire qui gère un portefeuille, cela part du domaine plutôt que d'une copropriété isolée.
Le domaine est le seul point d'entrée qui renvoie « toutes les copropriétés de ce mandataire » en un appel. Sans lui, il faudrait connaître à l'avance la liste des identifiants de copropriété à traiter.
Parcours 2 / 7
02Rassembler les données d'une copropriété
Pour chaque copropriété active, le traitement a besoin de trois familles de données avant de pouvoir commencer à apparier quoi que ce soit : les mouvements bancaires bruts, les écritures comptables qui attendent d'être rapprochées, et le contexte qui permettra d'identifier ce que chaque mouvement représente.
Selon ce que la suite du parcours doit faire avec un mouvement non apparié (parcours 4 à 6), deux appels complémentaires sont utiles à ce stade :
displays limite les champs réellement sérialisés dans la réponse. Croiser une transaction avec « le copropriétaire dont le solde correspond exactement à ce montant » ne demande que l'identifiant et le solde de chacun — pas l'ensemble de sa fiche. Sur une copropriété à plusieurs centaines de lots, la différence de poids de réponse est significative, et se répète à chaque exécution du traitement.
Si le traitement doit aussi couvrir les frais bancaires ou les intérêts créditeurs (parcours 7), il faut en plus la clé de répartition générale de la copropriété :
La clé de type general répartit un montant sur l'ensemble des lots de la copropriété — c'est celle qu'attend une écriture dont le poste de destination est réparti plutôt qu'imputé sur un compte précis (voir parcours 7).
Parcours 3 / 7
03Rapprocher une transaction et une écriture
C'est le cas central : une écriture comptable existe déjà (elle a été saisie ou importée par ailleurs) et un mouvement bancaire lui correspond. Il reste à poser le lien entre les deux.
{
"idTransaction": 48213,
"idEcriture": 102938,
"typeTransaction": "budgetinsight"
}
typeTransaction de la transaction visée. Trois origines existent à ce jour — budgetinsight (agrégation bancaire automatique), comptable (import comptable) et manual (saisie manuelle) — le client n'a rien à savoir de plus sur ces canaux que cette valeur : il la lit sur la transaction et la renvoie telle quelle. Une valeur qui ne correspond pas à l'origine réelle de la transaction est refusée.Un mouvement créditeur en banque doit correspondre à une écriture débitrice côté comptabilité, et inversement — c'est le principe même d'un relevé bancaire mis en miroir du grand livre. Une tentative de lier deux mouvements du même sens (les deux au débit, ou les deux au crédit) est refusée.
Le montant du lien n'est pas transmis par le client : il est calculé automatiquement à partir du montant de l'écriture rapprochée. L'API refuse un doublon exact (même transaction, même écriture, même montant calculé, même origine) si vous soumettez deux fois la même paire — mais elle ne garantit pas qu'une transaction ne puisse être liée qu'à une seule écriture, ni l'inverse : rien n'empêche, côté contrat d'API, de rapprocher la même transaction à deux écritures différentes par deux appels distincts. Un client qui orchestre un rapprochement automatique doit donc vérifier lui-même, avant d'appeler cet endpoint, qu'aucun lien n'existe déjà pour cette transaction ou cette écriture.
Deux autres cas sont refusés systématiquement, quel que soit le sens et l'origine : une écriture qui appartient à une annulation (elle-même annulée, ou étant l'origine d'une annulation) ne peut pas être rapprochée, et une écriture dont le compte de destination n'est pas un compte de type banque n'est pas éligible — même si son montant correspond par coïncidence à celui d'une transaction.
Pour vérifier les liens déjà posés sur un exercice avant d'en créer un nouveau, ou pour un audit :
Pour défaire un lien créé par erreur :
Parcours 4 / 7
04Comptabiliser un règlement identifié dans le libellé
Une transaction bancaire n'a pas toujours d'écriture qui l'attend déjà : c'est le cas d'un paiement fournisseur qui n'a pas encore été saisi. Si son libellé bancaire contient une référence de facture reconnaissable, l'API permet de créer directement le règlement — et donc l'écriture comptable qui va avec — à partir de la seule transaction.
Cet appel comptabilise le règlement et génère ses écritures ; il ne pose pas automatiquement le lien de rapprochement avec la transaction bancaire d'origine. Le lien reste un second appel explicite : relire le règlement créé pour récupérer l'identifiant de l'écriture qu'il a générée, puis appeler l'endpoint de rapprochement du parcours 3 avec cette écriture et la transaction de départ. Cette même limite s'applique aux trois parcours suivants (transfert, encaissement, écriture libre) : aucun d'eux ne pose le lien à votre place.
Relit le règlement créé pour en extraire l'écriture générée, en vue du second appel de rapprochement décrit ci-dessus.
Parcours 5 / 7
05Comptabiliser un transfert interne entre deux comptes
Un virement d'un compte de la copropriété vers un autre compte de la même copropriété (par exemple du compte courant vers un compte rémunéré) apparaît côté banque comme deux transactions symétriques, une sur chaque compte, au même montant et à la même date.
Détecter qu'une transaction créditrice sur un compte correspond à une transaction débitrice sur un autre compte repose sur une égalité stricte de montant et de date entre les deux mouvements bancaires. Si l'établissement bancaire enregistre les deux jambes du virement à des dates différentes (une date de valeur décalée, par exemple), l'appariement automatique échoue silencieusement et les deux transactions restent non rapprochées.
Comme pour le règlement (parcours 4), créer le transfert ne rapproche aucune des deux transactions bancaires : chacune des deux jambes doit être rapprochée séparément via l'endpoint du parcours 3, à partir des deux écritures que le transfert a générées.
Parcours 6 / 7
06Comptabiliser un encaissement copropriétaire
Un versement reçu d'un copropriétaire peut être identifié de deux façons, à tenter dans cet ordre : par une référence structurée présente dans le libellé bancaire, ou, à défaut, par une correspondance de montant avec le solde d'un copropriétaire.
La correspondance par solde ne peut aboutir que si un seul copropriétaire de la copropriété présente exactement ce solde au moment du traitement. Si deux copropriétaires partagent le même solde, l'ambiguïté n'est volontairement pas résolue automatiquement — la transaction reste non identifiée plutôt que d'être imputée au mauvais copropriétaire. C'est un choix de sécurité des données : mieux vaut un mouvement en attente qu'un encaissement mal affecté.
Comme pour le règlement (parcours 4), créer l'encaissement ne rapproche pas la transaction bancaire d'origine : c'est, là aussi, un second appel explicite vers l'endpoint du parcours 3.
Parcours 7 / 7
07Comptabiliser des frais bancaires ou des intérêts créditeurs
Certains mouvements ne correspondent ni à un règlement, ni à un encaissement, ni à un transfert : ce sont des frais prélevés par la banque, ou des intérêts créditeurs versés sur un compte rémunéré. Ils se comptabilisent par une écriture libre équilibrée plutôt que par un des endpoints métier précédents.
{
"libelle": "Frais de tenue de compte",
"date": "2026-03-14 00:00:00",
"ecritures": [
{ "debit": 1200, "credit": 0,
"repartition": { "type": "{idPosteFraisBancaires}", "cle": "{idCleGenerale}" } },
{ "debit": 0, "credit": 1200,
"repartition": { "planComptable": "{idCompteBanque}" } }
]
}
planComptable prend l'identifiant d'un compte précis (typiquement le compte banque lui-même), tandis que type prend l'identifiant d'un poste qui doit alors être réparti — et exige dans ce cas une clé de répartition (cle). Dans les deux cas, la valeur attendue est un identifiant, pas un mot-clé de catégorie.La jambe qui impute des frais bancaires ou des intérêts n'est pas rattachée à un compte de copropriétaire précis : elle doit être répartie sur l'ensemble des lots de la copropriété, selon les tantièmes de la clé choisie. Sans identifiant de clé valide sur cette jambe, l'API refuse l'écriture — c'est pour cette raison que le parcours 2 va chercher la clé générale de la copropriété en amont, avant même de savoir si elle servira.
Une écriture libre est refusée si l'exercice comptable visé est déjà clôturé. Un traitement récurrent qui continue de recevoir des transactions sur un compte dont l'exercice vient d'être clôturé doit prévoir ce cas plutôt que de le traiter comme une erreur transitoire à réessayer.
Comme pour le règlement (parcours 4), créer cette écriture ne rapproche pas la transaction par elle-même : le lien avec la transaction bancaire d'origine se pose ensuite via l'endpoint du parcours 3.
Référence
Endpoints utilisés dans ce guide
| Méthode | Route | Rôle |
|---|---|---|
| GET | /v2/domaines/{idDomaine} | Détail d'un domaine (regroupement de copropriétés). |
| GET | /v2/domaines/{idDomaine}/copros | Copropriétés d'un domaine, filtrables par statut. |
| GET | /v2/copro/{idCopro} | Détail d'une copropriété (comptes, exercices…). |
| GET | /v2/copro/{idCopro}/transactions | Mouvements bancaires bruts, tous comptes confondus. |
| GET | /v2/copro/{idCopro}/exercice/{idExercice}/ecrituresbanque | Écritures sur compte banque, non rapprochées par défaut. |
| GET | /v2/copro/{idCopro}/exercice/{idExercice}/rapprochements | Liens de rapprochement déjà posés sur un exercice. |
| GET | /v2/copro/{idCopro}/coproprietaires | Copropriétaires et leur solde, pour l'identification par solde. |
| GET | /v2/copro/{idCopro}/exercice/{idExercice}/factures | Factures fournisseur de l'exercice, pour l'identification par référence. |
| GET | /v2/copro/{idCopro}/cles | Clés de répartition de la copropriété. |
| POST | /v2/copro/{idCopro}/rapprochement | Créer le lien entre une transaction et une écriture. |
| DELETE | /v2/copro/{idCopro}/rapprochement/{idRapprochement} | Supprimer un lien de rapprochement. |
| POST | /v2/copro/{idCopro}/exercice/{idExercice}/reglement/paiement/{idCstModePaiement} | Créer un règlement fournisseur à partir d'un paiement. |
| GET | /v2/copro/{idCopro}/exercice/{idExercice}/reglement/{idExerciceReglement} | Relire un règlement pour récupérer ses écritures générées. |
| POST | /v2/copro/{idCopro}/exercice/{idExercice}/transfert/paiement/{idCstModePaiement} | Créer un transfert entre deux comptes de la copropriété. |
| POST | /v2/copro/{idCopro}/exercice/{idExercice}/encaissement/paiement/{idCstModePaiement} | Créer un encaissement copropriétaire à partir d'un versement. |
| POST | /v2/copro/{idCopro}/exercice/{idExercice}/jeu | Créer une écriture libre équilibrée (frais bancaires, intérêts…). |
Identifiants de mode de paiement
Requis par les endpoints de règlement, encaissement et transfert. Ensemble actuellement défini par l'API :
Référence
Paramètres transverses
filters[statut]=active). Filtrer côté serveur plutôt que de tout récupérer puis filtrer côté client réduit le volume transféré à chaque appel — sensible dès qu'un portefeuille compte plusieurs dizaines de copropriétés.true par défaut ; passer false renvoie l'historique complet, y compris les écritures déjà rapprochées — utile pour un audit, pas pour un traitement de rapprochement courant.dateFin du parcours 2) s'écrit YYYY-MM-DD HH:MM:SS. Une date de mouvement ou d'écriture (date dans les corps de requête des parcours 4 à 7) accepte la même forme complète ; l'heure, quand elle n'a pas de sens pour l'opération, peut être laissée à minuit.Référence
Limites & pièges connus
- Pas d'unicité stricte transaction ↔ écriture. Seul un doublon exact (même transaction, même écriture, même montant, même origine) est refusé par l'API — vérifier l'absence de lien existant reste à la charge du client (parcours 3).
typeTransactionn'est pas une valeur libre. Elle doit reproduire exactement celle portée par la transaction visée, faute de quoi le rapprochement est refusé (parcours 3).- Créer un règlement, un transfert, un encaissement ou une écriture libre ne rapproche pas la transaction. C'est toujours un second appel explicite vers l'endpoint de rapprochement du parcours 3 (parcours 4, 5, 6, 7).
- Hors autorisation (403), les refus de ce guide sont des
400. Toutes les règles de validation métier décrites ci-dessus — transaction déjà rapprochée, sens incohérent, écriture d'annulation, clé de répartition manquante… — sont renvoyées avec ce code, à charge pour le client de lire le message pour distinguer le cas précis (parcours 3, 7 ; « Contrôle d'accès »). - Un transfert entre deux comptes n'est détectable automatiquement que si les deux jambes bancaires partagent exactement la même date — une date de valeur décalée casse l'appariement (parcours 5).
- L'identification d'un encaissement par solde échoue silencieusement en cas de solde partagé par plusieurs copropriétaires — aucune erreur explicite, simplement aucun encaissement créé (parcours 6).
- Chaque écriture appartient à un exercice comptable précis, déterminé par la date du mouvement ; sur l'écriture libre du parcours 7, un exercice clôturé refuse explicitement toute nouvelle écriture.
Vérifications
Questions de validation
Si je tente de rapprocher une transaction déjà rapprochée avec une écriture différente, l'API me protège-t-elle du doublon fonctionnel ?
Non, pas automatiquement au-delà du doublon exact. L'API bloque uniquement la répétition à l'identique (même transaction, même écriture, même montant, même origine) ; rien n'empêche, côté contrat, de rapprocher la même transaction à une écriture différente par un second appel. La vérification d'absence de lien préexistant est à faire côté client avant l'appel.
→ Parcours 3, encadré « Limite ».
Créer un règlement (ou un encaissement, un transfert, une écriture libre) à partir d'une transaction suffit-il à marquer cette transaction comme rapprochée ?
Non, pour aucun des quatre. Ces endpoints comptabilisent le mouvement et génèrent ses écritures, mais ne posent pas le lien de rapprochement avec la transaction bancaire d'origine — y compris le transfert, dont l'appariement des deux jambes bancaires (parcours 5) est un mécanisme distinct qui ne produit pas non plus de lien de rapprochement. Ce lien reste, dans les quatre cas, un second appel explicite vers l'endpoint de rapprochement, une fois l'identifiant de l'écriture générée récupéré.
→ Parcours 4, 5, 6 et 7.
Que se passe-t-il si deux copropriétaires partagent exactement le même solde au moment d'identifier un encaissement par solde ?
Rien n'est créé automatiquement. L'ambiguïté n'est volontairement pas résolue par le contrat d'API — mieux vaut laisser la transaction en attente que risquer d'imputer l'encaissement au mauvais copropriétaire.
→ Parcours 6, encadré « Limite ».