AI 証憑仕訳 API

領収書・請求書等の画像を AI で解析し、仕訳候補を生成する API です。下書きとして保存され、確認後に仕訳として確定できます。

すべてのエンドポイントに ai:analyze スコープが必要です。サーバー側で AI API 設定(OpenAI / Gemini / Claude)が完了している必要があります。


画像解析

POST /api/v1/ai/analyze
スコープ: ai:analyze | レート制限: 30 リクエスト / 時間

画像を AI で解析し、仕訳候補を含む下書きを作成します。

リクエスト

Content-Type: multipart/form-data

フィールド 必須 説明
image file Yes 画像ファイル(JPEG / PNG / WebP / GIF、上限 10MB)
comment string No メモ(最大 500 文字)。「会社の懇親会」等のヒントで解析精度が向上
notify string No "1" を指定すると設定済みの Webhook に通知を送信

レスポンス

201 Created

{
  "ok": true,
  "draft_id": 10,
  "suggestions": [
    {
      "title": "コンビニ購入",
      "date": "2026-02-15",
      "entry_description": "セブンイレブン 食品購入",
      "lines": [
        {
          "account_id": 12,
          "account_name": "食費",
          "debit_amount": 850,
          "credit_amount": 0,
          "description": ""
        },
        {
          "account_id": 1,
          "account_name": "現金",
          "debit_amount": 0,
          "credit_amount": 850,
          "description": ""
        }
      ]
    }
  ]
}
フィールド 説明
draft_id integer 作成された下書きの ID
suggestions array 仕訳候補のリスト(通常 1〜3 件)

suggestions の各候補

フィールド 説明
title string 候補のタイトル
date string 推定された日付(YYYY-MM-DD
entry_description string 推定された摘要
lines array 仕訳明細行

lines の各行

フィールド 説明
account_id integer 勘定科目 ID
account_name string 勘定科目名
debit_amount integer 借方金額
credit_amount integer 貸方金額
description string 行の摘要

エラー

ステータス メッセージ 原因
400 AI API設定が未登録です。 サーバーで AI 設定が未完了
400 image は必須です。 画像ファイル未添付
400 ファイルサイズが大きすぎます(上限10MB)。 10MB 超過
400 対応していないファイル形式です。... 非対応の MIME タイプ
429 レート制限超過

仕訳として確定する

下書きの候補を仕訳として確定するには、仕訳起票 APIdraft_id パラメータを使います。

POST /api/v1/journals
{
  "date": "2026-02-15",
  "description": "セブンイレブン 食品購入",
  "lines": [
    { "account_id": 12, "debit": 850 },
    { "account_id": 1, "credit": 850 }
  ],
  "draft_id": 10
}

draft_id を指定すると、仕訳起票と同時に下書きの status が "done" に変わります。


下書き一覧

GET /api/v1/ai/drafts
スコープ: ai:analyze

下書きの一覧を取得します。作成日時の降順でソートされます。

クエリパラメータ

パラメータ デフォルト 説明
status string "analyzed" フィルタ: "analyzed"(未確定)/ "done"(確定済)/ "all"
page integer 1 ページ番号
per_page integer 50 1ページあたりの件数(上限: 100)

レスポンス

200 OK

{
  "ok": true,
  "drafts": [
    {
      "id": 10,
      "status": "analyzed",
      "comment": "コンビニ",
      "created_at": "2026-02-15T10:30:00",
      "summary": {
        "title": "コンビニ購入",
        "date": "2026-02-15",
        "description": "セブンイレブン 食品購入",
        "amount": 850,
        "suggestion_count": 1
      }
    }
  ],
  "total": 5,
  "page": 1,
  "per_page": 50
}

各下書き

フィールド 説明
id integer 下書き ID
status string "analyzed"(未確定)/ "done"(確定済)
comment string メモ
created_at string 作成日時(ISO 8601)
summary object | null 最初の候補から生成されたサマリー

summary

フィールド 説明
title string 候補のタイトル
date string 推定日付
description string 推定摘要
amount integer 借方合計金額
suggestion_count integer 候補数

下書き詳細

GET /api/v1/ai/drafts/:id
スコープ: ai:analyze

下書きの詳細を取得します。候補データ(suggestions)を含みます。

パスパラメータ

パラメータ 説明
id integer 下書き ID

レスポンス

200 OK

{
  "ok": true,
  "draft": {
    "id": 10,
    "status": "analyzed",
    "comment": "コンビニ",
    "created_at": "2026-02-15T10:30:00",
    "summary": { ... },
    "suggestions": [
      {
        "title": "コンビニ購入",
        "date": "2026-02-15",
        "entry_description": "セブンイレブン 食品購入",
        "lines": [...]
      }
    ]
  }
}

suggestions の構造は画像解析のレスポンスと同じです。

エラー

ステータス メッセージ
404 下書きが見つかりません。

下書き削除

DELETE /api/v1/ai/drafts/:id
スコープ: ai:analyze

下書きを削除します。

パスパラメータ

パラメータ 説明
id integer 下書き ID

レスポンス

200 OK

{
  "ok": true
}

エラー

ステータス メッセージ
404 下書きが見つかりません。