グループ経費精算
各メンバーの差し引き残高を入力すると、誰が誰に払えばよいかが短い一覧で分かります。アリスが50を受け取り、ボブが30、キャロルが20を払う場合、アリスへの2回の支払いで精算が終わります。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
旅行・シェアハウス・チームの会食のあと、誰が何を払ったかはだいたい分かっていても、その純残高を実際の銀行振込に直すのは面倒です。このグループ経費精算ツールは、各人の純残高(支払額マイナス負担額)を受け取り、誰が誰にいくら払うべきかの短い一覧を返します。グループは循環する借りを残さず完全に清算できます。正の残高は受け取り側、負の残高はまだ支払う側を意味します。合計はゼロで閉じる必要があります。閉じない場合、計算は黙って残差を作らず入力を拒否します。家計アプリ・金融ボット・イベント主催者は、同じ純残高に対して常に同じ振込計画を見られます。
純残高の意味と合計がゼロでなければならない理由
純残高は共有経費のもっとも単純な要約です。各人について、負担すべき額を実際に支払った額から差し引きます。Alice が共有請求に六十を払い、公平な負担が四十なら、純額はプラス二十で、二十を受け取るべきです。
Bob が何も払わず、なお三十を負担すべきなら、純額はマイナス三十です。閉じたグループの全員を列挙すると、正の純額と負の純額は打ち消し合います。グループのポケットを出たお金は、誰かの過払いとして再び現れなければなりません。
だからこの精算計算機は、ごく小さな数値許容の中で残高合計がゼロであることを要求します。合計がゼロでないなら表は不完全です。誰かが欠けている、分担の打ち間違い、通貨の混在などがあり、振込をでっち上げると不具合が隠れます。
少なくとも二人必要で、一人の名前だけでは自分と精算できません。振込一覧で誰が誰に払うかが曖昧にならないよう、各名前は一意でなければなりません。ゼロ残高は許可されます。
すでに均衡している人は、結果の送金側にも受取側にも現れません。
最小振込一覧の組み立て方
アルゴリズムは精算アプリで使われる古典的な貪欲最小キャッシュフローです。グループを債務者(負の残高、まだ支払う)と債権者(正の残高、受け取るべき)に分けます。作業用の写しで、各債務者がまだいくら払うべきか、各債権者がまだいくら受け取るべきかを追跡します。
各ステップで、残りの最大債務者が残りの最大債権者へ可能な限り支払い、その額の振込を一つ作り、双方の残義務を減らします。残額がゼロになった人はキューから外れ、ゼロ以外の純額がすべて消えるまで続きます。
振込回数は、ゼロ以外の残高を持つ人数より最大で一つ少ない程度で、多くの双方向支払いが局所的に相殺できるのに全部を一人の会計係に通す素朴なやり方よりはるかに少なくなります。領収書や多通貨換算が必要なら、ご自身の台帳 UI と組み合わせてください。本能力は一つの会計単位での純粋な数値振込計画のみを行います。
この精算方法が役立つ場面
旅行の幹事は表計算の純額を貼り付け、三つのアプリのスクショを集める代わりに短い支払一覧を友人へ送ります。月次の光熱費を合わせるシェアハウスや同居グループは、ある同居人の純額がゼロでも再現できる計画を求めます。会場費や食事を立て替えたハッカソン・ミートアップのホストは、Splitwise を一から作らず公平な精算が必要です。
チャットボットにグループ財務を埋め込む製品チームは、無料 Web ツールと同じ純モジュールを呼び、すでに精算済みのグループや二人の交換などの端ケースでデモと本番がずれないようにします。人の欠落・重複名・非有限残高・合計がゼロでないといった検証失敗は残高を消費しません。
活用例
旅行・週末グループの精算
各旅行者の支払済マイナス負担の純額を短い銀行振込一覧に変換し、休暇後に誰も借り証を抱え残さないようにします。
同居人の月次光熱費
家賃・電気・食材を集計したあと、当月の残純額を部屋間の最少回数の支払いで精算します。
よくある質問
グループ残高から精算振込をどう計算しますか?
people を {name, balance} の配列で送ります。balance は支払済マイナス負担です。正は受け取り、負は支払い側です。
なぜ残高の合計はゼロでなければなりませんか?
閉じたグループでは過払いと不足が打ち消し合います。合計がゼロでないと人が欠けているか入力ミスです。
正の残高と負の残高は何を意味しますか?
正の残高:払い過ぎで受け取るべきです。負の残高:不足で支払うべきです。ゼロはすでに精算済みで、振込一覧に出ません。
重みで請求を割るのと同じですか?
いいえ。 共有経費の按分は項目額と重みから各人の負担を作ります。この精算ツールは純額がある前提で、誰が誰に払うかだけを計画します。
精算には何回の振込が必要ですか?
残高がゼロでない人の数より1回少ない回数が上限です。3人に貸し借りがあれば2回の支払いで足り、すでに貸し借りのない人は一覧に出てきません。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/math/who-owes-who-settle-up \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"people":[{"name":"Alice","balance":50},{"name":"Bob","balance":-30},{"name":"Carol","balance":-20}]}'const res = await fetch("https://api.kit.forhosting.com/math/who-owes-who-settle-up", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"people": [
{
"name": "Alice",
"balance": 50
},
{
"name": "Bob",
"balance": -30
},
{
"name": "Carol",
"balance": -20
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/math/who-owes-who-settle-up",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"people": [
{
"name": "Alice",
"balance": 50
},
{
"name": "Bob",
"balance": -30
},
{
"name": "Carol",
"balance": -20
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/math/who-owes-who-settle-up", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"people":[{"name":"Alice","balance":50},{"name":"Bob","balance":-30},{"name":"Carol","balance":-20}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"people":[{"name":"Alice","balance":50},{"name":"Bob","balance":-30},{"name":"Carol","balance":-20}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/math/who-owes-who-settle-up", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"people": [
{
"name": "Alice",
"balance": 50
},
{
"name": "Bob",
"balance": -30
},
{
"name": "Carol",
"balance": -20
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "math.who_owes_who_settle_up",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
純残高の意味と合計がゼロでなければならない理由
エンドポイントは invalid_input と「残高は合計ゼロである必要がある」という明確なメッセージで失敗し、誰かが送金する前に入力を直せます。
最小振込一覧の組み立て方
出力フィールドは person_count、成功時は常にゼロの balance_sum、transfer_count、支払額合計の total_transferred、from・to・amount の配列 transfers、短い要約文字列です。金額は安定した JSON のため丸められます。任意フィールドは null ではなく省略されます。
精算 API が役立つ場面
実装は純 parse の tier A のため、成功した呼び出しは公開の基本料金 $0.002 で、モデルトークンも外向きネットワークも使いません。リクエストを小さく保ち、テストで振込一覧を固定すれば、イベント・家庭・自動化向けに信頼できる誰が誰に払う計画を、フル経費台帳を自前で立てずに得られます。
連携の活用例
チャットボットと表計算の自動化
閉じた残高行をシートやボットから API へ送り、振込計画をグループのチャンネルへ投稿し直します。
技術的な質問
グループ経費精算計算機の料金は?
ブラウザツールは無料です。API 要求は成功呼び出しあたり $0.002 の前払い KIT 残高を使います。無効入力は課金されません。