Cap types
| Cap | Scope | Default | Hard / soft |
|---|---|---|---|
| Per-scan budget | One scan | $25 | Hard — scan stops at cap |
| Monthly org budget | All scans this calendar month | unlimited | Hard — new scans are queued, not started, until the cap resets |
| Monthly target budget (optional) | All scans against one target | unlimited | Hard |
| Provider rate limits | Per provider quota (TPM/RPM) | provider-set | Soft — the agent retries with backoff |
What happens when a cap fires
- In-flight LLM calls finish — we don’t kill mid-call, that wastes the partial spend.
- The agent receives a “budget exhausted” signal — it stops scheduling new tool calls.
- The scan is marked
budget_exhaustedin the dashboard, with the actual cost so far recorded. - Findings already produced are kept. A
budget_exhaustedscan still ships its real findings; it just couldn’t do everything it wanted. - Notifications fire if you’ve configured them — Slack/email gets a “scan ran out of budget” event.
Spend audit trail
Every LLM call is recorded with:| Field | What it is |
|---|---|
timestamp | Wall-clock when the call started |
scan_id | Which scan made it |
agent | Which sandbox agent (web/api/codebase/auth) |
provider | OpenAI / Anthropic / Gemini / Azure / self-hosted |
model | The exact model name |
prompt_tokens / completion_tokens | Per-call token counts |
cost_usd | Computed from the per-million-tokens price for the model |
cache_hit | Whether prompt-caching saved input tokens (Anthropic + OpenAI both expose this) |
scan_id, target, agent, time range. Export as CSV.
Per-scan cap
Set on the scan config, not on the target — the same target may have a “quick” config ($5) and a “full” config ($50).
| Scope | Default cap |
|---|---|
auth | $5 |
api | $15 |
auth+api | $25 |
full | $75 |
gpt-4o for tool-use and gpt-4o-mini for cheap calls. If you’re on Anthropic or running a local model, the real cost per scope will differ — adjust the cap accordingly.
Monthly org cap
- In-flight scans finish (with their per-scan budget still applied).
- New scans are queued in
pending_budgetstate — visible in the dashboard, not started. - The cap resets at midnight UTC on the 1st of the next month, at which point queued scans start FIFO until the new cap is re-hit.
Per-target cap
For a high-touch target you want to keep cheap:Cost-control tips
- Use
cheapmodels for boilerplate. A scan withcheap = gpt-4o-minicosts 5–10× less than one withcheap = gpt-4ofor the same finding count. - Pin scope to
auth+apifor routine recurring scans; reservefullfor monthly deep-dives. - Use
forbidden_pathsto keep the agent off paths that produce noisy 500s — every retry costs tokens. - Enable prompt caching on Anthropic + OpenAI. Cached input tokens are 10× cheaper. The dashboard’s spend audit log shows your cache-hit rate.
- Schedule during off-hours so low-priority scans don’t compete with high-priority ad-hoc ones for monthly cap.
Notifications
Wire spend events to Slack/email/webhook under Notifications:pentest.budget.exhausted— fires per scan that hits its per-scan cappentest.budget.monthly_warning— fires when monthly spend crosses 80% / 90% / 100%pentest.budget.daily_burn_anomaly— fires when today’s spend is > 3× the trailing 7-day average