Open API

使用状況詳細のエクスポート

LMU AI 使用状況エクスポートガイド:ログインして JWT を取得し、ページネーション・期間指定・モデルフィルタリングに対応した /api/v1/usage を呼び出す。3 言語のサンプル付き。

アカウントとパスワードでログインして JWT を取得し、その JWT で /api/v1/usage を呼び出して、完全なトークン使用状況詳細テーブル(コンソールの /usage ページと同一) を取得します。

エクスポート・照合・エンタープライズ BI への読み込みを自動化する長時間実行のスクリプトに最適です。毎回手動で CSV をダウンロードする必要はありません。

なぜ sk-... API キーで直接取得できないのか? このキーはゲートウェイの業務コール(/v1/messages など)専用であり、アカウントレベルの詳細クエリを公開していません。これは意図的なセキュリティ設計です。キーが漏洩しても、請求全体がダンプされることを避けるためです。アカウントレベルのデータにはアカウント認証(JWT)を使用する必要があります。


1. API の概要

項目
ベース URLhttps://api.lmuai.com
認証Authorization: Bearer <access_token>(アカウントログインで得た JWT)
アクセストークンの有効期間86400 秒(24 時間)、refresh_token で更新可能
レスポンス形式JSON。code: 0 は成功、失敗時は code != 0message フィールドあり
推奨用途請求エクスポートの自動化、エンタープライズ BI への読み込み、照合スクリプト

2. ステップ 1 — ログインして JWT を取得する

POST /api/v1/auth/login

POST /api/v1/auth/login HTTP/1.1
Content-Type: application/json

{
  "email": "your@email.com",
  "password": "your-password"
}

レスポンス(抜粋):

{
  "code": 0,
  "message": "success",
  "data": {
    "access_token": "eyJhbGc...",
    "refresh_token": "rt_756a220ffa...",
    "expires_in": 86400,
    "token_type": "Bearer",
    "user": { "id": 3, "email": "...", "balance": 1575.13 }
  }
}

以降のすべてのリクエストには Authorization: Bearer <access_token> を含めるだけです。


3. ステップ 2 — 使用状況詳細を取得する

GET /api/v1/usage

GET /api/v1/usage?page=1&page_size=200&start_date=2026-06-01&end_date=2026-06-23&timezone=Asia/Shanghai
Authorization: Bearer <access_token>

クエリパラメータ

パラメータ必須デフォルト説明
pageintいいえ1ページ番号。1 から開始
page_sizeintいいえ201 ページあたりの行数。200 を推奨(過大な値は切り詰められる)
start_datestringいいえ開始日 YYYY-MM-DDtimezone に従って解析される
end_datestringいいえ終了日(当日を含む)
timezonestringいいえUTC日付パラメータの解析に使うタイムゾーン。例:Asia/Shanghai強く推奨。指定しないと境界がローカル時刻と一致しません
api_key_idintいいえ特定の 1 つのキーの詳細のみを表示(現在のユーザーに属している必要あり)
modelstringいいえモデル ID でフィルタ(例:claude-sonnet-5
streamboolいいえtrue でストリーミングのみ、false で非ストリーミングのみ
billing_typeintいいえ課金タイプ列挙(下記参照)
sort_bystringいいえcreated_atソートフィールド
sort_orderstringいいえdescasc または desc

レスポンス構造

{
  "code": 0,
  "message": "success",
  "data": {
    "items": [ { /* UsageLog */ }, ... ],
    "total": 30423,
    "page": 1,
    "page_size": 200,
    "pages": 153
  }
}

ページネーションフィールドは data のトップレベルにあり、外側のエンベロープにはありません。詳細配列は data.items にあります。data 自体は配列ではありません。

単一レコードのフィールドマッピング

これらはコンソールの /usage ページの各列に厳密に対応します:

コンソールの列JSON フィールド説明
モデルmodelstring実際に課金されたモデル ID
推論の努力度reasoning_effortstring | nulllow / medium / high / xhigh / max
インバウンドエンドポイントinbound_endpointstring | nullクライアントが呼び出したパス。例:/v1/messages
アップストリームエンドポイントupstream_endpointstring | null正規化されたアップストリームパス
リクエストタイプrequest_typestringchat / stream / responses / messages など
ストリーミングstreamboolストリーミングだったかどうか
課金モードbilling_modestringtoken / per_request / image / subscription
課金タイプbilling_typeint課金タイプ列挙
倍率rate_multiplierfloatこのリクエストに適用されたチャネル倍率
入力トークンinput_tokensint
出力トークンoutput_tokensint
キャッシュ作成cache_creation_tokensintすべてのキャッシュ書き込み
キャッシュ作成 5mcache_creation_5m_tokensintAnthropic の一時的な 5 分間ティア
キャッシュ作成 1hcache_creation_1h_tokensintAnthropic の 1 時間ティア
キャッシュ読み取りcache_read_tokensint
入力コストinput_costfloatUSD
出力コストoutput_costfloatUSD
キャッシュ作成コストcache_creation_costfloatUSD
キャッシュ読み取りコストcache_read_costfloatUSD
定価合計total_costfloatUSD、倍率適用前
実際の課金額actual_costfloat= total_cost × rate_multiplier。残高から実際に差し引かれる金額
初回トークンレイテンシfirst_token_msint | nullTTFT。ストリーミングで有効
総所要時間duration_msint | null
時刻created_atISO8601サーバー側の書き込み時刻
リクエスト IDrequest_idstringトラブルシューティングとトレース用
画像生成image_count / image_size / image_output_tokens / image_output_costマルチモーダルリクエストのみ設定される
API Keyapi_key_id + ネストされた api_key オブジェクトint + obj
グループgroup_id + ネストされた group オブジェクトint + obj

各レコードにはネストされた user / api_key / group オブジェクトが含まれます(1 行あたり約 +1KB)。api_key オブジェクトには完全なキーテキストが含まれるため、スクリプトのログ/スクリーンショット/CSV では必ずマスキングしてください。一括エクスポートで、ネストされたオブジェクトが不要な場合は、jq を使うか、クライアント側でフィールドマッピングして必要なフィールドだけを残してください。

課金タイプ列挙(billing_type)

意味
0トークンによる課金(大多数のリクエスト)
1サブスクリプションのクォータから差し引き

billing_mode フィールドは文字列版で、具体的な価格モデル(token / per_request / image / subscription など)を表します。より読みやすいため、分類には推奨されます。


4. トークンの更新

アクセストークンは 24 時間後に期限切れになります。更新方法は 2 通りあります:

refresh_token で更新する(スクリプト向けに推奨)

POST /api/v1/auth/refresh
Content-Type: application/json

{
  "refresh_token": "rt_756a220ffa..."
}

新しい access_token を返します(通常は refresh_token もローテーションされます)。リフレッシュトークンは 30 日間有効です。

再ログインする

粗雑ですが単純で、使い捨てスクリプトに適しています。実行のたびに /auth/login を再度呼び出します。


5. コードサンプル

Bash + curl + jq

#!/usr/bin/env bash
set -e

EMAIL="${EMAIL:?set EMAIL env}"
PASSWORD="${PASSWORD:?set PASSWORD env}"
BASE="https://api.lmuai.com"

JWT=$(curl -s -X POST "$BASE/api/v1/auth/login" \
  -H "Content-Type: application/json" \
  -d "{\"email\":\"$EMAIL\",\"password\":\"$PASSWORD\"}" \
  | jq -r '.data.access_token')

[ -n "$JWT" ] && [ "$JWT" != "null" ] || { echo "login failed" >&2; exit 1; }

START="2026-06-01"; END="2026-06-30"; TZ="Asia/Shanghai"; PAGE_SIZE=200

# Fetch page 1 to get total
META=$(curl -s "$BASE/api/v1/usage?page=1&page_size=$PAGE_SIZE&start_date=$START&end_date=$END&timezone=$TZ" \
  -H "Authorization: Bearer $JWT")
PAGES=$(echo "$META" | jq -r '.data.pages')

# CSV header
echo "created_at,model,request_type,input_tokens,output_tokens,cache_read_tokens,total_cost,actual_cost,duration_ms" > usage.csv

# Write page 1
echo "$META" | jq -r '.data.items[] | [.created_at, .model, .request_type, .input_tokens, .output_tokens, .cache_read_tokens, .total_cost, .actual_cost, .duration_ms] | @csv' >> usage.csv

# Fetch remaining pages
for ((p=2; p<=PAGES; p++)); do
  curl -s "$BASE/api/v1/usage?page=$p&page_size=$PAGE_SIZE&start_date=$START&end_date=$END&timezone=$TZ" \
    -H "Authorization: Bearer $JWT" \
    | jq -r '.data.items[] | [.created_at, .model, .request_type, .input_tokens, .output_tokens, .cache_read_tokens, .total_cost, .actual_cost, .duration_ms] | @csv' >> usage.csv
done

echo "saved $(wc -l < usage.csv) lines to usage.csv"

Python

import os, csv, requests

BASE = "https://api.lmuai.com"
EMAIL = os.environ["EMAIL"]
PASSWORD = os.environ["PASSWORD"]

def login() -> str:
    r = requests.post(f"{BASE}/api/v1/auth/login",
                      json={"email": EMAIL, "password": PASSWORD},
                      timeout=15)
    r.raise_for_status()
    data = r.json()
    if data["code"] != 0:
        raise RuntimeError(data.get("message", "login failed"))
    return data["data"]["access_token"]

def fetch_usage(jwt: str, **params):
    """Yield each row from paginated /usage endpoint."""
    page = 1
    while True:
        r = requests.get(f"{BASE}/api/v1/usage",
                         headers={"Authorization": f"Bearer {jwt}"},
                         params={**params, "page": page, "page_size": 200},
                         timeout=30)
        r.raise_for_status()
        d = r.json()["data"]
        for row in d.get("items", []):
            yield row
        if page >= d.get("pages", 1):
            return
        page += 1

if __name__ == "__main__":
    jwt = login()
    cols = ["created_at","model","request_type","input_tokens","output_tokens",
            "cache_read_tokens","total_cost","actual_cost","duration_ms"]
    with open("usage.csv", "w", newline="") as f:
        w = csv.writer(f); w.writerow(cols)
        for row in fetch_usage(jwt, start_date="2026-06-01", end_date="2026-06-30",
                               timezone="Asia/Shanghai"):
            w.writerow([row.get(c) for c in cols])
    print("done")

Node.js

import fs from 'node:fs'

const BASE = 'https://api.lmuai.com'
const { EMAIL, PASSWORD } = process.env

async function login() {
  const r = await fetch(`${BASE}/api/v1/auth/login`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ email: EMAIL, password: PASSWORD }),
  })
  const j = await r.json()
  if (j.code !== 0) throw new Error(j.message || 'login failed')
  return j.data.access_token
}

async function* fetchUsage(jwt, params) {
  for (let page = 1; ; page++) {
    const q = new URLSearchParams({ ...params, page, page_size: '200' })
    const r = await fetch(`${BASE}/api/v1/usage?${q}`, {
      headers: { Authorization: `Bearer ${jwt}` },
    })
    const j = await r.json()
    for (const row of j.data.items) yield row
    if (page >= j.data.pages) return
  }
}

const jwt = await login()
const cols = ['created_at','model','request_type','input_tokens','output_tokens',
              'cache_read_tokens','total_cost','actual_cost','duration_ms']
const out = fs.createWriteStream('usage.csv')
out.write(cols.join(',') + '\n')
for await (const row of fetchUsage(jwt, {
  start_date: '2026-06-01', end_date: '2026-06-30', timezone: 'Asia/Shanghai',
})) {
  out.write(cols.map(c => JSON.stringify(row[c] ?? '')).join(',') + '\n')
}
console.log('done')

6. 実践上の注意

  1. 大量のページ送りの間にディレイを入れる — N ページを連続でめくる場合、レート制限を回避するために sleep(0.1~0.3s) を推奨します。
  2. 一度に長すぎる期間を取得しない — 数か月にまたがり数百万行にわたると遅くなります。月単位でスライスするほうが安定します。
  3. page_size は 200 を推奨 — サーバーは過大な値を切り詰めます。
  4. 帯域を節約する — ネストされた user / api_key / group オブジェクトは大きいため、詳細行だけが必要なら jq でクライアント側でフィルタしてください。
  5. よくあるエラー
    • 401 JWT 期限切れ → refresh_token で更新するか再ログイン
    • 403 権限のないアクセス(例:api_key_id で他人のキーをクエリ)→ そのキーが現在のユーザーに属していることを確認
    • 400 パラメータ不正(例:start_date の形式)→ YYYY-MM-DD + timezone が有効か確認

7. セキュリティに関する推奨事項(必読)

あなたのアカウントパスワード + JWT は、アカウントへのフルアクセスと同等です。 エクスポートをスクリプト化する前に、以下を確認してください:

項目推奨事項
認証情報の管理password / access_token / refresh_token を git や CI ログに絶対にコミットしないこと。環境変数、シークレットマネージャー、または .env.gitignore 付き)を使用する
アカウントのセキュリティTOTP 二要素認証の有効化を強く推奨します(アカウント設定で有効化)。この API はログイン時の TOTP 検証に対応しています
定期的なローテーションアカウントパスワードを定期的に変更し、refresh_token は期限切れ後すぐにローテーションする
異常の監視アカウントの「最終ログイン時刻/IP」を監視し、見慣れないデバイスを見つけたらすぐにパスワードを変更する
フィールドのマスキングレスポンス内のネストされた api_key.key(完全な sk-... テキスト)、user.emailrefresh_token はすべて機密フィールドです。出力/ログ/CSV の前にマスキングしてください
最小権限分離できるなら、エクスポートスクリプト専用のサブアカウントを使用し(組織がマルチアカウント構成の場合)、メインアカウントの長期的な露出を避ける
エラーリトライログイン失敗時に無限にリトライしないこと。リスク管理を容易にトリガーします。指数バックオフを推奨します

8. フィールドクイックリファレンス

CSV の列マッピングに便利です:

ラベルフィールド単位
モデルmodel
推論の努力度reasoning_effort
インバウンドエンドポイントinbound_endpointpath
アップストリームエンドポイントupstream_endpointpath
リクエストタイプrequest_typeenum
ストリーミングstreambool
課金モードbilling_modeenum
課金タイプbilling_typeint
倍率rate_multiplierfloat
入力トークンinput_tokensint
出力トークンoutput_tokensint
キャッシュ読み取りトークンcache_read_tokensint
キャッシュ書き込みトークンcache_creation_tokensint
キャッシュ書き込み 5mcache_creation_5m_tokensint
キャッシュ書き込み 1hcache_creation_1h_tokensint
入力コストinput_costUSD
出力コストoutput_costUSD
キャッシュ作成コストcache_creation_costUSD
キャッシュ読み取りコストcache_read_costUSD
定価合計total_costUSD
実際の課金額actual_costUSD
初回トークンfirst_token_msms
総所要時間duration_msms
時刻created_atISO8601
リクエスト IDrequest_idstring
グループgroup_id / group.nameint / string
API Keyapi_key_id / api_key.nameint / string

最終更新:

このページの目次