Skip to main content
Free · no signup · in-browser

Audit your AI spend from the export you already have

Drop an OpenAI or Anthropic usage or cost export — or a Bedrock, Azure OpenAI or Vertex AI one — and get a priced audit in seconds: effective vs. list cost, cache economics, model-swap opportunities, and a reconciliation that names what it could not price against what you were billed.

Analysis runs entirely in your browser. Your file is never uploaded — this page makes no network request with its contents. Prices come from our price book (version shown), provenance labeled; where your export includes provider-billed dollars we cross-check against them.

The audit tells you what the tokens cost. The harder question — which of your AI features and customers are actually profitable — is what the platform answers.

Drop your usage export

Analysis runs entirely in your browser. Your file is never uploaded — this page makes no network request with its contents.

Ten accepted formats

Format detection is automatic — drop the file and the parser works out which one it is. Current price book: 2026-10-v1.

OpenAI Usage API

JSON

Run this with an organization admin key in OPENAI_ADMIN_KEY: it asks for the last 31 days, one bucket per day and model, and saves the JSON. One response holds up to 31 daily buckets. If it ends with "has_more": true, fetch the next page by adding &page=<the next_page value> to the same URL. To audit every page as one export, save the responses into one file — as a JSON array of the responses, or one response per line — and drop that; or drop each saved page on its own.

curl -s "https://api.openai.com/v1/organization/usage/completions?start_time=$(( $(date +%s) - 31*86400 ))&bucket_width=1d&limit=31&group_by=model" \
  -H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
  -o openai-usage.json

Anthropic Admin API usage report

JSON

Run this with an Admin API key in ANTHROPIC_ADMIN_KEY: it asks for the last 31 days, one bucket per day and model, and saves the JSON (the date command works on macOS and Linux). One response holds up to 31 daily buckets. If it ends with "has_more": true, fetch the next page by adding &page=<the next_page value> to the same URL. To audit every page as one export, save the responses into one file — as a JSON array of the responses, or one response per line — and drop that; or drop each saved page on its own.

START=$(date -u -v-31d +%Y-%m-%dT00:00:00Z 2>/dev/null || date -u -d "31 days ago" +%Y-%m-%dT00:00:00Z)
curl -s -g "https://api.anthropic.com/v1/organizations/usage_report/messages?starting_at=$START&bucket_width=1d&limit=31&group_by[]=model" \
  -H "x-api-key: $ANTHROPIC_ADMIN_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -o anthropic-usage.json

Anthropic Admin API cost report

JSON

The same Admin API key, the billed dollars instead of the tokens: one bucket per day, each charge named with its model. Save it into the same file as the usage report (a JSON array of the two responses) to compare the book with what you were billed. One response holds up to 31 daily buckets. If it ends with "has_more": true, fetch the next page by adding &page=<the next_page value> to the same URL. To audit every page as one export, save the responses into one file — as a JSON array of the responses, or one response per line — and drop that; or drop each saved page on its own.

START=$(date -u -v-31d +%Y-%m-%dT00:00:00Z 2>/dev/null || date -u -d "31 days ago" +%Y-%m-%dT00:00:00Z)
curl -s -g "https://api.anthropic.com/v1/organizations/cost_report?starting_at=$START&bucket_width=1d&limit=31&group_by[]=description" \
  -H "x-api-key: $ANTHROPIC_ADMIN_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -o anthropic-cost.json

OpenAI dashboard export

CSV

platform.openai.com → Usage → Export. Column names are matched tolerantly (case and spacing don't matter).

Anthropic Console export

CSV

platform.claude.com (formerly console.anthropic.com) → Usage (or Cost) → Export CSV. Cache read/write columns and workspaces are picked up.

LiteLLM spend logs

JSON / JSONL

Your LiteLLM proxy's /spend/logs output, as a JSON array or one record per line. Key aliases become dimensions.

Amazon Bedrock invocation logs

JSON / JSONL

With model invocation logging on (Bedrock → Settings), drop the delivered records — an S3 object once unzipped is one record per line — or a CloudWatch Logs export of the log group, as below. Each invocation is one request; cache reads and writes are carried.

aws logs filter-log-events \
  --log-group-name <your-bedrock-invocation-log-group> \
  --start-time $(( ($(date +%s) - 31*86400) * 1000 )) \
  --output json > bedrock-invocations.json

Azure OpenAI token metrics

JSON

The Azure Monitor metrics of your Azure OpenAI resource, split by deployment and model, as below. Tokens are priced by the model; the deployment name is kept as the dimension. Per-deployment rows (deploymentName, promptTokens, completionTokens) are read too.

az monitor metrics list --resource <your-azure-openai-resource-id> \
  --metrics ProcessedPromptTokens GeneratedTokens --aggregation Total --interval P1D \
  --start-time $(date -u -v-31d +%Y-%m-%dT00:00:00Z 2>/dev/null || date -u -d "31 days ago" +%Y-%m-%dT00:00:00Z) \
  --filter "ModelDeploymentName eq '*' and ModelName eq '*'" -o json > azure-openai-usage.json

Vertex AI billing export

JSON / JSONL

Rows of your Cloud Billing export to BigQuery, as JSON or newline-delimited JSON. Vertex AI token SKUs are priced and compared with the billed cost; other services are skipped and counted. Credits are named, not netted.

bq query --use_legacy_sql=false --format=json --max_rows=100000 \
  'SELECT service, sku, usage, cost, currency, usage_start_time, credits
   FROM `<project>.<dataset>.gcp_billing_export_v1_<id>`
   WHERE service.description = "Vertex AI"
     AND usage_start_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 31 DAY)' > vertex-billing.json

Generic JSONL

JSONL

One JSON object per line with model + input_tokens/prompt_tokens + output_tokens/completion_tokens, optional cost.

Honest answers first

Does my file leave the browser?

No. Parsing and pricing run as JavaScript in this tab; this page makes no network request with the file's contents. You can verify that yourself in your browser's dev-tools network panel while you run an audit.

How accurate are the dollar figures?

Figures are computed from our price book (version 2026-10-v1) at provider-published list rates, and every model row is labeled with how its rate is known: verified, inferred, carried-forward, or fallback. If you have negotiated or enterprise rates your real bill will differ — where your export includes provider-billed dollars we cross-check against them and show the gap instead of pretending there is none.

Can it tell me cost per feature or per customer?

Only as far as your export can: if it carries an API key, project, or workspace column, the audit uses that as the attribution dimension. A provider export cannot attribute spend to your product's features or tenants — that requires instrumented usage, which is what the full product does.

What happens with models you don't recognize?

They are costed at a conservative mid-tier fallback rate and explicitly labeled as such — an unknown rate is never rendered as $0, and the honesty block names every model the price book could not stand behind.

Do you store anything?

Nothing. No account, no upload, no server-side processing of your file. Close the tab and the audit is gone.

Want this running continuously?

Run this analysis continuously against live usage — with per-feature attribution, budgets, and GPU allocation. CloudJaeger runs a ten-team design partner programme.

Request access

Holding a cloud bill instead of an AI usage export? The same credential-free audit for AWS, Azure and GCP exports runs at the cloud-bill audit inside the product — it needs a sign-in; this page never will.