Documentation d'intégration · API Datacopro

Factures fournisseurs

Comment consulter, créer, faire évoluer et solder les factures fournisseurs d'une copropriété, et quelles contraintes régissent leur suppression.

À propos de ce guide. Ce document décrit uniquement le contrat de l'API Datacopro : les appels HTTP disponibles, leurs paramètres et les réponses qu'ils renvoient. Aucune connaissance d'un logiciel de gestion de copropriété en particulier n'est nécessaire pour le suivre — les cas d'usage cités servent uniquement à motiver l'ordre des appels.
01

Modèle & périmètre

Tous les appels de ce guide sont adressés à une copropriété précise (idCopro) et à un exercice comptable précis (idExercice) de cette copropriété : c'est le périmètre racine de chaque route. Une facture appartient toujours à un seul exercice — celui qui couvre sa date — mais cette appartenance peut changer après coup si la date de la facture est modifiée (voir Parcours C).

Facture racine

Une facture fournisseur (ou un avoir, qui est une facture au montant négatif) rattachée à un exercice et un fournisseur.

idlibellemontant referenceUniquereferenceComptablenote datedatePiecedateLimite fournisseurdetails[] estSupprimableestModifiable estSoldeeestRegleemontantRegle validationdocumentsjeuxDecritures nonParvenue

jeuxDecritures liste les écritures comptables déjà générées pour cette facture (lecture seule).

estSupprimable et estModifiable ne sont pas des indicateurs stockés : ils reflètent, au moment de la lecture, le résultat des mêmes règles générales que celles appliquées à la modification et à la suppression (exercice clôturé, ou écritures comptables ventilées sur un exercice antérieur clôturé — voir Limites & pièges connus). Ils ne couvrent pas la contrainte additionnelle propre au changement de fournisseur (Parcours C) : un estModifiable à true ne garantit donc pas que ce changement précis réussira.

Ligne de facture details[]

Une ligne d'imputation, avec sa quotité de TVA et son rattachement comptable.

quantitelibellemontanttva dateDebutdateFinplanComptable coproprietaire*contrat* intervention*mutation*

* rattachements optionnels, mutuellement indépendants. mutation n'est accepté que si la mutation visée a le statut « ouverte ».

Validation validation

Trois circuits de validation indépendants, chacun avec son propre statut : comptable, administrative, metier.

statutdescriptiondate*

* date est renvoyée en lecture mais ignorée si elle est soumise en écriture — voir Parcours D.

02

Contrôle d'accès

Chaque appel nécessite un jeton d'accès OAuth2, et le client doit être explicitement autorisé sur la copropriété visée par idCopro, sinon la réponse est un 403. Toute ressource imbriquée dans l'URL (l'exercice, la facture, un document) est en plus vérifiée comme appartenant réellement à la copropriété — et, pour une facture, à l'exercice — passés dans le chemin : un identifiant valide mais rattaché ailleurs est refusé, même si le client est par ailleurs autorisé sur la copropriété.

Base URL 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.
03

Parcours fonctionnels

Ces six parcours suivent le cycle de vie réel d'une facture : de sa consultation à sa saisie, son évolution, sa validation, son rapprochement bancaire, jusqu'à sa suppression.

A

Lister les factures d'une copropriété

Cas d'usage : afficher l'ensemble des factures et avoirs fournisseurs d'une copropriété, paginé, avec un compteur total fiable pour la pagination côté client.

GET/v2/copro/{idCopro}/exercice/{idExercice}/factures.json

Une facture appartient à un seul exercice : afficher toutes les factures d'une copropriété suppose de répéter cet appel pour chaque exercice à couvrir — il n'existe pas de route qui liste directement toutes les factures d'une copropriété tous exercices confondus.

Pourquoi La réponse est mise en cache côté serveur par exercice, y compris pour un jeu de filtres donné. Un appel avec displays=[id] seul, sans filtre ni pagination et trié par id, bascule sur un chemin plus léger qui ne renvoie que les identifiants — pratique pour connaître le nombre total de factures avant de paginer l'affichage détaillé.
Pourquoi Un filtre unique sur fournisseur.id (opérateur égalité, une seule valeur) est appliqué directement à la constitution de la réponse plutôt qu'après coup : c'est la seule combinaison de filtre optimisée à ce niveau. Tout autre filtre est appliqué en mémoire sur l'ensemble déjà mis en cache pour l'exercice — ce qui reste correct, mais sans le même bénéfice de sélectivité.
B

Créer une facture fournisseur

Cas d'usage : saisir une facture reçue d'un fournisseur, avec une ou plusieurs lignes d'imputation, et déclencher (ou non) la génération immédiate des écritures comptables.

POST/v2/copro/{idCopro}/exercice/{idExercice}/facture.json
{
  "facture": {
    "montant": 128000,
    "libelle": "Entretien ascenseur - T3",
    "referenceUnique": "F-2026-00412",
    "date": "2026-09-05 00:00:00",
    "dateLimite": "2026-10-05 00:00:00",
    "fournisseur": 4821,
    "note": "",
    "comptabilite": 1,
    "details": [
      {
        "quantite": 1,
        "libelle": "Contrat entretien T3",
        "montant": 128000,
        "tva": 21,
        "dateDebut": "2026-07-01 00:00:00",
        "dateFin": "2026-09-30 00:00:00",
        "planComptable": 55310,
        "contrat": 9012
      }
    ]
  }
}

fournisseur et details sont obligatoires ; les montants s'expriment en centimes.

Pourquoi montant n'est pas une valeur libre : elle doit être strictement égale à la somme des montant de chaque ligne de details, sans quoi la création échoue avec un message explicite. C'est un garde-fou de cohérence, pas une simple recopie — le total n'est jamais recalculé automatiquement à partir des lignes.
Pourquoi comptabilite: 1 déclenche la génération immédiate des écritures comptables de la facture ; à 0, la facture est enregistrée sans aucune écriture (utile pour une saisie en plusieurs temps, avant validation). Chaque ligne peut en plus être rattachée, indépendamment, à un contrat, une intervention, un coproprietaire, ou une mutation — mais seulement si cette mutation a le statut « ouverte » : une mutation déjà clôturée est silencieusement ignorée comme rattachement possible.
Limite date doit tomber dans les bornes de l'exercice ciblé par la route (entre sa date de début et sa date de fin) au moment de la création — contrairement à la modification, où changer la date peut faire basculer la facture vers un autre exercice (Parcours C). referenceUnique est facultative et, malgré son nom, aucune vérification d'unicité n'est appliquée dessus : deux factures, y compris du même fournisseur, peuvent parfaitement partager la même référence.
C

Modifier une facture existante

Cas d'usage : corriger le libellé, la date, la référence ou le fournisseur d'une facture déjà saisie.

PUT/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}.json

Seuls les champs présents dans la requête sont modifiés — pas de remplacement complet de l'objet. Champs modifiables : referenceUnique, libelle, note, referenceComptable, fournisseur, date, datePiece, dateLimite, validation (voir Parcours D).

Pourquoi Changer date recalcule l'exercice de rattachement de la facture à partir de la nouvelle date — la facture peut donc changer d'exercice suite à cette modification, sans appel supplémentaire. Un changement de libelle ou de date régénère aussi les écritures comptables existantes de la facture pour rester cohérentes.
Limite datePiece ne peut pas être postérieure à aujourd'hui, et dateLimite ne peut pas être antérieure à la date de la facture — deux contraintes vérifiées à chaque modification, pas seulement à la création. Changer fournisseur est bloqué si la facture n'est pas modifiable (voir Limites & pièges connus), ou si un règlement déjà associé à la facture couvre aussi d'autres factures : dans ce cas, le fournisseur ne peut pas être changé sans d'abord dissocier ce règlement partagé.
D

Faire évoluer le statut de validation

Cas d'usage : faire progresser une facture dans un circuit de validation à plusieurs regards (comptable, administratif, métier) avant qu'elle ne soit considérée comme définitivement acquise.

PUT/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}.json
{
  "validation": {
    "comptable": { "statut": "validé" }
  }
}

Le même appel que le Parcours C, avec uniquement l'objet validation. Les trois circuits (comptable, administrative, metier) sont indépendants et se mettent à jour séparément — modifier l'un ne touche pas le statut des deux autres.

Limite Seules trois valeurs de statut sont acceptées : à valider, indéfini, validé. Une valeur hors de cette liste n'est ni rejetée ni signalée par une erreur : elle est silencieusement ignorée, et le statut du circuit visé reste inchangé. De même, un champ date soumis dans l'objet de validation est toujours ignoré, y compris s'il est présent — la date de validation n'est jamais pilotable par ce biais.
E

Solder ou désolder une facture

Cas d'usage : marquer manuellement une facture comme soldée dans le cadre d'un rapprochement bancaire, ou revenir sur ce marquage.

GET/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}/solder.json
GET/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}/desolder.json
Limite Ces deux actions sont exposées en GET alors qu'elles modifient l'état de la facture (estSoldee) — une lecture n'est donc pas ici, contrairement à l'usage HTTP habituel, une opération sans effet de bord. Solder n'a aucune condition bloquante ; désolder, en revanche, échoue en 400 si la facture est déjà réglée (un règlement bancaire lui est effectivement associé) — le désoldage ne peut porter que sur un rapprochement manuel, pas défaire un règlement réel.
F

Supprimer une facture ou une ligne

Cas d'usage : retirer une facture saisie par erreur, ou une seule de ses lignes d'imputation.

DELETE/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}.json
DELETE/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}/detail/{idDetail}.json
Pourquoi Supprimer la dernière ligne restante d'une facture supprime la facture entière plutôt que de la laisser exister sans aucune ligne — une facture à zéro ligne n'est jamais un état valide.
Limite Une facture n'est supprimable (ni modifiable, pour le Parcours C) que si son exercice n'est pas clôturé, et qu'aucune écriture comptable qui lui est liée ne porte sur un exercice clôturé — ce second cas se produit par exemple pour une charge constatée d'avance ou une facture non parvenue, dont une partie des écritures peut avoir été ventilée sur un exercice antérieur déjà clôturé, même quand la facture elle-même est sur un exercice encore ouvert. Une exception existe pour la suppression seule, et seulement pour le premier critère (le propre exercice de la facture marqué clôturé) — jamais pour le second (écritures ventilées sur un exercice antérieur clôturé) : une facture de l'exercice d'ouverture (le tout premier exercice d'une copropriété) reste supprimable même si cet exercice est par ailleurs marqué clôturé.
Illustration C'est ainsi qu'un logiciel de gestion existant construit l'émission d'un avoir sur une facture existante : créer une nouvelle facture (Parcours B) dont chaque montant est l'exact opposé de la facture d'origine, avec sa propre note de renvoi vers la facture source ; modifier la facture d'origine (Parcours C) pour y ajouter une note pointant vers l'avoir créé ; puis solder (Parcours E) les deux factures, l'avoir compensant la facture d'origine.
04

Référence des endpoints

MéthodeRouteRôle
GET/v2/copro/{idCopro}/exercice/{idExercice}/factures.jsonListe des factures d'un exercice
POST/v2/copro/{idCopro}/exercice/{idExercice}/facture.jsonCrée une facture
GET/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}.jsonDétail d'une facture
PUT/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}.jsonModifie une facture (champs et/ou statut de validation)
DELETE/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}.jsonSupprime une facture
POST/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}/detail.jsonAjoute une ligne à une facture existante
PUT/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}/detail/{idDetail}.jsonModifie une ligne de facture
DELETE/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}/detail/{idDetail}.jsonSupprime une ligne de facture
POST/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}/facture-detail/{idDetail}/consommation.jsonEnregistre un volume de consommation sur une ligne
GET/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}/solder.jsonMarque la facture comme soldée
GET/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}/desolder.jsonAnnule le marquage soldée (refusé si réglée)
POST/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}/document/{idDocument}.jsonAssocie un document justificatif à la facture
PUT/v2/copro/{idCopro}/exercice/{idExercice}/facture/{idFacture}/delier-document.jsonRetire le document associé (refusé selon état de la facture)

Toutes ces routes attendent une extension de format explicite en fin de chemin (par exemple .json). Une facture ne peut porter qu'un seul document justificatif à la fois : y associer un nouveau document tant qu'un autre y est déjà lié n'ajoute pas un second justificatif.

05

Paramètres transverses

La liste des factures d'un exercice accepte trois familles de paramètres de requête génériques, communs à l'ensemble de l'API :

Coût réel, pas seulement de forme Un appel de liste avec displays=[id] seul, sans filtre ni pagination, trié par id, bascule sur un chemin de réponse allégé qui ne renvoie que les identifiants (voir Parcours A) — le moyen le plus léger de connaître le nombre total de factures d'un exercice avant de paginer un affichage détaillé.
06

Limites & pièges connus

✕
referenceUnique n'est ni obligatoire ni vérifiée comme unique, malgré son nom : deux factures peuvent librement partager la même référence (Parcours B).
✕
montant doit être strictement égal à la somme des montants des lignes de details à la création, sinon la requête échoue (Parcours B).
✕
Solder et désolder une facture sont exposés en GET alors qu'ils modifient son état — ne pas supposer qu'un appel GET est ici sans effet de bord (Parcours E).
✕
Désolder une facture réglée échoue toujours en 400 : le désoldage ne défait qu'un rapprochement manuel, jamais un règlement bancaire réel (Parcours E).
✕
Une facture peut rester non supprimable et non modifiable même si son propre exercice est ouvert, dès qu'une de ses écritures comptables déborde sur un exercice clôturé (charge constatée d'avance, facture non parvenue) — voir Parcours F.
✕
Modifier la date d'une facture peut la faire changer d'exercice de rattachement, sans appel supplémentaire ni confirmation (Parcours C).
✕
Un statut de validation hors des trois valeurs autorisées est silencieusement ignoré, sans erreur ni changement d'état (Parcours D).
✕
Une facture ne peut porter qu'un seul document justificatif à la fois (référence des endpoints, §04).
✕
Le segment de chemin identifiant une ligne de facture n'est pas nommé de façon cohérente selon la route : .../facture/{id}/detail/{id} pour la lecture, la modification et la suppression d'une ligne, mais .../facture/{id}/facture-detail/{id}/consommation pour y enregistrer un volume de consommation. Ce n'est pas une coquille de ce guide : c'est ainsi que l'API expose réellement ces deux routes (référence des endpoints, §04).
07

Questions de validation

Q1. Si je me trompe sur le montant total d'une facture en la créant, l'API le recalcule-t-elle à partir des lignes ?
Non : montant et la somme des details[].montant doivent déjà correspondre exactement dans la requête envoyée. Si ce n'est pas le cas, la création échoue avec un message d'erreur explicite plutôt que de recalculer l'un à partir de l'autre ou d'accepter l'incohérence. Parcours B
Q2. Je veux changer le fournisseur d'une facture qui a déjà un règlement bancaire associé : est-ce toujours possible ?
Pas systématiquement, et pour deux raisons indépendantes. D'abord, comme toute modification, le changement est refusé si la facture elle-même n'est pas modifiable (exercice clôturé, ou écritures ventilées sur un exercice antérieur clôturé — estModifiable ne suffit toutefois pas à l'anticiper avec certitude, voir Modèle & périmètre). Ensuite, même une facture par ailleurs modifiable reste bloquée si son règlement est partagé avec d'autres factures — le fournisseur du règlement ne pourrait alors plus correspondre à toutes les factures qu'il couvre. Dans ce second cas, il faut d'abord dissocier ce partage (ou traiter les factures concernées séparément) avant de pouvoir changer le fournisseur de celle-ci. Parcours C
Q3. Une facture dont l'exercice est toujours ouvert peut-elle malgré tout être bloquée en suppression ou en modification ?
Oui. Le blocage ne dépend pas uniquement du statut de clôture de l'exercice propre à la facture : si une de ses écritures comptables a été ventilée sur un exercice antérieur déjà clôturé (typiquement une charge constatée d'avance ou une facture non parvenue), la facture reste non modifiable et non supprimable tant que cette situation existe — même si son propre exercice est encore ouvert. Parcours F