Historique, annuler et rétablir dans l'API
vokse tient un registre des changements par foyer : une ligne par changement atomique avec la charge exacte pour l’inverser, son auteur et l’instant. L’API expose les lignes produites par une écriture, liste l’historique avec ses auteurs et inverse tout changement enregistré, précisément, depuis n’importe quel client.
L’en-tête X-Vokse-History-Events
Toute écriture réussie (DELETE 204 compris) renvoie les ids des lignes d’historique produites, séparés par des virgules. Une action groupée n’expose que l’id de son groupe. Conservez-les pour proposer Annuler à vos utilisateurs ; les rejeux idempotents ne portent pas l’en-tête, la première réponse l’a déjà fait.
PATCH /households/current/budgets/2026-08/categories/01J8… HTTP/1.1Authorization: Bearer vokse_sk_…Idempotency-Key: 3f1c…{"assignedCents":"10000"}HTTP/1.1 200 OKX-Vokse-History-Events: 01M0G0W2879NYKEG8CY3RH42XNLire l’historique
GET /households/{id}/history renvoie les changements du plus récent au plus ancien, paginés par curseur. Filtrez par membre (userId), famille (budget, transaction, category…), type (budget.assign, transaction.update…), fenêtre temporelle, groupe (ses membres) ou ids explicites. Les inversions sont des changements comme les autres et sont listées sauf avec includeReversals=false.
curl "https://api.vokse.ai/households/current/history?family=budget&from=2026-07-17T00:00:00Z&limit=50" \ -H "Authorization: Bearer vokse_sk_…"Annuler et rétablir
POST /history/{eventId}/undo applique l’inverse exact d’un changement via la même logique métier que l’écriture d’origine, enregistre l’inversion comme nouvelle ligne d’historique et marque le changement annulé. POST /history/{eventId}/redo inverse cette inversion. Les deux exigent une Idempotency-Key et renvoient l’inversion, la cible mise à jour et ce qui a été touché.
curl -X POST https://api.vokse.ai/households/current/history/01M0G0W2879NYKEG8CY3RH42XN/undo \ -H "Authorization: Bearer vokse_sk_…" \ -H "Idempotency-Key: 7c2f9b1e-4a8d-4e3a-9c1b-2f6e8d0a1b3c"- Propriétaire ou éditeur uniquement ; un changement réservé au propriétaire (réinitialisation d’un mois, suppressions) exige un propriétaire pour l’inverser.
- Une clé API a besoin de write:history ET du scope d’écriture des données inversées (write:budgets pour le budget, write:transactions pour une transaction, …).
- L’inversion est refusée avec 409 HISTORY_STALE si les données ne correspondent plus à l’état enregistré ; rien n’est modifié.
- Deux clients en course pour la même annulation : un seul gagne, l’autre reçoit 409 HISTORY_ALREADY_UNDONE.
- Les refus métier passent tels quels, p. ex. INSUFFICIENT_CATEGORY_FUNDS quand remettre l’argent n’est plus possible.
- Les changements enregistrés avec undoable=false (clôture ou rapprochement d’un compte) sont listés pour revue mais ne s’inversent pas.
Codes d’erreur
- HISTORY_STALE: l’entité a changé depuis ; voir details.reason.
- HISTORY_ALREADY_UNDONE: un autre client l’a inversé en premier.
- HISTORY_NOT_UNDONE: rétablir demandé sur un changement en vigueur.
- HISTORY_NOT_UNDOABLE: enregistré pour revue seulement.
- HISTORY_PARTIAL: une inversion de groupe a appliqué certains membres et refusé d’autres ; voir partial.failed.