ふくふくHukuhuku Inc.
EP.03Eng Dash 12分公開: 2026-05-10

Claude / Anthropic API の usage 集計:誰がどれだけ AI を使ったか

Anthropic Console の Usage API を叩いて、API キー別・モデル別・日次のトークン使用量とコストを取得する実装。Claude Code の利用ログ集計と組み合わせて「個人別の AI 活用度」を出す方法。

#Claude#Anthropic#api#コスト管理
CO📔 Google Colab で開く(上から順にセルを実行)
シェア

/ Anthropic API の利用状況を API キー別 × モデル別 × 日次 で取得し、エンジニア別の 活用度・コストを見える化します。

Anthropic Usage API

Admin API で usage を取得
Python
import os, requestsfrom datetime import date
ADMIN_KEY = os.environ["ANTHROPIC_ADMIN_KEY"]  # Console の Admin API key
def get_usage(start: date, end: date) -> list[dict]:    """指定期間の usage を取得(API キー別・モデル別の集計)"""    r = requests.get(        "https://api.anthropic.com/v1/organizations/usage_report/messages",        headers={            "x-api-key": ADMIN_KEY,            "anthropic-version": "2023-06-01",        },        params={            "starting_at": start.isoformat() + "T00:00:00Z",            "ending_at": end.isoformat() + "T23:59:59Z",            "bucket_width": "1d",            "group_by": "api_key_id,model",        },    )    r.raise_for_status()    return r.json()["data"]
# 過去 30 日from datetime import timedeltaend = date.today()start = end - timedelta(days=30)usage = get_usage(start, end)
# DataFrame 化import pandas as pdrows = []for bucket in usage:    for r in bucket["results"]:        rows.append({            "date": bucket["starting_at"][:10],            "api_key_id": r["api_key_id"],            "model": r["model"],            "input_tokens": r["uncached_input_tokens"],            "cache_creation": r.get("cache_creation_input_tokens", 0),            "cache_read": r.get("cache_read_input_tokens", 0),            "output_tokens": r["output_tokens"],        })
df = pd.DataFrame(rows)print(df.head())

API キー → エンジニアのマッピング

key 名の運用

API キーは「個人別 + 用途別」で発行 すると個別利用量が取れます: `tanaka-cli` `tanaka-cursor` `team-shared-bot`。Anthropic Console で key 名を `<個人>-<用途>` 規約で運用するのが現実解。

key → person のマッピング表
Python
# 別管理の YAML で:# api_keys:#   - id: "key_abc123"#     name: "tanaka-cli"#     person: "tanaka"#     team: "platform"
api_key_map = pd.read_yaml("api_keys.yml")df = df.merge(api_key_map, left_on="api_key_id", right_on="id")person_usage = df.groupby(["date", "person"])[["input_tokens", "output_tokens"]].sum()

コスト換算

モデルinput ($/1M tokens)output ($/1M tokens)
Claude Opus 4.71575
Claude Sonnet 4.6315
Claude Haiku 4.515

※ 上記は本記事執筆時点の参考価格。最新は Anthropic 公式料金ページで必ず確認Prompt caching を使うと cached input は 90% 引き、batch API だと 50% 引きになります。

コスト計算
Python
MODEL_PRICING = {    "claude-opus-4-7":      {"input": 15.0, "output": 75.0, "cache_read": 1.5, "cache_creation": 18.75},    "claude-sonnet-4-6":    {"input":  3.0, "output": 15.0, "cache_read": 0.3, "cache_creation":  3.75},    "claude-haiku-4-5":     {"input":  1.0, "output":  5.0, "cache_read": 0.1, "cache_creation":  1.25},}
def cost_usd(row):    p = MODEL_PRICING.get(row["model"])    if not p: return 0    return (        row["input_tokens"]    * p["input"]          / 1e6 +        row["cache_creation"]  * p["cache_creation"] / 1e6 +        row["cache_read"]      * p["cache_read"]     / 1e6 +        row["output_tokens"]   * p["output"]         / 1e6    )
df["cost_usd"] = df.apply(cost_usd, axis=1)print(df.groupby("person")["cost_usd"].sum().sort_values(ascending=False))

ダッシュに載せる指標

  • 個人別 月次トークン量・コスト: 上位ヘビーユーザの実績、未使用者の特定
  • モデル別利用比率: Opus / Sonnet / Haiku の使い分けが最適か
  • Cache hit ratio: prompt caching を活用できているか (高いほどコスト効率良)
  • Batch API 利用率: 非リアルタイム用途で 50% 引きを取れているか
  • 前月比トレンド: 急増した場合のアラート

次の話

EP.04 では OpenAI など他社 の usage と複数プロバイダ統合を扱います。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp