[{"data":1,"prerenderedAt":473},["ShallowReactive",2],{"content-/mf-api-inventory-and-journal-rules":3,"all-pages-for-dir":471,"og-image-/mf-api-inventory-and-journal-rules":472},{"id":4,"title":5,"body":6,"category":453,"description":454,"extension":455,"meta":456,"navigation":457,"ogImage":458,"path":459,"project_name":460,"published":461,"publishedAt":462,"seo":463,"stem":464,"tags":465,"todo":469,"unpublished":461,"updatedAt":458,"__hash__":470},"pages/2026-03/2026-03-26/mf-api-inventory-and-journal-rules.md","クラウド会計公開APIの棚卸しと自動仕訳ルール戦略 - 公開API調査から内部API発見、ローカルGit管理構想まで",{"type":7,"value":8,"toc":434},"minimark",[9,14,18,21,26,29,34,42,49,53,56,59,62,64,68,71,74,77,87,90,93,99,102,105,108,110,114,121,124,241,243,247,250,253,256,260,289,292,295,298,309,312,314,318,321,419,421,424,427,430],[10,11,13],"h1",{"id":12},"クラウド会計公開apiの棚卸しと自動仕訳ルール戦略","クラウド会計公開APIの棚卸しと自動仕訳ルール戦略",[15,16,17],"p",{},"公開APIのドキュメントを端から端まで読んで、欲しいエンドポイントが3つとも存在しないことを確認した。そこからChrome DevToolsのNetworkタブに切り替え、内部APIを1つずつ掘り当てていった。最終的に「自動仕訳ルールをクラウド会計サービスに置かず、ローカルGitで管理する」という方針にたどり着くまでの記録。",[19,20],"hr",{},[22,23,25],"h2",{"id":24},"公開apiの壁3つの不在","公開APIの壁：3つの不在",[15,27,28],{},"クラウド会計サービスの確定申告機能の公開API（v3）で、以下3つのデータが取得できるか調査した。結果は全滅。",[30,31,33],"h3",{"id":32},"未登録明細仕訳化前の取引データ","未登録明細（仕訳化前の取引データ）",[15,35,36,37,41],{},"公開APIのスコープ一覧を確認すると、",[38,39,40],"code",{},"transaction.read"," というスコープ自体が存在しない。仕訳（journals）は取得できるが、仕訳化される前の「未登録明細」にアクセスする手段がない。",[15,43,44,45,48],{},"競合サービスには ",[38,46,47],{},"wallet_txns"," API（明細の取得・作成）があり、対照的だった。",[30,50,52],{"id":51},"連携明細銀行amazon等のデータ","連携明細（銀行・Amazon等のデータ）",[15,54,55],{},"銀行口座やAmazonなどの外部サービスから自動取得されたデータ。これも公開APIにエンドポイントがない。Chrome拡張では、会計サービスのHTML画面をスクレイピングして取得している。",[30,57,58],{"id":58},"自動仕訳ルール",[15,60,61],{},"仕訳を自動生成するためのルール管理機能。公開APIにCRUD操作は一切なし。",[19,63],{},[22,65,67],{"id":66},"内部apiの発掘","内部APIの発掘",[15,69,70],{},"公開APIに存在しないなら内部APIを探すしかない。Chrome DevToolsのNetworkタブでクラウド会計サービスの画面を操作しながら、飛んでいるリクエストを片っ端から確認した。",[30,72,73],{"id":73},"自動仕訳ルールのエンドポイント",[15,75,76],{},"自動仕訳ルール画面で検索操作をすると、以下のリクエストが飛ぶのを捕まえた。",[78,79,84],"pre",{"className":80,"code":82,"language":83},[81],"language-text","POST /api/v1/office_journal_rules/search\n","text",[38,85,82],{"__ignoreMap":86},"",[15,88,89],{},"レスポンスはJSON形式で、ルールの条件（摘要のキーワード、金額範囲）と適用する勘定科目・補助科目がセットで返ってくる。",[15,91,92],{},"もう1つ、CSVエクスポートも発見。",[78,94,97],{"className":95,"code":96,"language":83},[81],"GET /journal_rules.csv\n",[38,98,96],{"__ignoreMap":86},[15,100,101],{},"こちらはブラウザでそのままダウンロードできる。JSON APIとCSVの両方が使えるので、用途に応じて使い分けられる。",[30,103,104],{"id":104},"journalizing_configurations",[15,106,107],{},"仕訳化の設定に関するエンドポイントも見つけた。自動仕訳ルールとは別に、連携サービスごとの仕訳化設定を管理しているようだ。",[19,109],{},[22,111,113],{"id":112},"chrome拡張での実装パス","Chrome拡張での実装パス",[15,115,116,117,120],{},"内部APIの呼び出しパターンは既にChrome拡張に実装済みの ",[38,118,119],{},"fetchMfApi"," 関数でカバーできる。会計サービスのセッションCookieを使って内部APIを叩き、レスポンスをパースしてスプレッドシートに書き込む流れ。",[15,122,123],{},"自動仕訳ルールの取得は、このパターンにそのまま載る。",[78,125,129],{"className":126,"code":127,"language":128,"meta":86,"style":86},"language-javascript shiki shiki-themes vitesse-light vitesse-light","// 既存パターンと同じ流れ\nconst rules = await fetchMfApi('/api/v1/office_journal_rules/search', {\n  method: 'POST',\n  body: JSON.stringify({ /* 検索条件 */ })\n});\n// → Google Sheets APIでスプレッドシートに書き込み\n","javascript",[38,130,131,140,182,203,229,235],{"__ignoreMap":86},[132,133,136],"span",{"class":134,"line":135},"line",1,[132,137,139],{"class":138},"sxvE3","// 既存パターンと同じ流れ\n",[132,141,143,147,151,155,159,163,166,170,174,176,179],{"class":134,"line":142},2,[132,144,146],{"class":145},"stQ0i","const",[132,148,150],{"class":149},"s4oTP"," rules",[132,152,154],{"class":153},"shFtX"," =",[132,156,158],{"class":157},"sHkkW"," await",[132,160,162],{"class":161},"senZ8"," fetchMfApi",[132,164,165],{"class":153},"(",[132,167,169],{"class":168},"sMJiu","'",[132,171,173],{"class":172},"sdGka","/api/v1/office_journal_rules/search",[132,175,169],{"class":168},[132,177,178],{"class":153},",",[132,180,181],{"class":153}," {\n",[132,183,185,189,192,195,198,200],{"class":134,"line":184},3,[132,186,188],{"class":187},"sz8Xr","  method",[132,190,191],{"class":153},":",[132,193,194],{"class":168}," '",[132,196,197],{"class":172},"POST",[132,199,169],{"class":168},[132,201,202],{"class":153},",\n",[132,204,206,209,211,214,217,220,223,226],{"class":134,"line":205},4,[132,207,208],{"class":187},"  body",[132,210,191],{"class":153},[132,212,213],{"class":149}," JSON",[132,215,216],{"class":153},".",[132,218,219],{"class":161},"stringify",[132,221,222],{"class":153},"({",[132,224,225],{"class":138}," /* 検索条件 */",[132,227,228],{"class":153}," })\n",[132,230,232],{"class":134,"line":231},5,[132,233,234],{"class":153},"});\n",[132,236,238],{"class":134,"line":237},6,[132,239,240],{"class":138},"// → Google Sheets APIでスプレッドシートに書き込み\n",[19,242],{},[22,244,246],{"id":245},"ローカルgit管理戦略","ローカルGit管理戦略",[15,248,249],{},"調査の過程で、自動仕訳ルールをどこに置くかという設計判断に至った。",[30,251,252],{"id":252},"クラウド会計サービス側に置かない理由",[15,254,255],{},"会計ソフトに蓄積したルールは、そのソフトへのロックインになる。税理士がクライアントの会計ソフトを切り替える場面では、ルールの移行コストが障壁になる。ルールを会計ソフトの外に持ち出しておけば、ソフトを切り替えてもルール資産が残る。",[30,257,259],{"id":258},"構想ルールをgitリポジトリで管理","構想：ルールをGitリポジトリで管理",[261,262,263,271,277,283],"ol",{},[264,265,266,270],"li",{},[267,268,269],"strong",{},"ルールの取得",": Chrome拡張で会計サービスの内部APIからルールをJSON/CSVで取得",[264,272,273,276],{},[267,274,275],{},"ローカル保存",": GitリポジトリにYAMLまたはJSON形式でコミット",[264,278,279,282],{},[267,280,281],{},"Claude Codeが参照・更新",": ルールファイルをコンテキストとして読み、新しい明細に対して適切なルールを提案",[264,284,285,288],{},[267,286,287],{},"会計サービスへの反映",": 必要に応じてChrome拡張経由で会計サービスに書き戻す",[15,290,291],{},"ルールの実体がGitにあるので、変更履歴が残り、ブランチで実験もできる。",[30,293,294],{"id":294},"仮勘定消し込みフローの構想",[15,296,297],{},"さらに踏み込んだ構想として、以下のフローを検討した。",[261,299,300,303,306],{},[264,301,302],{},"未登録明細を全件取得し、まず全て「仮払金」で自動仕訳登録",[264,304,305],{},"領収書・請求書とのマッチングを実行",[264,307,308],{},"マッチした明細を正しい勘定科目で消し込み（仮払金→実際の費目に振替）",[15,310,311],{},"これなら「未登録明細がいつまでも溜まる」問題を回避しつつ、正確な仕訳は後から確定できる。ただし仮払金が大量に積み上がる中間状態をどう管理するかは課題として残る。",[19,313],{},[22,315,317],{"id":316},"内部apiの棚卸し結果","内部APIの棚卸し結果",[15,319,320],{},"今回の調査で判明した「公開APIにないが内部APIで取得可能」なデータを、Chrome拡張のロードマップドキュメント（api-inventory-and-roadmap.md）に記録した。",[322,323,324,343],"table",{},[325,326,327],"thead",{},[328,329,330,334,337,340],"tr",{},[331,332,333],"th",{},"データ",[331,335,336],{},"公開API",[331,338,339],{},"内部API",[331,341,342],{},"Chrome拡張の実装状況",[344,345,346,360,371,384,397,408],"tbody",{},[328,347,348,352,355,357],{},[349,350,351],"td",{},"仕訳帳",[349,353,354],{},"あり",[349,356,354],{},[349,358,359],{},"実装済み",[328,361,362,365,367,369],{},[349,363,364],{},"勘定科目マスタ",[349,366,354],{},[349,368,354],{},[349,370,359],{},[328,372,373,376,379,382],{},[349,374,375],{},"連携明細",[349,377,378],{},"なし",[349,380,381],{},"HTMLスクレイピング",[349,383,359],{},[328,385,386,389,391,394],{},[349,387,388],{},"未登録明細",[349,390,378],{},[349,392,393],{},"要調査",[349,395,396],{},"未実装",[328,398,399,401,403,406],{},[349,400,58],{},[349,402,378],{},[349,404,405],{},"あり（JSON/CSV）",[349,407,396],{},[328,409,410,413,415,417],{},[349,411,412],{},"仕訳化設定",[349,414,378],{},[349,416,354],{},[349,418,396],{},[19,420],{},[22,422,423],{"id":423},"振り返り",[15,425,426],{},"公開APIのドキュメントを1時間読んで「ない」と確認するところから始めて、DevToolsのNetworkタブで内部APIを1つずつ拾い上げ、最後に「そもそもルールをどこに置くか」という設計判断にたどり着いた。",[15,428,429],{},"公開APIの不在は制約だが、内部APIが叩ける以上、Chrome拡張という既存の橋がそのまま使える。仕訳ルールをGitに持ち出す構想は、会計ソフトへの依存を1段下げる手段として筋が通っている。次のステップは、実際にルール取得をChrome拡張に組み込んで、JSONをリポジトリにコミットするところまで動かすこと。",[431,432,433],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":86,"searchDepth":142,"depth":142,"links":435},[436,441,445,446,451,452],{"id":24,"depth":142,"text":25,"children":437},[438,439,440],{"id":32,"depth":184,"text":33},{"id":51,"depth":184,"text":52},{"id":58,"depth":184,"text":58},{"id":66,"depth":142,"text":67,"children":442},[443,444],{"id":73,"depth":184,"text":73},{"id":104,"depth":184,"text":104},{"id":112,"depth":142,"text":113},{"id":245,"depth":142,"text":246,"children":447},[448,449,450],{"id":252,"depth":184,"text":252},{"id":258,"depth":184,"text":259},{"id":294,"depth":184,"text":294},{"id":316,"depth":142,"text":317},{"id":423,"depth":142,"text":423},"dev","クラウド会計サービスの公開APIに未登録明細・連携明細・自動仕訳ルールのエンドポイントが存在しないことを確認し、Chrome DevToolsで内部APIを掘り当て、ルールをローカルGitで管理する戦略を立案した記録","md",{},true,null,"/mf-api-inventory-and-journal-rules","misc-dev",false,"2026-03-26T00:00:00.000Z",{"title":5,"description":454},"2026-03/2026-03-26/mf-api-inventory-and-journal-rules",[466,336,339,58,467,468],"クラウド会計","Chrome拡張機能","会計","memo","pz3HG-Qb6ZzkhTlH2q-kBT5xsq4ohuzau9ah9ChgmyQ",[],"https://log.eurekapu.com/og/blog/mf-api-inventory-and-journal-rules.png?v=2026-03-26T00%3A00%3A00.000Z&title=%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E4%BC%9A%E8%A8%88%E5%85%AC%E9%96%8BAPI%E3%81%AE%E6%A3%9A%E5%8D%B8%E3%81%97%E3%81%A8%E8%87%AA%E5%8B%95%E4%BB%95%E8%A8%B3%E3%83%AB%E3%83%BC%E3%83%AB%E6%88%A6%E7%95%A5%20-%20%E5%85%AC%E9%96%8BAPI%E8%AA%BF%E6%9F%BB%E3%81%8B%E3%82%89%E5%86%85%E9%83%A8API%E7%99%BA%E8%A6%8B%E3%80%81%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABGit%E7%AE%A1%E7%90%86%E6%A7%8B%E6%83%B3%E3%81%BE%E3%81%A7&author=Kei%20Komatsu&sig=b295e71459103056",1782528821090]