← Retour à Billbook

API de Comptabilité Distante

Dernière mise à jour : 10 mai 2026

Enregistrez des écritures depuis cURL, les Raccourcis iOS ou des scripts d'automatisation à l'aide d'un token API personnel. Le token est en écriture seule : il peut insérer des transactions et lire les listes de catégories / tags, mais ne peut ni lire ni supprimer aucune donnée de transaction.

1. Obtenir un token

Connectez-vous en tant qu'admin, ouvrez Paramètres → 🔑 API de Comptabilité Distante et cliquez sur « Générer un token ».

Le token en clair n'est affiché qu'une seule fois — copiez-le immédiatement. Le serveur ne stocke que son hachage SHA-256ㅋ ; en cas de perte, vous ne pouvez que le régénérer (ce qui invalide l'ancien).

Format du token : bb_<userId>_<secret>. Envoyez-le à chaque requête comme Authorization: Bearer <token>.

2. POST /api/ingest — insérer une transaction

Le corps de la requête est un objet JSON avec les champs suivants :

  • title (string, obligatoire) — nom de la transaction
  • amount (number, obligatoire) — doit être positif
  • type (string, facultatif, par défaut expense) — l'un de expense / income / prepaid_expense / pending_income
  • category (string, facultatif) — nom de la catégorie
  • note (string, facultatif) — note libre
  • created_at (string, facultatif) — ISO 8601 ; par défaut maintenant
curl -X POST https://billbook.me/api/ingest \
  -H "Authorization: Bearer bb_<userId>_<secret>" \
  -H "Content-Type: application/json" \
  -d '{"title":"Coffee","amount":120,"type":"expense","category":"Food"}'

# response: 201
{ "id": "...", "created_at": "..." }

3. GET /api/ingest/categories — lister les catégories

Renvoie les noms de catégorie de l'admin dans l'ordre du menu déroulant du tableau de bord. La réponse ne contient que les noms — pas d'ids, user ids ou données de transaction.

curl https://billbook.me/api/ingest/categories \
  -H "Authorization: Bearer bb_<userId>_<secret>"

# response: 200
{ "categories": ["Food", "Rent", "..."] }

4. GET /api/ingest/tags — tags récemment utilisés

Renvoie les préfixes de tag les plus récemment mis à jour (les marqueurs #XXX intégrés aux titres). 20 par défaut ; utilisez ?limit= pour modifier (max 100).

Renvoie un tableau vide au lieu d'une erreur si la table tag_prefixes n'existe pas encore.

curl "https://billbook.me/api/ingest/tags?limit=20" \
  -H "Authorization: Bearer bb_<userId>_<secret>"

# response: 200
{ "tags": ["#management-fee", "#travel", "..."] }

5. Codes d'erreur

Toutes les erreurs sont en JSON : { "error": "message" }.

  • 401 — autorisation manquante, token mal formé, révoqué ou non concordant
  • 402 — abonnement expiré ; renouvellement requis pour écrire
  • 405 — méthode non supportée (par ex. GET sur /api/ingest)
  • 501SUPABASE_SERVICE_ROLE_KEY manquant côté serveur
  • 500 — autre erreur interne

6. Sécurité et limites

Par conception, le token ne peut écrire que dans sa propre organisation — il ne peut pas usurper d'autres orgs ni lire des données existantes :

  • user_id est toujours le propriétaire du token ; impossible à falsifier
  • org_id est toujours l'org du propriétaire ; les écritures inter-orgs sont impossibles
  • Les tokens ne sont émis qu'au rôle admin (manager / staff reçoivent 403)
  • Les réponses ne révèlent jamais d'autres lignes — seul { id, created_at } est renvoyé
  • La révocation est immédiate ; régénérez à tout moment depuis les Paramètres

7. Exemple de Raccourci iOS

Ajoutez une action « Obtenir le contenu d'une URL », URL https://billbook.me/api/ingest, méthode POST, en-têtes Authorization: Bearer bb_... et Content-Type: application/json, et corps de la requête en JSON : {"title":"Café","amount":120,"type":"expense"}. Liez title et amount à l'entrée du Raccourci ou aux variables « Demander à chaque fois ».

Ce document est une référence rapide ; le code du backend fait foi pour le comportement réel.