Why provider dashboards disagree with your bill
Daily buckets, async settlement, cache pricing, per-request fees and charges that only bill on a match. Where the numbers drift, and how to reconcile them.
Where the numbers drift
| Cause | Example | Effect |
|---|---|---|
| Daily UTC buckets | OpenAI /v1/organization/costs and Anthropic cost_report only bucket by 1d | Today is partial; time zones split days differently |
| Async settlement | OpenRouter balances can dip below zero before settling | Balance-based burn jitters hour to hour |
| Cache pricing | OpenAI cached input bills at 10% of input; Anthropic splits cost by token type | Pricing all input at list overstates spend |
| Per-request fees | Perplexity adds a fee that scales with search context size | Tokens times rate undercounts |
| Billed only on a match | People Data Labs charges on a 200, LeadMagic never charges failed matches | Call counts overstate spend |
| Charges outside usage | OpenRouter's 5.5% card fee is on the credit purchase | Your card statement exceeds usage |
| Invoiced next cycle | SendGrid and Postmark overage bill the following month | This month's bill reflects last month |
| Excluded line items | Anthropic's cost report leaves out Priority Tier costs | Report undercounts the invoice |
Source for the last row: Anthropic's Usage and Cost API docs. The rest are on each provider's integration page.
Reconcile it
- 1Pick one anchor per provider
The provider's own daily total: OpenAI's Costs API, Anthropic's cost report, OpenRouter's
usage_dailyon/api/v1/key. Treat it as the truth for that day. - 2Sum your itemized calls for the same UTC day
Same day boundaries as the anchor, or the comparison is meaningless.
- 3Record drift and coverage
Drift is (itemized − anchor) / anchor. Coverage is how much of the day's traffic you actually captured. High drift with low coverage means missing events; high drift with full coverage means wrong rates.
- 4Flag it, don't overwrite it
Silently replacing your number with the provider's hides the bug that caused the gap. Keep both and fix the cause.
How Argus labels it
- Every call carries a cost provenance: provider_reported (the provider put it on the response), app_reported (you sent it), derived (priced from Argus's rate catalog) or unpriced.
- Each provider is exact when itemized cost is within 2% of the anchor and coverage is at least 95%, estimated when it's off, and unreconciled when there's no anchor to compare with.
- Drift is flagged, never auto-corrected. A cost drift alert emails you when it passes a threshold you set.
- Your coding agent can ask get_cost_accuracy over MCP before trusting a number.
Questions
- Why doesn't my token count times the price match my OpenAI or Anthropic bill?
- Cached input is billed at a fraction of the input rate, cache writes and reasoning tokens are billed differently, and some calls add per-request fees such as web search. Pricing raw input and output tokens at list price ignores all of that.
- Why is today's spend lower in the API than in my app's logs?
- OpenAI's Costs API and Anthropic's cost report return daily UTC buckets. Today's bucket is partial until the day closes, and your logs may count in a different time zone.
- How close should my own cost tracking be to the provider's?
- Within a couple of percent per day when you're capturing every call. Argus marks a provider exact when itemized cost is within 2% of the provider's own daily total and at least 95% of calls are covered.
Related
What each provider actually exposes over its API, how to put balances, daily spend and plan quotas on one ledger, and where you'll have to estimate.
Polling balance endpoints yourself is a weekend project. Here's the honest list of what it takes and what you end up maintaining.
Connect a provider key, point Claude Code or Cursor at the Argus MCP server, and ask what the last run cost.