API віддаленого обліку
Останнє оновлення: 10 травня 2026 р.
Записуйте операції з cURL, Швидких команд iOS або скриптів автоматизації за допомогою персонального токена API. Токен лише для запису — він може додавати транзакції та читати списки категорій / тегів, але не може читати чи видаляти жодні дані транзакцій.
1. Отримати токен
Увійдіть як admin, відкрийте Налаштування → 🔑 API віддаленого обліку і натисніть «Згенерувати токен».
Токен у відкритому вигляді показується лише один раз — скопіюйте його негайно. Сервер зберігає лише його SHA-256-хеш, тож втрачений токен можна замінити тільки ротацією (яка анулює старий).
Формат токена: bb_<userId>_<secret>. Надсилайте його в кожному запиті як Authorization: Bearer <token>.
2. POST /api/ingest — вставити одну транзакцію
Тіло запиту — JSON-обʼєкт із такими полями:
title(string, обовʼязково) — назва транзакціїamount(number, обовʼязково) — має бути додатнимtype(string, необовʼязково, за замовчуваннямexpense) — одне зexpense/income/prepaid_expense/pending_incomecategory(string, необовʼязково) — назва категоріїnote(string, необовʼязково) — довільна нотаткаcreated_at(string, необовʼязково) — ISO 8601; за замовчуванням зараз
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 — список категорій
Повертає назви категорій адміна в порядку випадного меню панелі. Відповідь містить лише назви — без ids, user ids чи даних транзакцій.
curl https://billbook.me/api/ingest/categories \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "categories": ["Food", "Rent", "..."] }4. GET /api/ingest/tags — нещодавно використані теги
Повертає найновіше оновлені префікси тегів (маркери #XXX, вбудовані в заголовки). За замовчуванням 20; передайте ?limit=, щоб змінити (макс. 100).
Повертає порожній масив замість помилки, якщо таблиця tag_prefixes ще не існує.
curl "https://billbook.me/api/ingest/tags?limit=20" \
-H "Authorization: Bearer bb_<userId>_<secret>"
# response: 200
{ "tags": ["#management-fee", "#travel", "..."] }5. Коди помилок
Усі помилки у форматі JSON: { "error": "повідомлення" }.
401— відсутня авторизація, хибний формат токена, відкликаний або не збігається402— підписка закінчилася; для запису потрібне поновлення405— метод не підтримується (напр. GET на/api/ingest)501— на сервері відсутнійSUPABASE_SERVICE_ROLE_KEY500— інша внутрішня помилка
6. Безпека та обмеження
За задумом токен може писати лише до власної організації — він не може видавати себе за інші orgs чи читати наявні дані:
user_idзавжди — власник токена; підробити неможливоorg_idзавжди — org власника; записи між orgs неможливі- Токени видаються лише ролі admin (manager / staff отримують 403)
- Відповіді ніколи не розкривають інші рядки — повертається лише
{ id, created_at } - Відкликання миттєве; перевипускайте будь-коли з Налаштувань
7. Приклад Швидкої команди iOS
Додайте дію «Отримати вміст URL», URL https://billbook.me/api/ingest, метод POST, заголовки Authorization: Bearer bb_... та Content-Type: application/json, тіло запиту як JSON: {"title":"Кава","amount":120,"type":"expense"}. Привʼяжіть title та amount до вводу Швидкої команди або змінних «Запитувати щоразу».
Цей документ — швидкий довідник; реальну поведінку визначає код бекенду.