Datacopro API · Guide fonctionnel

Rapprocher les transactions bancaires avec l'API Datacopro

Comment relier automatiquement les mouvements d'un relevé bancaire aux écritures comptables d'une copropriété, et comment générer directement un règlement, un encaissement, un transfert ou une écriture de frais bancaires à partir d'une transaction non identifiée.

§

À propos de ce guide. Ce document décrit uniquement le contrat de l'API Datacopro : les appels, leur ordre, et ce que chaque paramètre change réellement. Il s'appuie sur l'observation d'un usage réel de cette API pour motiver l'ordre des parcours ci-dessous, mais aucune connaissance d'un logiciel particulier n'est nécessaire pour le suivre.

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.

GET/v2/domaines/{idDomaine}.{_format}
GET/v2/domaines/{idDomaine}/copros.{_format}?filters[statut]=active
filters[statut]
Restreint la liste aux copropriétés au statut active. Une copropriété clôturée n'a plus vocation à recevoir de nouvelles écritures — la filtrer côté serveur évite de la redemander à chaque exécution et évite de tenter, plus loin dans le parcours, de comptabiliser un mouvement sur un exercice qui refusera l'écriture.
Pourquoi passer par le domaine

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.

GET/v2/copro/{idCopro}.{_format}
GET/v2/copro/{idCopro}/transactions.{_format}
GET/v2/copro/{idCopro}/exercice/{idExercice}/ecrituresbanque.{_format}?onlyNonRapprochees=true
onlyNonRapprochees
true par défaut. Ne renvoie que les écritures sur un compte banque qui n'ont encore aucun lien de rapprochement — c'est la liste des candidates réelles à un matching, pas l'historique complet du compte. Cet appel se fait par exercice : une copropriété avec deux exercices ouverts en parallèle doit être interrogée une fois par exercice.

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 :

GET/v2/copro/{idCopro}/coproprietaires.{_format}?dateFin={date}&displays[]=id&displays[]=solde
GET/v2/copro/{idCopro}/exercice/{idExercice}/factures.{_format}?displays[]=id&displays[]=fournisseur.id
Pourquoi restreindre avec displays

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é :

GET/v2/copro/{idCopro}/cles.{_format}?displays[]=id&displays[]=type

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.

POST/v2/copro/{idCopro}/rapprochement.{_format}
{
  "idTransaction": 48213,
  "idEcriture": 102938,
  "typeTransaction": "budgetinsight"
}
typeTransaction
Ce n'est pas une valeur libre : elle doit être exactement celle renvoyée dans le champ 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.
Pourquoi le sens du montant est vérifié

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.

Limite — pas d'unicité stricte 1-pour-1

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 :

GET/v2/copro/{idCopro}/exercice/{idExercice}/rapprochements.{_format}

Pour défaire un lien créé par erreur :

DELETE/v2/copro/{idCopro}/rapprochement/{idRapprochement}.{_format}

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.

POST/v2/copro/{idCopro}/exercice/{idExercice}/reglement/paiement/{idCstModePaiement}.{_format}
idExercice
L'exercice comptable dont la période couvre la date de la transaction — pas nécessairement l'exercice le plus récent de la copropriété. Une copropriété avec un exercice qui vient de s'ouvrir peut avoir des transactions à cheval sur deux exercices.
idCstModePaiement
Le mode de paiement (voir la légende des identifiants en fin de guide) — déduit du libellé ou du type de la transaction, pas d'un choix arbitraire : un mode de paiement incohérent avec la transaction réelle fausse les rapprochements ultérieurs sur ce mode.
reglement.factures[]
La ou les factures soldées par ce règlement, chacune avec son propre montant — un règlement peut couvrir plusieurs factures du même fournisseur en un seul appel.
Limite — créer le règlement ne rapproche pas la 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.

GET/v2/copro/{idCopro}/exercice/{idExercice}/reglement/{idExerciceReglement}.{_format}

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.

POST/v2/copro/{idCopro}/exercice/{idExercice}/transfert/paiement/{idCstModePaiement}.{_format}
transfert.planComptableSource / planComptableDestination
Les deux comptes impliqués — la création du transfert génère les écritures sur les deux comptes en un seul appel, plutôt que de composer manuellement deux écritures libres.
Limite — l'appariement des deux mouvements dépend d'une égalité stricte

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.

POST/v2/copro/{idCopro}/exercice/{idExercice}/encaissement/paiement/{idCstModePaiement}.{_format}
encaissement.coproprietaire
Le copropriétaire identifié — soit par la référence extraite du libellé, soit par le copropriétaire dont le solde (récupéré au parcours 2) égale exactement le montant de la transaction.
Limite — l'identification par solde n'est fiable qu'en cas de solde unique

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.

POST/v2/copro/{idCopro}/exercice/{idExercice}/jeu.{_format}
{
  "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}" } }
  ]
}
ecritures[].repartition
Deux formes possibles pour désigner la destination d'une jambe de l'écriture : 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.
Pourquoi la clé de répartition générale est nécessaire ici

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.

Limite — l'exercice doit être ouvert

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éthodeRouteRôle
GET/v2/domaines/{idDomaine}Détail d'un domaine (regroupement de copropriétés).
GET/v2/domaines/{idDomaine}/coprosCopropriétés d'un domaine, filtrables par statut.
GET/v2/copro/{idCopro}Détail d'une copropriété (comptes, exercices…).
GET/v2/copro/{idCopro}/transactionsMouvements 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}/rapprochementsLiens de rapprochement déjà posés sur un exercice.
GET/v2/copro/{idCopro}/coproprietairesCopropriétaires et leur solde, pour l'identification par solde.
GET/v2/copro/{idCopro}/exercice/{idExercice}/facturesFactures fournisseur de l'exercice, pour l'identification par référence.
GET/v2/copro/{idCopro}/clesClés de répartition de la copropriété.
POST/v2/copro/{idCopro}/rapprochementCré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}/jeuCré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 :

1Chèque
2Carte bancaire
3Virement
4Prélèvement
5Espèces
6Télérèglement

Référence

Paramètres transverses

filters[champ]
Filtre appliqué côté serveur sur les endpoints de liste (par exemple 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.
displays[]
Restreint les champs sérialisés dans la réponse à une liste explicite. Pertinent dès qu'un appel sert uniquement à croiser une valeur (un solde, un identifiant de fournisseur) sur un grand nombre d'enregistrements, sans avoir besoin du reste de chaque fiche.
onlyNonRapprochees
Spécifique à l'endpoint des écritures bancaires (parcours 2). 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.
dates
Une date seule (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).
  • typeTransaction n'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 ».