← Назад до Billbook

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_income
  • category (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_KEY
  • 500 — інша внутрішня помилка

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 до вводу Швидкої команди або змінних «Запитувати щоразу».

Цей документ — швидкий довідник; реальну поведінку визначає код бекенду.