Développeurs

API REST et webhooks signés.

Branchez vos outils sur les données de votre cabinet : référentiel, comptabilité, appels de fonds, factures, assemblées et documents. Incluse dans l’abonnement, sans devis ni surcoût.

Démarrage

  1. Dans Gerelio, un dirigeant du cabinet ouvre Paramètres → API et crée une clé : un nom (l’outil qui l’utilisera), une portée (lecture seule ou lecture et écriture) et, si besoin, une date d’expiration.
  2. La clé complète (gk_live_…, 40 caractères) s’affiche une seule fois. Rangez-la dans le coffre de votre outil : Gerelio n’en conserve que l’empreinte SHA-256 et ne pourra pas la réafficher.
  3. Appelez l’API à l’adresse https://gerelio.com/api/v1, en JSON, encodé en UTF-8.
curl "https://gerelio.com/api/v1/cabinet" \
  -H "Authorization: Bearer $GERELIO_CLE"
{
  "donnees": {
    "id": "49a1fc17-2fca-47ea-87f1-bb1d2c618e45",
    "nom": "Cabinet Delorme & Associés",
    "siren": "912 345 678",
    "adresse": "48 rue de la République",
    "code_postal": "69002",
    "ville": "Lyon",
    "email": "contact@delorme-gestion.exemple.fr",
    "telephone": "04 72 00 00 00",
    "carte_pro_numero": "CPI 6901 2024 000 012 345",
    "lecture_seule": false,
    "cle": {
      "nom": "Documentation",
      "prefixe": "gk_live_lTH0",
      "portee": "lecture_ecriture",
      "expire_le": null
    },
    "limite_par_minute": 120
  }
}

Tous les exemples de cette page sont de vraies réponses de l’API, produites sur le cabinet de démonstration (noms et identifiants fictifs), parfois raccourcies à un ou deux éléments.

Authentification et portée

Chaque requête porte l’en-tête Authorization: Bearer gk_live_…. Une clé donne accès aux données de son seul cabinet : un identifiant appartenant à un autre cabinet répond toujours 404.

  • Lecture seule : toutes les requêtes GET.
  • Lecture et écriture : en plus, création et modification de personnes, enregistrement de factures fournisseurs, import de relevés bancaires. Ces écritures passent par les mêmes règles que l’application et figurent au journal d’audit du cabinet, au nom de la clé.

Une clé révoquée ou expirée est refusée immédiatement (401). La date de dernière utilisation et le nombre d’appels de chaque clé sont visibles dans Paramètres → API. Si l’abonnement du cabinet est en lecture seule, l’API reste disponible en lecture pour exporter vos données ; les écritures répondent 403 lecture_seule.

Une clé est un secret : ne l’insérez jamais dans une page web ou une application mobile. Appelez l’API depuis un serveur.

Limites

Débit120 requêtes par minute et par clé. Chaque réponse indique RateLimit-Limit, RateLimit-Remaining et RateLimit-Reset (secondes avant la minute suivante). Au-delà : 429 avec Retry-After.
Pages25 éléments par défaut, 100 au plus (limite).
Corps1 Mo au plus ; 1 000 opérations au plus par import de relevé.
Clés20 clés actives et 10 webhooks par cabinet.

Pagination

Les listes sont triées par date de création puis identifiant, et paginées par curseur : un élément ajouté pendant le parcours ne décale pas les pages. Chaque page renvoie donnees, a_suivre et curseur_suivant, à repasser tel quel dans le paramètre curseur.

# Première page
curl "https://gerelio.com/api/v1/lots?limite=100" -H "Authorization: Bearer $GERELIO_CLE"
# Pages suivantes : reprendre la valeur curseur_suivant, tant que a_suivre vaut true
curl "https://gerelio.com/api/v1/lots?limite=100&curseur=MjAyNi0wOS0yNlQx…" -H "Authorization: Bearer $GERELIO_CLE"

Les paramètres inconnus sont refusés (400) : une faute de frappe dans un filtre ne renvoie jamais silencieusement toute la liste.

Erreurs

Toute erreur répond en JSON avec un statut HTTP, un code stable et un message en français. requete_id (aussi dans l’en-tête Gerelio-Requete) identifie la requête si vous nous écrivez.

{
  "erreur": {
    "statut": 404,
    "code": "introuvable",
    "message": "Immeuble introuvable dans votre cabinet"
  },
  "requete_id": "5b0f7d52-3c2e-4b8e-9a51-0c7f4d1e2a93"
}
StatutCodesCas
400parametre_invalide · donnees_invalides · json_invalideParamètre inconnu ou mal formé, champ manquant ou d’un mauvais type. Le message nomme le champ.
401authentification_requise · cle_invalide · cle_revoquee · cle_expireeEn-tête Authorization absent, clé inconnue, révoquée ou expirée.
403portee_insuffisante · lecture_seule · acces_refuseÉcriture avec une clé en lecture seule, ou cabinet dont l’abonnement est en lecture seule (la lecture reste possible).
404introuvable · route_inconnueAucun objet avec cet identifiant dans votre cabinet (un objet d’un autre cabinet est toujours introuvable).
405methode_non_autoriseeMéthode non prise en charge sur ce chemin (voir l’en-tête Allow).
409conflitDoublon, par exemple une facture déjà enregistrée pour ce fournisseur et ce numéro.
413corps_trop_grosCorps de requête de plus de 1 Mo.
415type_de_contenuÉcriture sans l’en-tête Content-Type: application/json.
422regle_metierRègle de gestion refusée par Gerelio (même message que dans l’application).
429limite_atteintePlus de 120 requêtes dans la minute pour cette clé : réessayez après Retry-After secondes.
500erreur_interneErreur inattendue : réessayez, puis écrivez-nous avec la valeur requete_id.
503service_indisponibleAPI momentanément indisponible.

Ressources

Montants en centimes d’euro (entiers), dates au format AAAA-MM-JJ, horodatages ISO 8601, identifiants UUID.

Immeubles

Copropriétés dont le cabinet est syndic et immeubles gérés en location. entite_id désigne la comptabilité du syndicat.

  • GET /immeubles Liste
  • GET /immeubles/{id} Un immeuble
ParamètreValeursEffet
gere_en_syndictrue | falseCopropriétés en syndic, ou immeubles en gestion locative seule
curl "https://gerelio.com/api/v1/immeubles?limite=1" \
  -H "Authorization: Bearer $GERELIO_CLE"
{
  "donnees": [
    {
      "id": "119be282-fe81-4a6d-b6a1-32c3356495d9",
      "nom": "Le Clos Saint-Martin",
      "adresse": "3 chemin Saint-Martin",
      "code_postal": "69300",
      "ville": "Caluire-et-Cuire",
      "annee_construction": 1998,
      "gere_en_syndic": true,
      "rnic_numero": "AC7-455-102",
      "exercice_debut_mois": 1,
      "entite_id": "c428fca7-2b7c-46d4-83ba-73a855b5a20d",
      "nombre_lots": 12,
      "cree_le": "2026-09-26T11:37:35.877+00:00"
    }
  ],
  "a_suivre": true,
  "curseur_suivant": "MjAyNi0wOS0yNlQxMTozNzozNS44NzcwMDBafDExOWJlMjgyLWZlODEtNGE2ZC1iNmExLTMyYzMzNTY0OTVkOQ"
}

Lots

Lots avec leurs tantièmes par clé de répartition (CG : charges générales, base des voix en assemblée).

  • GET /lots Liste
  • GET /lots/{id} Un lot
ParamètreValeursEffet
immeuble_idUUIDLots d’un immeuble
proprietaire_idUUIDLots d’un propriétaire
curl "https://gerelio.com/api/v1/lots?immeuble_id=119be282-fe81-4a6d-b6a1-32c3356495d9&limite=1" \
  -H "Authorization: Bearer $GERELIO_CLE"
{
  "donnees": [
    {
      "id": "00dbe1f0-e25a-4d1b-a0dc-02b1a1975145",
      "immeuble_id": "119be282-fe81-4a6d-b6a1-32c3356495d9",
      "numero": "B05",
      "type": "appartement",
      "etage": "1er",
      "surface_m2": 90,
      "pieces": 4,
      "proprietaire_id": "c2d23cd8-c71b-47c1-8d50-122d5d09a062",
      "dpe_classe": "D",
      "dpe_date": null,
      "tantiemes": {
        "CG": 900
      },
      "cree_le": "2026-09-26T11:37:35.877+00:00"
    }
  ],
  "a_suivre": true,
  "curseur_suivant": "MjAyNi0wOS0yNlQxMTozNzozNS44NzcwMDBafDAwZGJlMWYwLWUyNWEtNGQxYi1hMGRjLTAyYjFhMTk3NTE0NQ"
}

Personnes

Copropriétaires, propriétaires bailleurs, locataires et fournisseurs. Les rôles sont déduits des données (lots, mandats, baux actifs). L’IBAN n’est jamais renvoyé en entier : seuls ses quatre premiers et quatre derniers caractères le sont.

  • GET /personnes Liste
  • GET /personnes/{id} Une personne
  • POST /personnes Créer (voir Écriture)
  • PATCH /personnes/{id} Modifier (voir Écriture)
ParamètreValeursEffet
rolecoproprietaire | bailleur | locataire | fournisseurFiltre par rôle
emailadresseAdresse exacte, sans tenir compte de la casse
curl "https://gerelio.com/api/v1/personnes?role=coproprietaire&limite=1" \
  -H "Authorization: Bearer $GERELIO_CLE"
{
  "donnees": [
    {
      "id": "06c6bc6c-8885-436e-b1f2-db6e7da9f81b",
      "type": "physique",
      "civilite": "Mme",
      "nom": "Michel",
      "prenom": "Nathalie",
      "raison_sociale": null,
      "nom_affiche": "Mme Nathalie Michel",
      "email": "nathalie.michel1@exemple.fr",
      "telephone": "06 37 53 71 89",
      "adresse": "18 rue de la République",
      "code_postal": "69006",
      "ville": "Lyon",
      "siren": null,
      "iban_masque": null,
      "est_fournisseur": false,
      "metier": null,
      "notification_papier_demandee": false,
      "roles": [
        "coproprietaire"
      ],
      "cree_le": "2026-09-26T11:37:35.877+00:00"
    }
  ],
  "a_suivre": true,
  "curseur_suivant": "MjAyNi0wOS0yNlQxMTozNzozNS44NzcwMDBafDA2YzZiYzZjLTg4ODUtNDM2ZS1iMWYyLWRiNmU3ZGE5ZjgxYg"
}

Baux

Baux de la gestion locative, avec le bailleur (via le mandat de gestion) et l’état de la dernière signature électronique.

  • GET /baux Liste
  • GET /baux/{id} Un bail
ParamètreValeursEffet
statutactif | resilie
lot_idUUID
locataire_idUUID
curl "https://gerelio.com/api/v1/baux?statut=actif&limite=1" \
  -H "Authorization: Bearer $GERELIO_CLE"
{
  "donnees": [
    {
      "id": "04170fa2-f189-4919-848d-c9e8528a8717",
      "lot_id": "b5d5e3a4-ca66-45e6-a0bb-c67f093a2335",
      "immeuble_id": "ae41ac0e-8b82-4bcd-b09c-eb03ac98a0c4",
      "mandat_gestion_id": "08367097-6f75-4e68-9bef-169c5982cee3",
      "bailleur_id": "a8ee9d90-57e4-476e-ba76-5fce2650dbd7",
      "locataire_id": "dc25aa35-77ae-432a-8d05-757ee4fa5cbe",
      "type": "vide",
      "date_debut": "2024-04-24",
      "duree_mois": 36,
      "date_fin": null,
      "loyer_hc_cents": 94000,
      "provisions_charges_cents": 9000,
      "depot_garantie_cents": 94000,
      "irl_reference": "2024-T2",
      "revision_mois": 4,
      "statut": "actif",
      "signature": null,
      "cree_le": "2026-09-26T11:37:35.877+00:00"
    }
  ],
  "a_suivre": true,
  "curseur_suivant": "MjAyNi0wOS0yNlQxMTozNzozNS44NzcwMDBafDA0MTcwZmEyLWYxODktNDkxOS04NDhkLWM5ZTg1MjhhODcxNw"
}

Entités, écritures et balance

Chaque syndicat de copropriétaires et la gérance ont leur propre comptabilité (entité). Les écritures sont scellées : hash chaîne chaque écriture à la précédente.

  • GET /entites Entités comptables
  • GET /entites/{id} Une entité
  • GET /entites/{id}/balance Balance des comptes
  • GET /ecritures Écritures avec leurs lignes
  • GET /ecritures/{id} Une écriture
ParamètreValeursEffet
typesyndicat | gerance/entites
dateAAAA-MM-JJ/balance : arrêtée à cette date (incluse)
entite_idUUID/ecritures
journalAC | AP | BQ | OD | QT | AN/ecritures
du, auAAAA-MM-JJ/ecritures : dates d’écriture (incluses)
curl "https://gerelio.com/api/v1/entites/09939aab-731e-437d-ae0f-7348bfa4ed2e/balance?date=2026-06-30" \
  -H "Authorization: Bearer $GERELIO_CLE"
{
  "donnees": {
    "entite_id": "09939aab-731e-437d-ae0f-7348bfa4ed2e",
    "date": "2026-06-30",
    "comptes": [
      {
        "compte": "1031",
        "libelle": "Avances de trésorerie",
        "debit_cents": 0,
        "credit_cents": 1627000,
        "solde_cents": -1627000,
        "tiers": 0
      },
      {
        "compte": "105",
        "libelle": "Fonds de travaux",
        "debit_cents": 0,
        "credit_cents": 2440000,
        "solde_cents": -2440000,
        "tiers": 0
      },
      {
        "compte": "401",
        "libelle": "Fournisseurs — factures parvenues",
        "debit_cents": 2194620,
        "credit_cents": 2194620,
        "solde_cents": 0,
        "tiers": 7
      },
      {
        "compte": "4501",
        "libelle": "Copropriétaire — budget prévisionnel",
        "debit_cents": 1879000,
        "credit_cents": 2039751,
        "solde_cents": -160751,
        "tiers": 16
      }
    ],
    "total_debit_cents": 12436991,
    "total_credit_cents": 12436991
  }
}

Exemple : écritures

Journal des achats (AC) d’un syndicat, une écriture par page.

curl "https://gerelio.com/api/v1/ecritures?entite_id=09939aab-731e-437d-ae0f-7348bfa4ed2e&journal=AC&limite=1" \
  -H "Authorization: Bearer $GERELIO_CLE"
{
  "donnees": [
    {
      "id": "00df1e77-0b10-4601-a8a4-264b0cc6951f",
      "entite_id": "09939aab-731e-437d-ae0f-7348bfa4ed2e",
      "numero": 84,
      "journal": "AC",
      "date_ecriture": "2026-07-10",
      "libelle": "Maintenance ascenseur — trimestre 3 — ARS-2026-T3",
      "piece_ref": "ARS-2026-T3",
      "origine_type": "facture",
      "origine_id": "9b6a551f-323a-45da-ac22-965ec8edcdbb",
      "contrepasse_de": null,
      "hash": "f7b788e56bd7b1dee94eb9435d66825f75910479ba3a4abe6865126b0d8b8805",
      "hash_precedent": "95d1063ef7a24875d44f9ecf160915a7e45b765cd73dba667cfde848dd5caaa4",
      "lignes": [
        {
          "compte": "614",
          "libelle": null,
          "personne_id": null,
          "lot_id": null,
          "cle_id": "bced491a-02dd-4155-8d8a-bdb6022ed174",
          "debit_cents": 105000,
          "credit_cents": 0
        },
        {
          "compte": "401",
          "libelle": null,
          "personne_id": "ad4bdd53-d560-40c8-b1f3-37484395f406",
          "lot_id": null,
          "cle_id": null,
          "debit_cents": 0,
          "credit_cents": 105000
        }
      ],
      "cree_le": "2026-09-26T11:37:35.877+00:00"
    }
  ],
  "a_suivre": true,
  "curseur_suivant": "MjAyNi0wOS0yNlQxMTozNzozNS44NzcwMDBafDAwZGYxZTc3LTBiMTAtNDYwMS1hOGE0LTI2NGIwY2M2OTUxZg"
}

Appels de fonds

Appels de fonds émis, avec la part de chaque lot (budget et fonds de travaux). lien ouvre l’appel dans l’espace Gerelio (connexion requise).

  • GET /appels-de-fonds Liste
  • GET /appels-de-fonds/{id} Un appel
ParamètreValeursEffet
immeuble_idUUID
anneeAAAA
curl "https://gerelio.com/api/v1/appels-de-fonds?immeuble_id=119be282-fe81-4a6d-b6a1-32c3356495d9&limite=1" \
  -H "Authorization: Bearer $GERELIO_CLE"
{
  "donnees": [
    {
      "id": "4444237d-cb95-47d4-a23e-167ee3ca8f8b",
      "immeuble_id": "119be282-fe81-4a6d-b6a1-32c3356495d9",
      "type": "budget",
      "annee": 2026,
      "trimestre": 1,
      "libelle": "Appel de fonds Le Clos Saint-Martin — T1 2026",
      "date_echeance": "2026-01-01",
      "total_budget_cents": 380500,
      "total_fonds_travaux_cents": 40625,
      "total_cents": 421125,
      "emis": true,
      "ecriture_id": "8f6b86d0-ad62-48f2-9a1b-53db0d54b321",
      "lien": "https://gerelio.com/espace/documents/appel/4444237d-cb95-47d4-a23e-167ee3ca8f8b",
      "lignes": [
        {
          "lot_id": "e624ede2-d056-41d7-b352-c9abf01fcd76",
          "lot_numero": "B01",
          "personne_id": "f0ac096e-3c47-4014-b4d4-9ad5a8415877",
          "budget_cents": 39838,
          "fonds_travaux_cents": 4253,
          "total_cents": 44091
        },
        {
          "lot_id": "403284af-567f-4236-ab7b-3ebaa4ba88e7",
          "lot_numero": "B02",
          "personne_id": "baa41e84-2223-47a3-95dd-9928987f36d1",
          "budget_cents": 31155,
          "fonds_travaux_cents": 3326,
          "total_cents": 34481
        }
      ],
      "cree_le": "2026-09-26T11:37:35.877+00:00"
    }
  ],
  "a_suivre": true,
  "curseur_suivant": "MjAyNi0wOS0yNlQxMTozNzozNS44NzcwMDBafDQ0NDQyMzdkLWNiOTUtNDdkNC1hMjNlLTE2N2VlM2NhOGY4Yg"
}

Factures fournisseurs

Factures reçues, à valider, validées (comptabilisées), payées ou rejetées.

  • GET /factures Liste
  • GET /factures/{id} Une facture
  • POST /factures Enregistrer (voir Écriture)
ParamètreValeursEffet
statuta_valider | validee | payee | rejetee
entite_idUUID
fournisseur_idUUID
curl "https://gerelio.com/api/v1/factures?statut=validee&limite=1" \
  -H "Authorization: Bearer $GERELIO_CLE"
{
  "donnees": [
    {
      "id": "16beb596-7016-48be-8fce-1d5bfff9987b",
      "entite_id": "09939aab-731e-437d-ae0f-7348bfa4ed2e",
      "fournisseur_id": "e624740c-9adb-45c8-afde-f447f27a00cb",
      "fournisseur_nom": "Enerlyon Services",
      "numero": "E-2026-08-TIL",
      "date_facture": "2026-08-08",
      "date_echeance": "2026-09-07",
      "libelle": "Électricité parties communes",
      "montant_ttc_cents": 53680,
      "compte_charge": "602",
      "cle_id": "16065ea2-0e4e-469b-b0a1-4c6b681d4b0d",
      "lot_id": null,
      "source": "plateforme_agreee",
      "statut": "validee",
      "motif_rejet": null,
      "ecriture_id": "0ab7ec28-dba4-48e9-bd43-f66b55d25765",
      "ecriture_paiement_id": null,
      "cree_le": "2026-09-26T11:37:35.877+00:00"
    }
  ],
  "a_suivre": false,
  "curseur_suivant": null
}

Opérations bancaires

Opérations des relevés bancaires importés, et leur rapprochement.

  • GET /releves Liste
  • GET /releves/{id} Une opération
  • POST /releves Importer un relevé (voir Écriture)
ParamètreValeursEffet
entite_idUUID
statuta_rapprocher | rapproche | ignore
curl "https://gerelio.com/api/v1/releves?entite_id=09939aab-731e-437d-ae0f-7348bfa4ed2e&statut=a_rapprocher" \
  -H "Authorization: Bearer $GERELIO_CLE"

Assemblées générales

Assemblées, leurs résolutions et, une fois clôturées, le résultat de chaque vote (majorités des articles 24, 25, 25-1 et 26) et le lien du procès-verbal.

  • GET /assemblees Liste
  • GET /assemblees/{id} Une assemblée
ParamètreValeursEffet
immeuble_idUUID
statutpreparation | convoquee | tenue | pv_diffuse
curl "https://gerelio.com/api/v1/assemblees/2b584c43-b9ce-4b41-ba35-4d88ecf10def" \
  -H "Authorization: Bearer $GERELIO_CLE"
{
  "donnees": {
    "id": "2b584c43-b9ce-4b41-ba35-4d88ecf10def",
    "immeuble_id": "1d8969c0-c381-4a46-956a-b809cbad14bd",
    "type": "ordinaire",
    "date_ag": "2026-05-14T18:30:00+00:00",
    "lieu": "Salle paroissiale, 20 rue Duguesclin, Lyon 6e",
    "statut": "pv_diffuse",
    "convoquee_le": "2026-04-14",
    "tenue_le": "2026-05-14",
    "president_nom": "Mme Claire Moreau",
    "secretaire_nom": "Cabinet Delorme & Associés",
    "resolutions": [
      {
        "id": "04afc43a-c8e6-4d9c-b4e5-621e3a984a65",
        "ordre": 1,
        "titre": "Approbation des comptes de l'exercice 2025",
        "texte": "L'assemblée générale approuve les comptes de l'exercice 2025 en leur forme, teneur, imputation et répartition.",
        "majorite": "art24",
        "nature": "approbation_comptes",
        "resultat": {
          "regle": "Majorité des voix exprimées (art. 24)",
          "adoptee": true,
          "votants": 13,
          "voix_pour": 10650,
          "defaillants": 0,
          "voix_contre": 0,
          "membres_pour": 13,
          "membres_total": 16,
          "passerelle_25_1": false,
          "voix_abstention": 0,
          "voix_defaillantes": 0,
          "voix_total_syndicat": 12750
        }
      }
    ],
    "proces_verbal": {
      "diffuse": true,
      "document_id": "df6b3b6f-8715-46d1-abda-db15e05f99ec",
      "lien": "https://gerelio.com/espace/documents/pv/2b584c43-b9ce-4b41-ba35-4d88ecf10def"
    },
    "cree_le": "2026-09-26T11:37:35.877+00:00"
  }
}

Documents

Documents du cabinet : générés par Gerelio (appels de fonds, procès-verbaux, fiches synthétiques, convocations) ou déposés. lien ouvre le document dans l’espace Gerelio (connexion requise).

  • GET /documents Liste
  • GET /documents/{id} Un document
ParamètreValeursEffet
immeuble_idUUID
categoriecodepv_ag, compte_coproprietaire, fiche_synthetique…
generetrue | falseDocuments produits par Gerelio
curl "https://gerelio.com/api/v1/documents?genere=true&limite=1" \
  -H "Authorization: Bearer $GERELIO_CLE"
{
  "donnees": [
    {
      "id": "1254c658-2605-4413-b8e1-5ddc3944010d",
      "immeuble_id": "1d8969c0-c381-4a46-956a-b809cbad14bd",
      "lot_id": null,
      "personne_id": null,
      "categorie": "compte_coproprietaire",
      "titre": "Appel de fonds Résidence Les Tilleuls — T2 2026",
      "date_document": "2026-09-26",
      "genere": true,
      "source_type": "appel",
      "source_id": "03c278b9-ea29-4576-aae4-54f1adf99a84",
      "publie_extranet": true,
      "lien": "https://gerelio.com/espace/documents/appel/03c278b9-ea29-4576-aae4-54f1adf99a84",
      "cree_le": "2026-09-26T11:37:35.877+00:00"
    }
  ],
  "a_suivre": true,
  "curseur_suivant": "MjAyNi0wOS0yNlQxMTozNzozNS44NzcwMDBafDEyNTRjNjU4LTI2MDUtNDQxMy1iOGUxLTVkZGMzOTQ0MDEwZA"
}

Écriture

Portée lecture et écriture exigée. Corps en JSON avec Content-Type: application/json ; un champ non prévu est refusé (400) et nommé dans le message. Une création répond 201, une modification 200, avec l’objet tel que l’API le renvoie en lecture.

Créer une personne

POST /personnes. Seul nom est obligatoire. type : physique (par défaut) ou morale (avec raison_sociale) ; est_fournisseur et notification_papier_demandee sont des booléens. L’IBAN est accepté, jamais renvoyé en entier.

curl -X POST "https://gerelio.com/api/v1/personnes" \
  -H "Authorization: Bearer $GERELIO_CLE" \
  -H "Content-Type: application/json" \
  -d '{"type":"physique","civilite":"Mme","nom":"Martin","prenom":"Léa","email":"lea.martin@exemple.fr","telephone":"06 12 34 56 78","iban":"FR76 3000 6000 0112 3456 7890 189"}'
{
  "donnees": {
    "id": "3601516d-99a3-4b7c-ba4b-cbbaec0dd760",
    "type": "physique",
    "civilite": "Mme",
    "nom": "Martin",
    "prenom": "Léa",
    "raison_sociale": null,
    "nom_affiche": "Mme Léa Martin",
    "email": "lea.martin@exemple.fr",
    "telephone": "06 12 34 56 78",
    "adresse": null,
    "code_postal": null,
    "ville": null,
    "siren": null,
    "iban_masque": "FR76 **** 0189",
    "est_fournisseur": false,
    "metier": null,
    "notification_papier_demandee": false,
    "roles": [],
    "cree_le": "2026-09-26T11:37:36.986+00:00"
  }
}

Modifier une personne

PATCH /personnes/{id}. Seuls les champs présents sont modifiés (type, siren et est_fournisseur ne se modifient pas par l’API). Pour retrouver une personne à partir de votre outil : GET /personnes?email=….

curl -X PATCH "https://gerelio.com/api/v1/personnes/3601516d-99a3-4b7c-ba4b-cbbaec0dd760" \
  -H "Authorization: Bearer $GERELIO_CLE" \
  -H "Content-Type: application/json" \
  -d '{"telephone":"06 98 76 54 32"}'

Enregistrer une facture fournisseur

POST /factures. Obligatoires : entite_id (syndicat ou gérance), fournisseur_id, numero, date_facture, libelle, montant_ttc_cents. Facultatifs : date_echeance, lot_id (gérance), source (manuel, lecture_auto ou plateforme_agreee). La facture arrive à valider : son imputation et sa validation se font dans Gerelio (événement facture.validee). Même fournisseur et même numéro : 409.

curl -X POST "https://gerelio.com/api/v1/factures" \
  -H "Authorization: Bearer $GERELIO_CLE" \
  -H "Content-Type: application/json" \
  -d '{"entite_id":"09939aab-731e-437d-ae0f-7348bfa4ed2e","fournisseur_id":"ad4bdd53-d560-40c8-b1f3-37484395f406","numero":"F-2026-0412","date_facture":"2026-09-15","date_echeance":"2026-10-15","libelle":"Entretien des espaces verts, septembre","montant_ttc_cents":48000}'
{
  "donnees": {
    "id": "b72a63fe-5159-4264-aae6-cac49cfa34dd",
    "entite_id": "09939aab-731e-437d-ae0f-7348bfa4ed2e",
    "fournisseur_id": "ad4bdd53-d560-40c8-b1f3-37484395f406",
    "fournisseur_nom": "Ascenseurs Rhone Services",
    "numero": "F-2026-0412",
    "date_facture": "2026-09-15",
    "date_echeance": "2026-10-15",
    "libelle": "Entretien des espaces verts, septembre",
    "montant_ttc_cents": 48000,
    "compte_charge": null,
    "cle_id": null,
    "lot_id": null,
    "source": "manuel",
    "statut": "a_valider",
    "motif_rejet": null,
    "ecriture_id": null,
    "ecriture_paiement_id": null,
    "cree_le": "2026-09-26T11:37:36.997+00:00"
  }
}

Importer un relevé bancaire

POST /releves. entite_id et operations (1 à 1 000) : date_operation, libelle, montant_cents (négatif pour un débit, jamais nul), reference_banque facultative. Une opération déjà présente (même date, montant et libellé) est comptée en doublon et ignorée : vous pouvez renvoyer un relevé sans risque. Les opérations importées se rapprochent ensuite dans Gerelio (événement paiement.recu).

curl -X POST "https://gerelio.com/api/v1/releves" \
  -H "Authorization: Bearer $GERELIO_CLE" \
  -H "Content-Type: application/json" \
  -d '{"entite_id":"09939aab-731e-437d-ae0f-7348bfa4ed2e","operations":[{"date_operation":"2026-09-22","libelle":"VIR SEPA MARTIN LEA APPEL T4","montant_cents":61250,"reference_banque":"VIR20260922-8841"},{"date_operation":"2026-09-23","libelle":"PRLV SEPA EDF COLLECTIVITES","montant_cents":-18430}]}'
{
  "donnees": {
    "entite_id": "09939aab-731e-437d-ae0f-7348bfa4ed2e",
    "importees": 2,
    "doublons": 0
  }
}

Webhooks

Dans Paramètres → API, un dirigeant ajoute une adresse de réception en https:// et choisit les événements. Un secret propre à cet abonnement (whsec_…) s’affiche une seule fois : il sert à vérifier la signature. Les adresses locales ou privées sont refusées, à l’enregistrement puis à chaque envoi après résolution DNS.

ÉvénementQuand
paiement.recu
Paiement reçu
Une opération bancaire créditrice est rapprochée sur le compte d’un copropriétaire (450) ou d’un locataire (411). donnees : operation, payeur, role, compte, montant_cents, date_operation, ecriture_id.
ag.close
Assemblée générale clôturée
Résultats des votes arrêtés et procès-verbal établi. donnees : l’assemblée (comme GET /assemblees/{id}).
facture.validee
Facture validée
Facture fournisseur validée et comptabilisée. donnees : la facture (comme GET /factures/{id}).
appel_de_fonds.emis
Appel de fonds émis
Appel généré et comptabilisé sur les comptes des copropriétaires. donnees : l’appel et ses lignes par lot.
bail.signe
Bail signé
Tous les signataires ont signé électroniquement le bail. donnees : bail et signature (signataires, date).
test.ping
Événement de test
Envoyé uniquement par le bouton « Envoyer un événement de test ».

Format

Chaque événement est envoyé en POST, corps JSON { id, type, cree_le, cabinet_id, donnees }, avec les en-têtes Gerelio-Signature, Gerelio-Evenement (le type), Gerelio-Livraison et Gerelio-Tentative. Exemple réel, paiement.recu :

{
  "id": "39334be2-41c5-426a-91a4-c6e47338e3a4",
  "type": "paiement.recu",
  "cree_le": "2026-09-26T11:37:37.015+00:00",
  "cabinet_id": "49a1fc17-2fca-47ea-87f1-bb1d2c618e45",
  "donnees": {
    "operation": {
      "id": "b9655027-7fba-4368-94c4-d2ff5fd7d3d0",
      "entite_id": "09939aab-731e-437d-ae0f-7348bfa4ed2e",
      "date_operation": "2026-09-24",
      "libelle": "VIR SEPA APPEL T4 LOT 3",
      "montant_cents": 61250,
      "reference_banque": "VIR20260924-1182",
      "statut": "rapproche",
      "personne_id": "06c6bc6c-8885-436e-b1f2-db6e7da9f81b",
      "facture_id": null,
      "ecriture_id": "ae2a6735-09c2-4222-a058-dbd54c457be2",
      "cree_le": "2026-09-26T11:37:37.014+00:00"
    },
    "payeur": {
      "email": "nathalie.michel1@exemple.fr",
      "nom_affiche": "Mme Nathalie Michel",
      "personne_id": "06c6bc6c-8885-436e-b1f2-db6e7da9f81b"
    },
    "role": "coproprietaire",
    "compte": "4501",
    "entite_id": "09939aab-731e-437d-ae0f-7348bfa4ed2e",
    "montant_cents": 61250,
    "date_operation": "2026-09-24",
    "ecriture_id": "ae2a6735-09c2-4222-a058-dbd54c457be2"
  }
}
Exemple facture.validee
{
  "id": "7aad7480-1429-4127-ad17-fed5c8d11922",
  "type": "facture.validee",
  "cree_le": "2026-09-26T11:37:37.01+00:00",
  "cabinet_id": "49a1fc17-2fca-47ea-87f1-bb1d2c618e45",
  "donnees": {
    "id": "28cfb4f0-6cfc-4ffd-a421-b36f198c653f",
    "entite_id": "09939aab-731e-437d-ae0f-7348bfa4ed2e",
    "fournisseur_id": "781ea3e7-e2da-40e0-80ce-e268ddda19d4",
    "fournisseur_nom": "Net Lyon Proprete",
    "numero": "NLP-2026-027",
    "date_facture": "2026-09-22",
    "date_echeance": "2026-10-22",
    "libelle": "Nettoyage parties communes septembre",
    "montant_ttc_cents": 65000,
    "compte_charge": "615",
    "cle_id": "16065ea2-0e4e-469b-b0a1-4c6b681d4b0d",
    "lot_id": null,
    "source": "plateforme_agreee",
    "statut": "validee",
    "motif_rejet": null,
    "ecriture_id": "4c5f80ed-35cd-46fa-ba91-756698a65686",
    "ecriture_paiement_id": null,
    "cree_le": "2026-09-26T11:37:35.877+00:00"
  }
}

Livraison et nouvelles tentatives

  • Répondez par un statut 2xx en moins de 10 secondes ; traitez ensuite l’événement de votre côté. Les redirections ne sont pas suivies.
  • Sinon, Gerelio réessaie avec un délai croissant : 1 min, 5 min, 30 min, 2 h, 6 h, 12 h puis 24 h, soit 8 tentatives au plus.
  • Après 15 échecs consécutifs, l’abonnement est désactivé automatiquement (visible dans Paramètres → API et au journal d’audit) ; le réactiver remet le compteur à zéro.
  • Les événements partent dès l’action qui les produit (dans l’application ou par l’API) ; un passage planifié chaque jour reprend ceux qui restent. Le journal des livraisons, conservé 30 jours, montre chaque tentative, son statut HTTP et le début de votre réponse. Boutons Envoyer un événement de test, Envoyer maintenant et Renvoyer.
  • Un même événement peut arriver deux fois (renvoi, réseau) : utilisez id pour ignorer un doublon. L’ordre d’arrivée n’est pas garanti ; fiez-vous à cree_le.

Vérifier la signature

L’en-tête Gerelio-Signature: t=1790241120,v1=5f3c… contient l’horodatage Unix de l’envoi (t) et l’HMAC-SHA256, en hexadécimal, de la chaîne t.corps (l’horodatage, un point, puis le corps brut reçu) calculé avec le secret de l’abonnement. Recalculez-le, comparez à temps constant et refusez un horodatage de plus de 5 minutes.

Node.js

import { createHmac, timingSafeEqual } from 'node:crypto'
import express from 'express'

const app = express()

// Le corps doit être lu brut : la signature porte sur les octets reçus, pas sur un objet re-sérialisé.
app.post('/webhooks/gerelio', express.raw({ type: 'application/json' }), (req, res) => {
  const corps = req.body.toString('utf8')
  const entete = req.get('Gerelio-Signature') ?? ''
  const { t, v1 } = Object.fromEntries(entete.split(',').map((p) => p.trim().split('=')))
  const attendu = createHmac('sha256', process.env.GERELIO_WEBHOOK_SECRET)
    .update(`${t}.${corps}`)
    .digest('hex')
  const valide = typeof v1 === 'string' && v1.length === attendu.length &&
    timingSafeEqual(Buffer.from(v1), Buffer.from(attendu))
  // Refuser aussi un horodatage de plus de 5 minutes (rejeu d'un ancien message).
  if (!valide || Math.abs(Date.now() / 1000 - Number(t)) > 300) {
    return res.status(400).send('Signature invalide')
  }
  const evenement = JSON.parse(corps)
  // Une livraison peut être renvoyée : ignorez un evenement.id déjà traité.
  console.log(evenement.type, evenement.donnees)
  res.sendStatus(204)
})

app.listen(3000)

PHP

<?php
// Corps brut, tel que reçu : la signature porte sur ces octets.
$corps = file_get_contents('php://input');
$entete = $_SERVER['HTTP_GERELIO_SIGNATURE'] ?? '';

$parties = [];
foreach (explode(',', $entete) as $partie) {
    [$cle, $valeur] = array_pad(explode('=', trim($partie), 2), 2, '');
    $parties[$cle] = $valeur;
}
$t = (int) ($parties['t'] ?? 0);
$attendu = hash_hmac('sha256', $t . '.' . $corps, getenv('GERELIO_WEBHOOK_SECRET'));

// Comparaison à temps constant, et horodatage de moins de 5 minutes.
if (!hash_equals($attendu, $parties['v1'] ?? '') || abs(time() - $t) > 300) {
    http_response_code(400);
    exit('Signature invalide');
}

$evenement = json_decode($corps, true);
// Une livraison peut être renvoyée : ignorez un $evenement['id'] déjà traité.
error_log($evenement['type']);
http_response_code(204);

Description OpenAPI

La description complète de l’API (routes, paramètres, schémas, webhooks) est publiée au format OpenAPI 3.1 : https://gerelio.com/api/v1/openapi.json. Importez-la dans Postman, Insomnia ou un générateur de client. L’API est versionnée : une évolution incompatible ouvrirait /api/v2, sans couper /api/v1.

Une question, un besoin d’une ressource absente ? Écrivez-nous.

Ouvrez le cabinet de démonstration. Maintenant.

Immeubles, copropriétaires, baux, écritures et AG déjà en place : vous testez un vrai parcours en quelques minutes, sans créer de compte ni donner d'adresse e-mail.

Essayer — sans inscription Tarifs