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.

They measure different things at different times. Provider cost APIs bucket by UTC day and lag; balances settle asynchronously; cached tokens, reasoning tokens and per-request fees price differently from plain tokens; some providers only charge on a successful match; and fees like card surcharges and next-month overage invoices never appear in usage at all. Reconcile per UTC day against the provider's own total and track the drift.

Where the numbers drift

CauseExampleEffect
Daily UTC bucketsOpenAI /v1/organization/costs and Anthropic cost_report only bucket by 1dToday is partial; time zones split days differently
Async settlementOpenRouter balances can dip below zero before settlingBalance-based burn jitters hour to hour
Cache pricingOpenAI cached input bills at 10% of input; Anthropic splits cost by token typePricing all input at list overstates spend
Per-request feesPerplexity adds a fee that scales with search context sizeTokens times rate undercounts
Billed only on a matchPeople Data Labs charges on a 200, LeadMagic never charges failed matchesCall counts overstate spend
Charges outside usageOpenRouter's 5.5% card fee is on the credit purchaseYour card statement exceeds usage
Invoiced next cycleSendGrid and Postmark overage bill the following monthThis month's bill reflects last month
Excluded line itemsAnthropic's cost report leaves out Priority Tier costsReport 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

  1. 1
    Pick one anchor per provider

    The provider's own daily total: OpenAI's Costs API, Anthropic's cost report, OpenRouter's usage_daily on /api/v1/key. Treat it as the truth for that day.

  2. 2
    Sum your itemized calls for the same UTC day

    Same day boundaries as the anchor, or the comparison is meaningless.

  3. 3
    Record 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.

  4. 4
    Flag 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

Let your coding agent watch the meter.

Connect a provider key, point Claude Code or Cursor at the Argus MCP server, and ask what the last run cost.