/ 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.7 | 15 | 75 |
| Claude Sonnet 4.6 | 3 | 15 |
| Claude Haiku 4.5 | 1 | 5 |
※ 上記は本記事執筆時点の参考価格。最新は 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 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。