Where do the costs come from?
Mostly where nobody is watching: subagents, overnight runs and retries after a failure. For me the trigger was a week where my spend proxy (an approximation of spend, not an invoice total) was several times the week before. After that I moved the limits into the system instead of relying on my own attention.
Subscription or API?
Subscription first. My router picks from a list of tools and models for each task, and each entry is tagged as subscription or pay-per-use. Pay-per-use entries are only used when no subscription entry fits. In unattended runs they are dropped entirely. The task then waits instead of quietly costing money.
How do you stop an agent from blowing the budget?
With limits the agent cannot change itself. My daily budgets live in the broker, not in the prompt or in a hook. There is a cap per day and provider and a maximum number of calls. Even the switch I use to explicitly allow paid calls does not lift the daily limit.
What happens when quota runs low?
The entry drops out of the selection before any model is asked. My router leaves out entries whose remaining quota is too low, that have failed several times recently or that hit a plan limit not long ago. I read the remaining quota every ten minutes. Where a provider reports nothing, the display shows a dash, not an estimate. For Claude there is an extra gate that switches on when the weekly quota gets tight.
Is your own router worth it?
I cannot answer that in euros; I have no measured savings. I also measured my router against a fixed order, and it was not better. Tools that fail often or use a lot of tokens I take out again, with a date and a reason.
What would I suggest to a team?
This is my assessment; I have only built this for myself. I would start with a limit that applies outside the model and run unattended jobs only on quota that cannot be billed on top. Who gets which budget and what happens when it is used up I would settle beforehand, not when the invoice arrives.