How Outlay works.
Outlay maps your AI spend to the work that drove it, forecasts cost by scope, estimates planned work before you build it, and holds it to budget — all from read-only connections to the tools you already use. No proxy, no SDK, no changes to your app. Onboarding is through a design-partner pilot; here's what it does and how your data is handled.
Connect your sources — read-only
Setup is about 30 minutes and needs two read-only connections. Nothing is installed in your application; Outlay pulls metadata on a schedule.
| Source | Connect with | What we read |
|---|---|---|
| A tracker — GitHub Issues, Jira, or Linear | A read-only token / API key | Ticket, epic, and team metadata (IDs, titles, status) — to map spend to work. |
| AI usage — Anthropic Admin API, Cursor admin, or Claude Code transcripts | A read-only admin key / export | Per-call usage: model, token counts, timestamps — never prompt content. |
How spend is attributed to a ticket
Outlay resolves each AI agent's usage back to a ticket via the git branch, the PR→issue link, or a
commit trailer. For remote / CI agents where the branch is detached, an explicit work tag (e.g.
PROJ-123) makes the join reliable. Every attributed dollar carries a fidelity tier
so you know how confident the join is, and unattributable spend is reconciled to the provider invoice —
never dropped. Costs are cache-aware, so cached agentic workloads aren't overstated 5–10×.
What you get
- ✓Spend by ticket, epic, team & engineer — your AI bill mapped to the roadmap, reconciled to the invoice.
- ✓Forecast by scope — a quarter's cost projected bottom-up from open work, as a range.
- ✓Estimate planned work — price an epic from its requirements and design docs before you build it, with a confidence band.
- ✓Budgets & pace guardrails — by overall / team / work-type / project, with alerts before overspend, not at month-end.
- ✓Measured accuracy — every forecast is back-tested leave-one-out on your own closed tickets, shown with the sample size.
- ✓CSV export — ticket, work-type, and per-engineer spend, for business.
Walk through all of it interactively in the Product Tour.
Privacy & data flow
Outlay is not a proxy or gateway — your AI calls never flow through us. It connects read-only to your tracker and your provider's usage data, and reads metadata only.
- ✓Prompts and outputs never reach us. We read your provider's usage metadata, not your traffic.
- ✓Your API keys stay yours — used by your own tools to call Anthropic directly.
- ✓Metadata only — task categories, token counts, ticket IDs, and per-request cost figures.
- ✓Read-only & reversible — connect with read-only tokens; remove Outlay anytime and nothing about your traffic changes (we were never in the path).
Enforce a budget by program (optional)
Everything above is read-only — Outlay alerts you before a budget is blown, and your own
automation can act on a program.over webhook. If you want a true hard stop, there's an
optional in-path mode: run the ModelPilot gateway in front of your Claude calls, and it will block or
route down traffic the moment a program is over its cap.
1. Define a program with a hard cap
In the console, go to Programs and create a program — a budget spanning several teams, projects, or
work types (e.g. Platform = team platform + project PLAT). Set
Enforcement to Hard cap and choose the action when it's over: block new calls, or
route down to a cheaper floor model (e.g. claude-haiku-4-5).
2. Put the gateway in front of your calls
# point your SDK's base_url at the gateway, and turn enforcement on export MODELPILOT_CONSOLE_URL=https://app.outlay-ai.com export MODELPILOT_API_KEY=mp_live_… # from the console API page export MODELPILOT_ENFORCE=1 uvicorn modelpilot.gateway:app --port 8400
The gateway caches the current verdict from /api/v1/enforcement (refreshed every ~60s) and
decides each call locally — no per-request round trip. It's fail-open: if the console is
ever unreachable, calls pass through (we never block your traffic because our control plane blipped
— only because a budget you set was actually exceeded).
3. Tag each call with its work context
So the gateway knows which program a call belongs to, send one of these headers (the same work tags used for attribution):
| Header | Matches a program member of type |
|---|---|
x-modelpilot-work-ticket: PLAT-123 | project (the PLAT prefix) |
x-modelpilot-cost-center: platform | team |
x-modelpilot-work-type: feature | work type |
When a program is over its hard cap, a matching call is either blocked (HTTP 402,
budget_exceeded) or returned on the floor model, with an x-modelpilot-enforced
response header so you can see it happened. Programs left on Alert only are never blocked — they
just fire the program.over webhook.
Start a pilot
Outlay is onboarding its first customers now — read-only, ~2 weeks, free. We'll map your real AI spend to your roadmap, forecast the quarter, and show you where it's headed. Become a customer →