The path a call takes
Over time — cost and volume
By component — which subsystem the money went to
By model
By organization
Who used what
Organization → person → model, with band width carrying the cost. by-user says a person spent $4 and by-model says a model earned $9; neither answers which models that person used. Click a name for their exact rows.
By department — which team the money went to
The caller's PRIMARY department. A member can belong to several, but a call's cost is one number and splitting it needs an allocation rule nobody has defined — so the wider question is answered by joining the user back to their memberships, not by making this column ambiguous.
By user
Spend is measured over each key's own budget window, so the number beside a ceiling is directly comparable to it. A key with no budget shows its consumption without a bar — no limit is not the same as a limit of zero.
Keys and their consumption
What each key spends, and on which model
One row per key and model. Asked is the name the caller sent — what their own config says — and Served is the deployment that answered; the two differ exactly when routing did something. One key showing two Served rows for the same Asked name is weight or failover at work. A key reading (deleted) has had its row removed: the spend is kept and still counts, it just can no longer name itself.
How the customer is organised: a group, its subholdings, their teams. A key bound to an entity may act for that entity or one below it — the org a call names is checked against this tree, not believed — and its calls are counted against it. Keys not bound to any entity keep the old behaviour. Bind keys on the API keys tab.
Organisation
Chargeback
One line per cost centre for a month (UTC). An entity without a cost centre charges to the nearest one above it; the lines add up to the ledger's total, and unpriced calls are counted beside the cost, never as zero. Finance's map is a CSV of entity_slug,cost_center, applied whole or not at all.
Every request is scanned before it reaches a model. A key on flag records every catch and changes nothing; on enforce each rule does what it says — mask, block or flag. On enforce, a reply is held and checked first; one that trips a mask or block rule is withheld and the caller is told it was confidential. A catch records the rule and the count, never the text it matched.
Catches
Built-in rules
Shipped with Weir; their patterns are fixed. Here you choose, for every key at once, whether each is on and what it does. A key can add its own rules and make these stricter, never looser.
Your rules
Model routing
Priority answers which tier serves this; weight answers which one in the tier. Rows sharing a name and a priority split traffic in proportion to weight, and the next tier down is the fallback. A model name with no row here is refused with a 404 — this table is the whole of what Weir will route.
Deployments
Leave the API key blank to keep the one already stored — Weir never returns a credential, so there is nothing to fill it in with. Type one only to rotate it.
Contract rates
What you pay for this deployment, in USD per million tokens, from a date. It beats the built-in price list. A rate in force has priced calls and is never changed or deleted; a new price is a new row with a later start. Every priced call records the rate it was charged at.
Recent calls
One row per attempt, so a failover appears as two rows rather than as a quiet hour. Newest first, 200 at a time.
Calls
Everyone who can sign in to this console. Weir sends no mail — inviting somebody mints a single-use link that is shown to you once, and you send it however you already talk to them. Only its hash is stored, so it cannot be recovered afterwards.
Invite somebody
People
Invitations not yet accepted
Audit log
Every change made here, every recorded prompt opened, every attempt past a role, and every sign-in. The database refuses to edit or delete these rows. Request bodies are named by their fields only, never their values.
Send your traffic here
Weir speaks the OpenAI and Anthropic APIs. Point your existing client at it, swap the key, and every call is metered, priced and attributable — with no change to the code that builds the request.