リモート記帳 API
最終更新:2026 年 5 月 10 日
個人 API トークンを使って、cURL、iOS ショートカット、自動化スクリプトからリモート記帳できます。トークンは書き込み専用で、取引の追加と分類・タグ一覧の取得は可能ですが、既存の取引データを読み取ったり削除したりすることはできません。
1. トークンを取得する
admin としてログインし、設定 → 🔑 リモート記帳 API を開いて「トークンを生成」をクリックします。
プレーンテキストのトークンは一度しか表示されません。すぐにコピーして保存してください。サーバーは SHA-256 ハッシュのみを保存するため、紛失した場合は再生成(旧トークンは無効化)するしかありません。
トークン形式:bb_<userId>_<secret>。すべてのリクエストで Authorization: Bearer <token> として送信してください。
2. POST /api/ingest — 取引を 1 件追加
リクエストボディは以下のフィールドを持つ 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 — 分類一覧の取得
admin の分類名一覧をダッシュボードのドロップダウン順で返します。レスポンスは名前文字列のみで、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— メソッド未対応(例:/api/ingestへの GET)501—SUPABASE_SERVICE_ROLE_KEYが未設定500— その他の内部エラー
6. セキュリティと制限
設計上、呼び出し元の組織にしか書き込めず、他組織へのなりすましや既存データの読み取りは不可能です:
user_idは常にトークン所有者本人で、偽装不可org_idは常に所有者の組織で、組織間書き込みは不可- トークンは 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 をショートカット入力または「毎回確認」の変数に置き換えればOKです。
このドキュメントは簡易リファレンスです。実際の動作はバックエンドコードが正です。