請求額は増えたのに、何を作るための費用かは見えません

AIコーディングツールの費用が増えると、モデル別の利用額やユーザー別ランキングから見たくなります。しかし、その表だけでは決済改修にいくら使ったのか、障害対応や中止された実験にどれほどの費用がかかったのかを説明しにくいです。

タイトルの「月15万ドル」は、検証済みのNavigara顧客請求額や削減実績ではありません。Navigaraの共同創業者が、CTO時代にCFOから「Claudeは毎月ほぼ15万ドルの実質的な価値を生んでいるのか」と尋ねられたと紹介した逸話です。会社・期間・ユーザー数・請求の証拠は公開されていないため、問題の規模を示す問いとしてのみ捉えるべきです。

それでも問いの方向性は有効です。どのモデルにお金を使ったかではなく、そのお金がどの製品目標へ流れ、どのような結果を生んだかを示して初めて、予算を増やすか減らすか、作業方法を変えるかを判断できるからです。

まず1か月分の利用原価を漏れなく回収します

最初の成果物は巨大なダッシュボードではなく、Claude Platformの1か月分の費用を最後まで取得した元帳です。以下の手順は、組織のAdmin APIキーとx-api-keyヘッダーを使う経路に限定しています。OAuthトークンを使う組織では認証ヘッダーが異なるため、このコマンドをそのまま使ってはいけません。個人アカウント・Claude Enterprise・Claude Platform on AWSにも同じAPIエンドポイントは適用できません。

  1. 公式ドキュメントで対象アカウントか確認します。 Usage and Cost APIのドキュメントを開き、現在の組織と認証情報がサポートされているかをまず確認してください。
  2. curl、jq、Python 3を用意します。 ターミナルで以下の確認コマンドを実行してください。不足しているツールがあれば、管理対象デバイスで承認されたソフトウェア経路、またはOSに合ったパッケージマネージャーでインストールし、3つのコマンドすべてがバージョンを出力することを再確認します。
curl --version
jq --version
python3 --version
  1. 組織のAdmin APIキーを現在のシェルに読み込みます。 Claude Consoleで組織管理者が発行したAdmin APIキーを用意し、組織が承認したシークレット管理ツールでANTHROPIC_ADMIN_KEY環境変数に注入してください。キーの値をスクリプト・元帳・共有文書に直接書かないでください。
  2. UTC期間と保存フォルダーを実際の照合対象に合わせます。 以下の値は2026年8月を照会するための説明用入力です。この記事では、認証済み組織でコマンドを実行して応答を再現していません。
  3. スクリプトを実行し、すべてのページを一意のファイルとして保存します。 Cost APIのデフォルト上限は7バケット、最大値は31バケットです。スクリプトはlimit=31をリクエストし、has_more=trueの場合はnext_pageを自動で渡します。
set -eu
: "${ANTHROPIC_ADMIN_KEY:?Load an Anthropic Admin API key first}"

STARTING_AT='2026-08-01T00:00:00Z'
ENDING_AT='2026-09-01T00:00:00Z'
REPORT_DIR='./claude-cost-2026-08'
mkdir -p "$REPORT_DIR"

page=''
page_number=1
while :; do
  output_file=$(printf '%s/page-%03d.json' "$REPORT_DIR" "$page_number")
  if [ -n "$page" ]; then
    curl --fail-with-body --silent --show-error --get \
      'https://api.anthropic.com/v1/organizations/cost_report' \
      -H "x-api-key: ${ANTHROPIC_ADMIN_KEY}" \
      -H 'anthropic-version: 2023-06-01' \
      --data-urlencode "starting_at=${STARTING_AT}" \
      --data-urlencode "ending_at=${ENDING_AT}" \
      --data-urlencode 'limit=31' \
      --data-urlencode 'group_by[]=workspace_id' \
      --data-urlencode 'group_by[]=description' \
      --data-urlencode "page=${page}" > "$output_file"
  else
    curl --fail-with-body --silent --show-error --get \
      'https://api.anthropic.com/v1/organizations/cost_report' \
      -H "x-api-key: ${ANTHROPIC_ADMIN_KEY}" \
      -H 'anthropic-version: 2023-06-01' \
      --data-urlencode "starting_at=${STARTING_AT}" \
      --data-urlencode "ending_at=${ENDING_AT}" \
      --data-urlencode 'limit=31' \
      --data-urlencode 'group_by[]=workspace_id' \
      --data-urlencode 'group_by[]=description' > "$output_file"
  fi

  jq -e '.data and (.has_more | type == "boolean")' "$output_file" >/dev/null
  has_more=$(jq -r '.has_more' "$output_file")
  [ "$has_more" = 'true' ] || break
  page=$(jq -r '.next_page // empty' "$output_file")
  [ -n "$page" ] || { echo 'has_more=true but next_page is missing' >&2; exit 1; }
  page_number=$((page_number + 1))
done

python3 - "$REPORT_DIR" <<'PY'
from decimal import Decimal
from pathlib import Path
import json, sys

files = sorted(Path(sys.argv[1]).glob('page-*.json'))
amount_cents = Decimal('0')
buckets = []
for path in files:
    payload = json.loads(path.read_text())
    for bucket in payload['data']:
        buckets.append((bucket['starting_at'], bucket['ending_at']))
        for result in bucket['results']:
            if result['currency'] != 'USD':
                raise SystemExit(f"Unexpected currency: {result['currency']}")
            amount_cents += Decimal(result['amount'])
print(f'pages={len(files)}')
print(f'buckets={len(buckets)}')
if buckets:
    print(f'range={min(x[0] for x in buckets)}..{max(x[1] for x in buckets)}')
print(f'amount_cents={amount_cents}')
print(f'amount_usd={amount_cents / Decimal("100")}')
PY

成功の基準は、リクエストがエラーなく終わり、最後の応答のhas_moreがfalseで、出力されたバケット範囲が意図したUTC期間をカバーすることです。各ページがpage-001.jsonのように別々に残り、amount_centsとamount_usdも出力される必要があります。認証エラー、不正なJSON、next_pageの欠落、想定外の通貨が出た場合は、原価配賦へ進まないでください。

Cost APIのamountはドルではなく、USDセント単位のdecimal stringであり、小数セントが生じることがあります。そのため、スクリプトでは二進浮動小数点ではなくPythonのDecimalで合計し、100で割っています。セント合計が18420なら、利用原価はUSD 184.20です。Priority Tierの費用はこのAPIに含まれないため、別の費用行として残す必要があります。

カード決済額と利用原価は別の帳簿です

前払いのClaudeアカウントでは、その月のCost API合計をその月のカード決済額と直接照合してはいけません。 多くのClaude Console組織はusage creditsを先に購入し、残高が設定した基準を下回ると自動チャージできます。8月のカード決済は、8月に利用した費用ではなく、今後使うクレジットの購入である可能性があります。

アカウント方式Cost APIと最初に比較する値決済記録の扱い
前払いクレジット同じUTC期間のConsole Usage/Cost記録手動・自動チャージをクレジット購入として別途記録
月次後払い契約同期間の利用料金明細・請求書税金・割引・クレジット・調整額を別行に分離

前払いアカウントでは、期首クレジット残高 + 期間中の購入額 ± 調整額 − 期間中の利用額 = 期末クレジット残高で流れを確認してください。Cost APIの利用額は同期間のConsole Usage/Cost記録と最初に比較し、カード決済・手動チャージ・自動チャージは購入行として扱います。差異が残る場合は、UTC期間の境界、Priority TierなどのAPI対象外、クレジットの失効・割引・税金・その他の調整を確認する必要があります。

費用回収が完了したサインは、カード決済額とAPI合計が偶然一致することではありません。全ページが保存され、セントが正確に換算され、利用原価が同期間のConsole記録と説明可能な形で一致し、クレジット購入と利用が別行で見えることです。

元の費用とPR別の配賦額を分けます

ベンダー費用を照合したら、以下の列で元帳を作成してください。

元費用行ID · 期間 · ベンダー · 製品 · 元金額 · 配賦額 · ワークスペース · リポジトリ · PR · イシュー · イニシアチブ · 接続根拠 · 帰属状態 · リリース状態 · 品質結果

Claude Platform Cost APIでは費用を日単位で照会し、workspace_idとdescriptionでグループ化できますが、PR・イシュー・ロードマップの識別子は提供されません。 ベンダーAPIは請求照合の出発点であり、完成したロードマップ原価表ではありません。

出発データ確認できること追加で接続する記録
ベンダー費用製品・ワークスペース別の利用原価コーディングツールのセッションまたはリポジトリ
リポジトリ・PR実際のコード変更ブランチ・PR本文のイシューキー
イシュー・エピック作業目的と担当範囲イニシアチブ・ロードマップ
ロードマップ項目目標別の配賦原価リリース・手戻り・障害の結果

特定のワークスペースが決済改修だけに使われたという承認記録があれば、その費用はイニシアチブレベルで直接帰属できます。ただし、月間ワークスペース費用のすべてを特定PR一件の直接費として記録できるわけではありません。PR別の費用を作るには、セッション費用とセッションIDが一緒に記録されているか、事前に合意した追加の配賦基準が必要です。

NavigaraもAI支出を作業タイプとロードマップ整合性で分類し、イニシアチブ・エピック・チケット・コード変更に結び付ける製品概念を提示しています。 ただし、公開ページでは個別のベンダー費用イベントをセッション・PRに結合する規則や、複数イシューが混在するセッションの競合処理を十分に説明していません。画面上の支出額と削減率も、独立して検証された顧客成果として解釈してはいけません。

確認済みの費用と推定した費用を混ぜないでください

役に立つ原価表は精巧に見える表ではなく、どこまで確認でき、どこから推定なのかが分かる表です。

  • 直接帰属: 特定イニシアチブ専用のワークスペースや、費用とともに記録されたセッションIDのように、明示的な根拠がある費用
  • 推定帰属: ユーザー・リポジトリ・時間帯・変更ファイルなどで分けたが、直接の費用識別子がない費用
  • 共通費: 共有席や共通インフラのように、1つのイニシアチブへ直接置きにくい費用
  • 未分類: 接続根拠も合意済みの配賦基準もない費用

以下の数値はすべて計算方法を示す説明用の入力例であり、実際の顧客費用や成果ではありません。元費用がUSD 184.20で、専用ワークスペースの記録により決済改修へ結び付く場合、PRは空欄のまま「イニシアチブレベルの直接帰属」として記録できます。

この金額を合意済みの変更ファイル比率に従ってPR #842へUSD 110.52、#857へUSD 73.68と分けた場合、2行は「推定配賦」です。同じ元費用行IDを保持し、2つの配賦額合計がUSD 184.20を超えないことを確認してください。根拠がなければ、PR列を空欄にし、イニシアチブレベルの費用として維持する方が正確です。

ロードマップ未接続の費用をすぐ無駄と判定しないでください。 セキュリティパッチ、障害対応、リファクタリング、探索的実験は必要でも、計画済み機能の一覧には入らないことがあります。Navigaraも、ロードマップ整合の作業と正当な非ロードマップ作業を区別する概念を提示しています。 未接続の項目は削除候補ではなく、目的を確認するためのレビュー待ちキューです。

費用の分母にはリリースと品質を入れます

PR数やコミット数だけで費用対生産性を計算すると、活動量の増加を価値の増加と誤解する可能性があります。NavigaraもPRが価値の単位そのものではないという問題を提起していますが、製品が示す独自スコアを独立検証済みの標準指標と見ることはできません。

DORAは、測定の目的に合うフレームワークを選び、システムログと自己申告データが示す範囲と限界をともに解釈すべきだと説明しています。 したがって、ロードマップ原価表には金額だけでなく、結果・品質・帰属の信頼度を並べて置く方がよいです。

原価
直接費・配賦費・未分類額
結果
リリース有無・計画との差
品質
手戻り・障害・レビュー時間
信頼度
直接・推定・共通費・未分類

GitHub Copilotのデータを追加する際も、範囲を記録してください。GitHubは組織・エンタープライズ・リポジトリ・ユーザー単位の利用指標とPR活動を提供しますが、席情報は別APIで確認します。組織の数値は実際の作業場所ではなくメンバーシップに基づいて帰属することがあり、1人のユーザーの活動が複数組織に現れる可能性があります。また、異なるCopilot APIリソースを直接比較してもいけません。

「決済改修に2万ドル」よりも、「イニシアチブレベル直接帰属1万4千ドル、共通費配賦4千ドル、PR別推定2千ドル、計画より2週間早くデプロイ、手戻り3件」という報告の方が有用です。この数値も説明用の例です。重要なのは最も高価なモデルから止めることではなく、未分類率と手戻りがともに高い作業フローを見つけることです。

  1. ベンダーの利用原価を照合します。 全ページ・期間範囲・セント換算を確認し、同じUTC期間のConsole Usage/Cost記録と比較します。
  2. 購入と利用を分けます。 前払いクレジット購入を利用原価と別行に置き、期首・期末残高と購入・調整・利用の流れを結び付けます。
  3. すべての費用に帰属状態を付けます。 直接帰属・推定・共通費・未分類のいずれかを表示し、接続根拠を残します。
  4. 配賦額の超過を確認します。 同じ元費用行IDを持つ子行の合計が元金額を超えないか確認します。
  5. リリースと品質を一緒に見ます。 費用の変化とリリース時点・手戻り・障害が一緒に動いたからといって、AIの因果効果だと断定しません。

すべての費用を無理にPRまで落とし込む必要はありません。確認できる範囲までだけ結び付け、残りは推定と未分類として正直に残してください。そうすれば、恐ろしい月次総額が、改善すべき作業フローを教えてくれる原価データに変わります。

さらに深く掘り下げるなら

Usage and Cost API - Claude Platform Docs — サポート対象の組織と認証方式、費用単位と除外範囲を確認できます。 platform.claude.com

Get Cost Report - Claude API Reference — リクエスト引数と上限、has_more・next_pageの応答構造を確認できます。 platform.claude.com

How do I pay for my Claude API usage? — 前払いusage creditsと自動チャージ、月次後払い契約の違いを説明しています。 support.claude.com

DORA | Choosing measurement frameworks to fit your organizational goals — 費用・デリバリー・品質データをどのような限界とともに解釈すべきか確認できます。 dora.dev