← Billbook に戻る

リモート記帳 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_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 — 分類一覧の取得

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)
  • 501SUPABASE_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"} と設定します。titleamount をショートカット入力または「毎回確認」の変数に置き換えればOKです。

このドキュメントは簡易リファレンスです。実際の動作はバックエンドコードが正です。