Cette page décrit les conventions communes à toutes les routes. Les tableaux de bord ont en plus leurs propres conventions (cache, périodes, soldes nets), décrites dans la page Présentation de la section « Tableaux de bord et analyses ».
{"id":34,"code":"JACHETE","description":"Jean Achète Inc.","address":{"line1":"123 rue Principale","city":"Montréal","postal_code":"H2X 1A1","country_code":"CA"},"payment_term":{"id":5,"code":1},"status":{"is_active":true},"metadata":{"unique_id":340,"updated_at":"2026-03-01T14:30:00-05:00"},"_links":{"self":"/api/customers/by-id/34"}}
Les deux formes ne portent pas les mêmes noms
Le résumé est fait pour l'affichage : name, active, updated_at. La fiche complète suit la structure d'Acomba : description, status.is_active, metadata.updated_at. Ne mélangez pas les deux dans votre code.
Le résumé est rapide. La fiche complète est relue dans Acomba à chaque appel : réservez-la aux fiches dont vous avez besoin. Vous pouvez aussi lister en résumé, puis suivre _links.self.
total compte les fiches qui répondent à vos filtres, et chaque page est pleine sauf la dernière.
Python
JavaScript
Les tableaux de bord paginent autrement
Certaines analyses (activité récente, factures impayées, analyse de produits…) utilisent limit et offset, avec metadata.has_more et next_offset. La référence de chaque endpoint indique ses paramètres.
Non : Acomba réutilise l'id d'une fiche supprimée pour la prochaine fiche créée
Routes /by-id/{id}
metadata.unique_id
Oui : propre à une fiche, jamais réutilisé
Lien durable avec votre système
Recommandation
Stockez idetunique_id. Lisez par id, puis vérifiez que unique_id correspond toujours. S'il diffère, la fiche d'origine a été supprimée et l'id désigne maintenant une autre fiche.
{"success": true, "id": 892}, parfois enrichi (numéro, statut)
Paie
Réponse propre à chaque route (par exemple id, code et liste des champs modifiés)
Il existe des exceptions : la section « Responses » de chaque endpoint donne toujours la forme exacte. Pour obtenir la fiche à jour, relisez-la avec GET …/by-id/{id}.
GET /api/helpers/updates renvoie les fiches modifiées dans un intervalle, regroupées par entité. Il lit la copie locale qu'ExoConnect tient à jour à partir d'Acomba.
Paramètre
Requis
Description
from_datetime
oui
Début de l'intervalle (ISO 8601, heure locale)
to_datetime
non
Fin de l'intervalle. Sans ce paramètre, toutes les fiches modifiées depuis from_datetime sont renvoyées, et la réponse donne dans to_datetime le moment jusqu'auquel la copie locale est complète
entities
non
Entités à inclure, séparées par des virgules (ex. customers,products). La liste : GET /api/helpers/list/entities
brief
non
true (défaut) : id, code, updated_at ; false : fiche de la copie
limit
non
Total maximal de fiches, toutes entités confondues (défaut 5 000, maximum 50 000)
Les factures et transactions clients et fournisseurs, les paiements clients et fournisseurs, et les mouvements d'inventaire ne sont pas copiés localement : ils sont lus directement dans Acomba. Pour ces entités, /helpers/updates renvoie toujours count: 0. Utilisez plutôt leurs listes avec les filtres de date, par exemple GET /api/customers/invoice-ar?from_datetime=…, GET /api/customers/payments?from_datetime=… ou GET /api/suppliers/payments?from_datetime=….
Synchronisation continue
Appelez la route sansto_datetime, puis réutilisez comme prochain from_datetime le to_datetime de la réponse : c'est le moment jusqu'auquel la copie locale est complète, si bien qu'aucune modification n'est perdue, même faite pendant le cycle de copie. Une fiche peut donc revenir une seconde fois : ignorez celles dont l'id et l'updated_at sont déjà connus. Si truncated vaut true, réduisez le nombre d'entités ou relancez à partir du dernier updated_at reçu.
La copie locale est mise à jour par ExoConnect en arrière-plan, environ toutes les 15 minutes par défaut. Une modification faite dans Acomba apparaît donc dans /helpers/updates après le cycle suivant.
Acomba ne traite qu'une opération à la fois. ExoConnect met donc les requêtes en file : elles sont toujours sûres, mais ne vont pas plus vite en parallèle.
Envoyez vos requêtes une ou deux à la fois, pas des dizaines en parallèle.
Prévoyez un délai d'attente généreux (300 secondes) : un calcul long ou une file chargée peut prendre plus d'une minute.
Sur un 503, attendez puis réessayez, en augmentant le délai entre deux essais (voir Codes d'erreur).
Pour les tableaux de bord, le premier appel calcule et les suivants sont servis par le cache : appelez-les à la demande plutôt qu'en boucle.