Most AI spending limits only send an email by default. Check which of yours can stop a charge
In the last week of October, GitHub, Anthropic and OpenAI each shipped or documented a new spending control, and GitHub Enterprise started metering Copilot from the first request with no included allowance. Read the defaults and most of these controls notify rather than stop: a GitHub budget keeps charging past its limit unless one checkbox is on, a Copilot Automation without a limit runs as before, and a Claude Enterprise member with no limit at any level is unlimited. Three questions to ask of any AI budget, the gh api call that lists which of your GitHub budgets enforce, the Managed Agents budget you can only set when the session is created, and the 429 codes your retry loop must not retry.
GitHub's guide to Copilot budget controls contains this sentence: "By default, reaching a spending limit sends a notification but does not stop usage. Charges continue to accrue without a cap until you manually intervene."
That default mattered less while a Copilot seat came with an allowance. On 28 October GitHub announced that GitHub Enterprise now includes Copilot for every licensed user, with no monthly credits attached: "AI usage is metered from the first request against your enterprise budget." The same day, Copilot Automations gained optional credit limits and triggers that let one automation start another. Anthropic made pooled group budgets generally available for Claude Enterprise and added a Usage and Cost Analytics API the next day. Claude Code 2.1.316 put pooled budgets into its apps gateway. OpenAI began giving ChatGPT Pro and Business subscribers monthly API credits that end in a specific 429 when they run out.
Three vendors shipped five pieces of budget machinery inside four days. In July we wrote about putting a per-task price on model spend. This is the next step: the budget is now the thing that limits spend, so the question is what each budget does when it is reached. Read the documentation for each of these controls and the answers do not agree with each other, and in most cases the default is to tell someone rather than to stop anything.
Three questions for any AI budget
Before trusting a limit, find three answers in the vendor's docs:
- What does unset mean? Zero, unlimited, or something inherited from a level above.
- Does reaching it stop usage, or only notify? And who receives the notification.
- What exactly stops, and by how much can it overshoot? The request in flight, the run in progress, the next run, or only some features.
Here is how this week's controls answer them, quoted or paraphrased from each vendor's own documentation as of 1 November.
| Control | When unset | When reached | What keeps running |
|---|---|---|---|
| GitHub enterprise, organization or cost-center budget | Not documented for Copilot in GitHub Enterprise | Email and banner at 75, 90 and 100% if alerts are selected. Usage stops only if "Stop usage when budget limit is reached" is on, and that option "is off by default" | Code completion and next edit suggestions, always |
| GitHub user-level budget | "If no user-level budget is set, the request continues" | Always a hard stop. A $0 user-level budget blocks credit-consuming features immediately | Code completion and next edit suggestions |
| Copilot Automation limits | "Automations without limits continue to run as they do today" | Per-run limit stops the run. Daily, weekly and monthly limits only prevent new runs | A run already in progress, when the limit hit is a period limit |
| Claude Enterprise pooled group budget | With no individual limit and no group limit, "no spend limit is applied" | A member stops at whichever runs out first, their own limit or the pool. Email to everyone with the Billing permission at 50, 75, 95 and 100% | On seat plans, the usage the seat includes |
| Claude Managed Agents session budget | Optional; no ceiling without one | Every open workflow run pauses and the session reports budget_reached | Each thread finishes the model request it started, so the run can pass the budget by one request per working thread |
| OpenAI API credits and spend limits | Not applicable | HTTP 429 with a billing code such as credit_balance_exhausted | Nothing; retrying does not restore access |
Two patterns run through the table. The hard stop usually lives at the narrowest scope (a user, a single run, a session), while the broad scopes an admin sets first (enterprise, organization, period) default to alerting. And none of these controls is applied for you: every one of them is something an admin or a developer has to create, and each vendor's own wording says that without one, usage continues.
If you administer GitHub Enterprise or a Copilot organization
GitHub's billing docs give the instruction plainly: "Configure budgets before users begin consuming AI credits." The REST API lists every budget and whether it enforces. This needs an organization admin or billing manager:
gh api -H "X-GitHub-Api-Version: 2026-03-10" \
/organizations/YOUR_ORG/settings/billing/budgets \
--jq '.budgets[] | [.budget_scope, (.budget_product_skus | join(",")), .budget_amount, .prevent_further_usage] | @tsv'
For an enterprise, the path is /enterprises/YOUR_ENTERPRISE/settings/billing/budgets. Each row prints the scope, the SKUs, the amount in whole dollars and the enforcement flag. Any row with ai_credits and false in the last column is an alert, not a ceiling. An empty result is not reassurance either: the changelog does not say what an unset enterprise budget means for Copilot Chat and code review, so set one rather than infer the behaviour. Existing premium request budgets were converted to AI credit budgets automatically, so check whether the converted amounts still make sense now that there is no included allowance underneath them.
If you want a ceiling per person, the docs describe a universal user-level budget, applied to every Copilot-licensed user, and user-level budgets always enforce a hard stop. That is the one GitHub budget type that stops usage without a checkbox. Completions and next edit suggestions keep working at $0, so a hard user-level cap does not take autocomplete away from anyone.
If you are about to chain Copilot Automations
The new "Automation run succeeded" and "Automation run failed" triggers let one automation start another, and the "Can be triggered by" option can be moved from its default, "Only users", to "Users and Copilot", so that a pull request Copilot opens fires the next trigger. Set limits in the AI credit limits section before you change that option. Set two of them: a period limit stops new runs from starting, but GitHub's documentation is explicit that daily, weekly and monthly limits do not stop a run that is already in progress. Only the per-run limit does that, and its minimum is 30 AI credits. Daily limits reset at 00:00 UTC, weekly on Monday at 00:00 UTC and monthly on the first at 00:00 UTC, which is 4 p.m. on the US West Coast.
For Agentic Workflows, which went GA the same day, gh aw forecast is no longer experimental and now includes threat detection credits and monthly ranges. Run it before enabling a workflow, not after the first invoice.
If you administer Claude Enterprise
Pooled group budgets solve a real problem: heavy users hit individual limits early in the month while others leave budget unspent. The setup suggests an amount from the group's recent usage. Four details in the Help Center article change how you set it up:
- Alerts go to everyone with the Billing permission. If that is one person in finance, the 95% email reaches nobody who can raise the budget. Check who holds the permission.
- Members never see the group's name or the pooled amount. They see a "Request more" button, and the request goes to admins.
- To freeze a group, set the pooled budget to $0.
- Pooled budgets are not available through the Admin API yet, so they are managed in Organization settings.
The Spend Limits API writes per-user overrides only, and its FAQ contains a trap worth knowing before you clean up overrides: when you delete one, the member falls back to their group, seat-tier or organization default, and "If no default exists at any level, the member is unlimited." Set an organization default before you delete the overrides, not after.
If you run agents unattended
A budget on an agent session has a timing rule that the table above does not show. Claude Managed Agents accepts a budget only when the session is created. Adding one to a session created without it returns a 400, so a session started without a cap cannot be given one later. The field takes whole US cents as a string:
curl -sS --fail-with-body https://api.anthropic.com/v1/sessions \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: managed-agents-2026-04-01" \
-H "content-type: application/json" \
-d '{"agent": "'"$AGENT_ID"'", "environment_id": "'"$ENVIRONMENT_ID"'",
"budget": {"type": "limit", "max_list_cost": {"amount": "125", "currency": "USD"}}}'
That is a $1.25 ceiling. You can raise or lower it later with a session update, as long as the new value is above what the session has already consumed, and "budget": null removes it. Two behaviours at the ceiling are worth planning for: each working thread finishes its in-flight model request, so a run with 40 parallel threads can pass the budget by 40 requests, and a paused run's lifetime keeps counting, so a run left paused can end with timeout_error.
If you run Claude Code headless on a schedule, update to 2.1.314 or later. Before that version, "Continue automatically at usage limit" could continue more than three times without a prompt when a task restarted itself between waits, which is exactly the shape of a scheduled task or a /goal check-in.
If your code calls the API in a retry loop
On a metered API, a retry wrapper is a spending path. OpenAI's error-code guide separates two kinds of 429. A rate limit (type rate_limit_error, sometimes with the code slow_down) asks you to pace requests and follow the Retry-After header when it is present. A billing stop carries a code such as credit_balance_exhausted, organization_spend_limit_exceeded, project_spend_limit_exceeded or organization_usage_limit_exceeded, and the guide says retrying these will not restore access. A wrapper that backs off and retries on every 429 turns a hard budget stop into a loop that never ends. Read error.code, not only the status: the guide notes that error.type can still say insufficient_quota for several of these. We covered the same principle for a 403 that must not be retried, and it generalises: a rate limit is a reason to wait, a budget is a reason to stop.
See what you spent, per key
A cap tells you when to stop. Attribution tells you where the money went, and Anthropic's new Usage and Cost Analytics API (beta, 29 October) can now group cost by API key, so a key per agent or per customer becomes a cost line without any logging of your own. Claude Console organizations need an Admin API key, and Claude Enterprise organizations need a key with the read:analytics scope:
curl --globoff "https://api.anthropic.com/v1/organizations/analytics/cost?\
starting_at=2026-10-01T00:00:00Z&\
ending_at=2026-11-01T00:00:00Z&\
group_by[]=api_key_id&\
group_by[]=model" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: analytics-usage-cost-2026-08-24" \
-H "x-api-key: $ANTHROPIC_ADMIN_KEY"
Amounts come back as strings in cents with six decimals, so "41280.000000" is $412.80, not $41,280. Users and service accounts are one dimension, actor, rather than two. If you route through OpenRouter instead, query your realized cost per million tokens gives the equivalent calls.
Self-serve GitHub Enterprise customers move to the metered Copilot model in stages, with dates promised "in the coming weeks". If that is you, the budgets call above shows today which limits enforce, before the change reaches your account. For everyone else, the three questions work on the next control any vendor ships. The token cost of a task tells you what one run costs, and the budget's defaults tell you what happens on the run after the money runs out.
Get the next post when it ships
One email on Sunday with the new post and a short list of what shipped that week — new guides, tool updates, and a couple of links worth reading.