おはようございます。まさきんです。
個人で小さく続けている副業があります。経費の記帳自体は会計SaaSでできますが、「このカード利用が何の経費だったか」を思い出す作業が地味に手間でした。
そこで、カード明細とメールの領収書をAIに突き合わせてもらい、経費の分類まで自動化する仕組みを作りました。今回はAPIの呼び出し方や、実際にハマった落とし穴まで含めて紹介します。
きっかけは「未仕訳のまま積み上がる」こと
会計SaaSにカードを連携させておくと、利用明細は自動的に取り込まれます。ただ、「これが何の支払いだったか」までは分かりません。結局、後から記憶を頼りに仕訳することになります。
記憶はどんどん薄れます。なので、思い出す作業自体をAIに任せることにしました。
仕組みの流れ
やっていることは次の4段階です。
- 会計SaaSのAPIから、まだ仕訳の終わっていないカード利用明細を取得する
- 同じ金額・近い日付の注文確認メールや領収書メールを検索する
- 両者を突き合わせ、内容を特定する
- 特定できた内容にもとづいて、経費の種類を分類し、会計SaaSに取引として登録する
ポイントは、「明細だけ」でも「メールだけ」でもなく、両方を突き合わせて初めて内容が特定できることです。
未処理の明細を取得する
会計SaaSのAPIで明細を取得すると、各明細に処理状態を示すフラグが付いています。未登録の明細だけを対象にするには、このフラグで絞り込みます。
GET /api/1/wallet_txns
query: { company_id, start_date, end_date, limit: 100 }
返ってきた明細のうち、「未登録」を示すステータスかつ未消込金額が0より大きいものだけが処理対象です。登録済みや無視扱いに設定した明細は対象から除外します。期間はページングされることが多いので、月をまたぐ取得漏れが起きないよう、複数の期間に分けて確認しています。
メール検索の工夫
メール本文をそのままAIに読み込ませると、情報量が多くトークンの上限に達してしまうことがあります。なので、事前に条件を絞ってから中身を渡す工夫をしています。
まず、注文確認メールや領収書メールの送信元アドレスで期間検索をかけます。
search_threads query: "from:[email protected] after:2026/09/01 before:2026/09/30"
該当するメールが見つかっても、本文をまるごとAIに渡すとトークン上限に引っかかることがあります。その場合は、メール本文を保存したファイルに対してキーワード検索をかけ、金額や商品名が書かれている行だけを抜き出します。
# 保存済みのメールファイルから、金額と日付が近いものだけを絞り込む例
grep -l "3,980円" ./mail_archive/*.eml | xargs grep -l "2026-09"
金額と日付という2つの手がかりで絞り込むと、候補は数件程度まで減ります。そこまで絞ってから、はじめて該当箇所だけをAIに渡して照合させています。件名や冒頭のスニペットだけで済むメールも多いので、必要な範囲だけを取得するのがコツです。
経費に仕分ける支出には、通信費のような固定費も混ざります。仕事でも使うスマホ代は、按分に悩みやすい代表格です。そう考えると、プランを見直すのも一つの手かもしれません。
分類のルール
内容が特定できたら、次の3種類に分類しています。
| 分類 | 内容 | 扱い |
|---|---|---|
| 副業の直接経費 | 副業に直接関係する消耗品・サービス | 事業按分の注記付きで経費計上 |
| 参考図書・資料費 | 業務理解のための書籍など | 一般的な資料費として計上 |
| 個人的な支出 | 副業と無関係な私的な購入 | 経費から除外(事業主貸として処理) |
分類に迷うものは、無理に経費側に寄せないようにしています。判断に自信が持てない支出は、いったん個人的な支出として扱い、あとで見直す対象としてフラグを立てています。
経費として登録する
分類が決まったら、会計SaaSのAPIで取引として登録します。
POST /api/1/deals
body: {
company_id,
issue_date: "2026-09-15",
type: "expense",
details: [{
account_item_id: <経費科目のID>,
amount: <金額>,
description: "◯◯ 消耗品(事業按分の注記)"
}],
payments: [{
amount: <金額>, date: "2026-09-15",
from_walletable_type: "credit_card", from_walletable_id: <カードのID>
}]
}
ここで一つ注意点があります。この登録処理は、会計SaaS内部で「取引を新規作成する」操作であって、もともとの未処理明細と自動的に紐付く(消込される)わけではありません。取引を登録しただけでは、明細のステータスは未処理のままです。
なので、登録が終わったら必ず会計SaaSの画面上で、明細と今回作成した取引を手動で紐付ける操作をしています。ここを飛ばすと、同じ支出が二重に計上されてしまうので気をつけています。
「間違って別カテゴリに入っている経費」も定期的に洗い出す
自動化していても、分類のミスはゼロになりません。なので、月に一度、副業に関係しそうなのに一般的なカテゴリのまま放置されている記録がないか、AIに洗い出させています。
具体的には、損益計算書のレポートをAPIで取得し、副業専用の科目ではなく一般的な科目に計上されている経費を特定します。そのうえで、各科目の内訳を取引一覧APIで取得し、摘要欄のキーワードや金額の傾向から「本来は副業カテゴリに寄せるべきでは」と思われる記録を抽出して一覧にしてもらいます。
該当する取引が見つかったら、PUTで科目を差し替えます。
PUT /api/1/deals/{取引ID}
body: { company_id, issue_date, type: "expense",
details: [{ id: <既存の明細ID>, account_item_id: <正しい科目ID>, amount, description }] }
ここでも注意点があります。detailsの中に既存の明細IDを含めずに送ると、更新ではなく新規追加として扱われてしまいます。既存のIDを必ず引き継ぐことが、正しく振替えるための条件です。
抽出されたものは自分で内容を確認し、必要なものだけ付け替えています。
最終判断は専門家に委ねる
ここは繰り返し強調しておきたい点です。この仕組みはあくまで「仕訳の下準備」を効率化するものです。最終的な経費区分の判断や、按分の妥当性については、税理士など専門家の判断に従っています。
AIによる分類はあくまで一次案です。特に事業按分が絡む部分は、自己判断だけで進めず、専門家に確認する前提で運用しています。
やってみて感じたこと
一番助かっているのは、「これは何の支払いだったか」を思い出す作業がなくなったことです。メールという記録が残っている限り、内容の特定はAIに任せられます。
一方で、分類の最終確認は必ず自分の目で行っています。特に個人的な支出と経費の境界線は、機械的な判断だけでは危ういと感じる部分だからです。
こういう人に向いている
- 副業や個人事業でカード払いの経費が多く、仕訳が後回しになりがちな人
- メールに注文確認や領収書が残っている購買が多い人
- 会計SaaSのAPI連携やAI活用に、ある程度慣れている人
まとめ
カード明細とメールを突き合わせるという発想自体は、特別なものではありません。ただ、それを毎回自分でやるか、仕組みに任せるかで、かかる手間は大きく変わります。
API登録だけでは明細と消込まではされない、という落とし穴も含めて押さえておくと、実際に手を動かすときにつまずきにくくなると思います。最終判断は専門家に委ねるという前提を崩さずに、下準備の部分だけをうまく仕組み化できたと感じています。
この整理をしていて、通信費も見直しの対象になりました。仕事でも使うスマホ代は、按分の判断がいちばん悩ましい支出でした。だったら先に、プランそのものを整理してもいいかもしれません。
本記事にはアフィリエイト広告を含みます。当サイトのリンクを経由して商品・サービスへお申し込みいただいた場合、提携先企業から成果報酬を受け取ることがあります。 また、運営者は楽天グループに所属する社員であり、紹介プログラムを通じた報酬を受け取る場合があります。記事内容・評価は広告の有無にかかわらず、運営者の実体験と調査に基づき作成していますが、 上記の関係性をご理解のうえお読みください。詳しくは免責事項・アフィリエイト表記をご覧ください。