Dashboard|

CostGraph

See AI spend through Cencori beside the rest of your cloud bill in CostGraph.

CostGraph is a FinOps platform that puts cloud, Kubernetes, GPU and AI spend in one place. It covers allocation, budgets, anomaly alerts and recommendations. Connect it to Cencori and every request through the gateway lands in CostGraph as FOCUS 1.2 records, attributed to your projects or to your own customers.

There are two ways to connect:

Connect from CencoriPull
StatusAvailable soonLive
HowClick Connect on the CostGraph card, sign in to CostGraph, pick a tenantCostGraph's exporter, or a job you run, reads GET /v1/usage/focus
CredentialA CostGraph sign-in, held by CencoriA read-only Cencori usage export key

Connect from Cencori

The CostGraph card is on every project's Settings → Integrations tab. The connection belongs to the organization and applies to every project; owners and admins manage it.

Connect signs you in to CostGraph, asks which CostGraph tenant to send usage to, and sets up the connection. Nothing to copy between dashboards. It becomes available once CostGraph enables connecting from Cencori; until then the button is disabled. To send usage to CostGraph today, use Pull.

Once connected, Cencori sends each UTC day after it closes. From the 3rd of each month it also re-sends the whole previous month, so a request logged late corrects itself. Re-sending the same usage updates it in place, so a repeat never double-counts. Each Cencori project appears as a sub-account; this is fixed once usage has been sent, because CostGraph keeps every record it receives.

Pull: CostGraph reads from Cencori

  1. In Cencori, open Organization settings → Advanced → Usage export and create a usage export key. It reads usage for every project in the organization and cannot call models.
  2. Point your CostGraph exporter, or any scheduled job, at the usage export API:
curl "https://api.cencori.com/v1/usage/focus?start=2026-10-13&end=2026-10-14&sub_account=end_user" \
  -H "Authorization: Bearer $CENCORI_USAGE_EXPORT_KEY" \
  | jq '{connection_id: env.COSTGRAPH_CONNECTION_ID, complete: true, focus_version: .focus_version,
         charge_period_start: .charge_period_start, charge_period_end: .charge_period_end, rows: .data}' \
  | curl -X POST https://api.costgraph.ai/api/v1/tenant/billing/focus \
      -H "X-API-Key: $COSTGRAPH_API_KEY" -H "Content-Type: application/json" -d @-

CostGraph's ingest endpoint takes the key in an X-API-Key header. It answers Authorization: Bearer with 401 API key required, even though some of its docs show Bearer.

For windows larger than one page, follow next_cursor. Send the first page with complete: true, and send later pages with the same batch_id and their row_offset, as CostGraph's push docs describe.

What lands in CostGraph

  • Provider: Cencori. Publisher: the model's maker (anthropic, openai, …). Service: what the work was: Cencori Text Generation, Cencori Embeddings, Cencori Image Generation, Cencori Audio, Cencori Vision, and so on.
  • SkuId: provider/model. Group by it to see spend per model.
  • ResourceId: the Cencori project, so project-level breakdowns work even when the sub-account is an end user.
  • Costs: what Cencori billed. BYOK usage is billed by your own provider account, so it reports zero here and doesn't double-count with that provider's bill in CostGraph.
  • Token buckets: input, cache read, cache write and output tokens as x_ columns. See Token buckets.

Cencori's rates in CostGraph's catalogue

Cencori publishes its model rates to CostGraph's pricing marketplace under the host cencori. Each model gets one rate per token bucket (input, output, cache read, cache write), kept in sync daily. Anything CostGraph prices from AI-gateway telemetry for traffic through Cencori resolves to Cencori's actual rates, not to another host's list price.

Models are published as provider/model, the same string as SkuId in the FOCUS records, for example anthropic/claude-sonnet-5 or groq/openai/gpt-oss-120b. The same model served through two providers has two rates. If your gateway telemetry reports bare model names, map them with the connection's model_map. Audio models priced per minute or per character are not in the catalogue, because CostGraph's model prices are per token.

Troubleshooting

What you seeWhyFix
Connect is disabledConnecting from Cencori isn't available yetUse Pull for now
A CostGraph error on the cardThe CostGraph sign-in was revoked, or the connection was removed in CostGraphOpen Manage → Reconnect
Nothing sent for a dayThat day had no billable usageNothing to fix
x_UnsplitRequests > 0Usage from before buckets were recordedCosts are exact; only the bucket split is missing