Your AI bill, itemised by who spent it.
One provider invoice for the whole company tells you the total and nothing else. odnoga sits in front of every call and records which application made it, which job inside that application, and what it cost — then lets you cap it before the number surprises anyone.
No customer billing required. That part is optional and off unless you turn it on.
Three headers, and the bill explains itself
Send them with every call. From then on every request row, every chart and every budget can be filtered by them.
await fetch("https://api.odnoga.com/v1/chat/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.ODNOGA_API_KEY}`,
"X-Odnoga-App": "crm", // which system
"X-Odnoga-Function": "lead-enrich", // which job in it
"X-Odnoga-Env": "production", // which environment
},
body: JSON.stringify({
model: "gpt-5.1",
messages: [{ role: "user", content: "Summarise this account" }],
}),
});Add x-odnoga-end-user as well if you want the cost broken down per employee rather than per tool.
What you get for it
Cost per app, per function, per environment
Three headers say which system called, which job inside it, and whether it was production. Every request carries them into the log, so "what is the AI bill for" has an answer that does not involve asking around.
Budgets that stop spend, not report it
A soft cap warns. A hard cap refuses the request before it reaches the provider, so an experiment that loops cannot spend the quarter. Set per workspace, per team and per model.
An integration that went quiet looks like a quiet week
Traffic health learns what normal looks like for each caller and tells you when one stops or surges. A tool nobody noticed had broken is the most expensive kind of broken.
Change a prompt on purpose
Versions and labels, and a comparison run over real cases before the change reaches anyone. Switching the production version is a label flip, not a deploy — and the version that answered is on every request row.
Stop paying twice for the same question
Caching across two layers, with the saving recorded rather than assumed. Internal tools ask the same things far more than anyone expects.
When you do not need this
- One team, one application, one provider. The provider’s own dashboard will tell you enough.
- You would rather run the gateway yourself. LiteLLM is open source and does much of this.
- Your spend is small enough that the question has never come up. Come back when it does.