← Назад к 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 — список категорий

Возвращает имена категорий админа в порядке выпадающего меню панели. В ответе только имена — без id, user id и данных транзакций.

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 к вводу Команды или переменным «Спрашивать каждый раз».

Этот документ — быстрая справка; реальное поведение определяется кодом бэкенда.