◉CLAUDE LABEN
●2.1.312 — 巨大な CLAUDE.md の上書きや、cd のあとにスキルが見つからない問題を修正しました●API — Messages API の最大リクエストサイズが 32MB から 128MB に拡大されました(10/28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り30日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST — Opus 4.8 の fast mode は非推奨になり、11/30 に除去されます。移行先は Opus 5.5●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.312 — 巨大な CLAUDE.md の上書きや、cd のあとにスキルが見つからない問題を修正しました●API — Messages API の最大リクエストサイズが 32MB から 128MB に拡大されました(10/28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り30日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST — Opus 4.8 の fast mode は非推奨になり、11/30 に除去されます。移行先は Opus 5.5●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/API & SDK
⬡ API & SDK/2026-10-31中級

旧 Usage and Cost API から Analytics API に替えたら、日別の表から日が消えました — 空の日は返らない仕様とゼロ埋めの書き方

10/29 にベータとなった Usage and Cost Analytics API は、使用量のない日の行を返しません。旧 API の日別レポートをそのまま置き換えると日が欠ける理由と、切り分けの順番、ゼロ埋めを足した Python の例を、手元で確かめた結果つきで書き残します。

Claude API140Usage and Cost Analytics APIAdmin APIコスト管理15移行14

土曜の昼、旧 Usage and Cost API の移行表を上から順に読んでいて、ある一行で手が止まりました。旧 API の data は「空のバケットも含む時間バケットの一覧」、新しい Analytics API は「使用量のある組み合わせだけの行の一覧」とあります。

日別の使用量を表にして眺める習慣のある方なら、ここで嫌な予感がするかもしれません。使わなかった日が、表からそのまま消えるのです。

最初にお伝えしておくと、私の手元は個人のアカウントで、Admin API 自体が使えません(公式ページに「個人アカウントでは利用できない」と明記されています)。ですので以下は、本番の応答ではなく、公式のサンプルと同じ形に作ったモックで確かめた内容です。その前提で読んでいただければ幸いです。

日が欠けて見える原因は 3 つあります

移行表から、日別の表づくりに効く差だけを拾うと次のとおりです。

項目旧 Usage and Cost APIUsage and Cost Analytics API
空の日・空の組み合わせ空のバケットも返る行が作られない
日別にする指定bucket_width(既定 1d)time_bucket_width(既定なし)
limit の数え方時間バケットの数行の数(1〜1,000、既定 20)
データの反映おおむね 5 分以内おおむね 4 時間以内、最大 24 時間
1 回で引ける範囲制限なし最大 31 日、1 分刻みは 24 時間

つまり、旧 API の感覚で呼ぶと、少なくとも次の 3 通りで「日が足りない」表ができあがります。

  1. 使用量のなかった日は、そもそも行が来ません。
  2. time_bucket_width を付けないと、期間全体を合計した 1 行しか返りません。
  3. limit を付けないと 1 ページ 20 行で止まり、そのあとのページを読み忘れがちです。

症状から原因を切り分ける順番

私は次の順で見るのが早いと考えています。画面や数字の見え方ごとに、先に疑う場所が違うからです。

見えているもの先に疑うこと確かめ方
行が 1 つだけ返るtime_bucket_width の付け忘れリクエストに time_bucket_width=1d があるか
7 日のはずが 4〜5 日分しかない使用量のない日の欠落欠けた日のログを見て、本当に呼んでいないか
モデルを増やすと行数が急に増える1 組み合わせにつき 1 行group_by[] の数と行数の関係
途中の日から先がないページ送り、または反映待ちhas_more と data_refreshed_at

とくに最後の行は、欠落と反映待ちが同じ見た目になります。応答に必ず付いてくる data_refreshed_at より後の使用量は、欠けているか、途中までしか入っていません。直近の日が少なく見えるのは、バグではなく仕様です。

日別の表を、ゼロ埋めで作り直す

公式の移行例にも「欠けた日はゼロで埋める」と書かれています。私は、受け取った行をモデル別に畳んで、期間内の全日を並べ直す小さな関数にしました。

from datetime import datetime, timedelta, timezone
from collections import defaultdict
 
 
def fill_daily(rows, start, end, key="model"):
    """Analytics API の usage 行(time_bucket_width=1d)を、欠けた日をゼロで埋めて返す。"""
    days = []
    d = start
    while d < end:
        days.append(d)
        d += timedelta(days=1)
 
    table = defaultdict(lambda: {day: 0 for day in days})
    for row in rows:
        day = datetime.fromisoformat(row["starting_at"].replace("Z", "+00:00"))
        name = row["group"][key] or "(none)"
        table[name][day] += row["usage"]["total_tokens"]
 
    return {k: [(day, v[day]) for day in days] for k, v in table.items()}

呼び出し側は、公式の移行例と同じ形にします。time_bucket_width を明示し、limit は 1,000 に上げ、SDK が残りのページを読んでくれる前提で for 文で回します。

import anthropic
 
client = anthropic.Anthropic()  # 環境変数から Admin 権限のキーを読む
rows = client.beta.organization.analytics.usage.list(
    starting_at="2026-09-01T00:00:00Z",
    ending_at="2026-09-08T00:00:00Z",
    time_bucket_width="1d",
    group_by=["model"],
    limit=1000,
)
as_dicts = [r.model_dump() for r in rows]

本番のキーでは試せませんので、fill_daily はモックで動かしました。9 月 1 日と 3 日にだけ使用量がある行を渡し、1 日〜7 日の 7 日分を並べた結果です。

claude-sonnet-5 [5590800, 0, 120000, 0, 0, 0, 0]
(none) [0, 0, 0, 0, 0, 0, 0]

2 日の欠けが 0 で埋まり、model が空の行は (none) に寄りました。model が null になる行は、公式の説明どおりコード実行などの使用量です。ここで null のまま辞書のキーに使うと、後工程で並べ替えが落ちやすいので、私は先に名前を付けています。

それでも合わないときに見る 3 つの場所

ゼロ埋めをしても数字が合わないときは、次の 3 つを順に確かめます。

  • ending_at を data_refreshed_at 以前に置いてください。 同じ範囲を繰り返し引いたとき、数字が日によって変わる原因の多くは、反映途中の日を含めていることです。
  • 確定値は、月が終わって 7 日以上たってから見てください。 公式には、月次の締め後およそ 7 日間は値が改定されうると書かれています。10 月 1 日の値が 11 月 7 日ごろまで動く、という例が添えられています。
  • 範囲は 31 日以内に切ってください。 長い期間は 1 回では引けません。月跨ぎの表は、2 回に分けて貼り合わせる前提で組みます。

旧 API と画面の数字が合わなかった方は、まずこの 3 つを疑うのが近道です。旧 API は 5 分ほどで反映されていましたので、「昨日は合っていたのに」という感覚が、そのまま新 API の反映の遅さに突き当たるのだと思います。

旧 API は、止めずに並べて見比べます

ここまで書いて、あらためて確かめたことがあります。旧 API は「レガシーだが引き続きサポートされる」と公式に書かれており、新規の実装に新 API を勧める、という立て付けです。急いで差し替える必要はありません。

新しい表は、古い表と並べて合わせてから切り替えます。 私はこの線引きにしました。旧 API の日別レポートに、新 API で作った同じ期間のゼロ埋めの表を横に置き、直近の 1 週間は差が出ても気にせず、締めの済んだ前月だけを突き合わせます。差が消えたことを確かめてから、集計の元を切り替えます。

月次の費用をワークスペース別に配る運用をされている方は、拙稿「ワークスペース単位で支出を割り当て、絞るパイプラインを見極める」の考え方がそのまま使えます。入口のエンドポイントが替わるだけで、配り方は変わりません。

まずは、いま使っている集計スクリプトの bucket_width を一度検索して、新 API で必要になる time_bucket_width と limit の置き場所を、メモに 1 行ずつ書き出すところから始めていただければと思います。

シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

⬡ API & SDK2026-10-27
Python SDK を 2.0.0 に上げて動かなくなる3か所 — モック越しに再現して決めた確認の順番
Python SDK 2.0.0 へ上げると、temperature の引数、認証ヘッダ、環境変数の二重指定の3か所で動作が変わります。手元のモック越しに再現した出力と、プロキシを挟む構成での直し方、確認の順番をお伝えします。
⬡ API & SDK2026-10-25
SDK を上げた途端に temperature が 400 になる前に、呼び出し箇所を洗いました
API バージョン 2026-10-21 では temperature・top_p・top_k を送ると、既定値でも 400 が返ります。SDK の更新で切り替わる仕組みと、先に洗っておく記述を拾う小さなスキャナ、直す順番をまとめました。
⬡ API & SDK2026-10-20
構造化出力を output_config.format へ移す — beta ヘッダーを外す前に確かめておきたい差分
output_format と beta ヘッダーで書いた構造化出力を output_config.format へ移すときの差分を、公式ドキュメントから洗い出しました。Python SDK の TypeError、プロンプトキャッシュの無効化、拒否や途中切れで崩れるスキーマまで、移行前に確かめる順番を整理します。