Billing & quotas
Spanlens pricing is designed to be predictable. You pay a flat monthly fee for your plan, and if you go past your included request quota, you pay only for what you used — capped at a multiple of your plan so you can't get a surprise bill.
Plan quotas
Every plan has a fixed monthly request quota:
| Plan | Monthly fee | Included requests | Log retention | Projects |
|---|---|---|---|---|
| Free | $0 | 10,000 | 7 days | 1 |
| Starter | $19 | 100,000 | 30 days | 5 |
| Team | $49 | 500,000 | 90 days | unlimited |
| Enterprise | custom | unlimited | 1 year | unlimited |
A request is one LLM call that flows through the Spanlens proxy — regardless of which provider (OpenAI, Anthropic, Gemini) or model. Streaming and non-streaming both count as one request each. Failed requests that reached our proxy also count (so a 500 from upstream still uses one).
Counting is per UTC calendar month — your counter resets at 00:00 UTC on the 1st of every month. This is simpler than per-subscription-period billing and matches what the dashboard shows you.
What happens when you hit your quota
Spanlens uses a Pattern C quota policy: soft limit, authorized overage, hard cap. You stay in control.
Free plan — hard block at 10,000
The 10,001st request returns HTTP 429 Too Many Requests with a JSON body:
{
"error": "Monthly request quota reached on the Free plan. Upgrade to continue.",
"reason": "free_limit",
"plan": "free",
"used": 10000,
"limit": 10000,
"upgrade_url": "https://www.spanlens.io/billing"
}jsonRequests resume at the next UTC month rollover, or when you upgrade.
Paid plans — overage billing (default)
Starter and Team default to allow overage. When you pass your included quota, requests keep flowing and extra usage is billed on your next invoice. The response carries an X-Overage-Active: true header so your code can detect the state if it wants to.
The dashboard shows a blue banner during overage with a running tally of how much extra will be billed.
Paid plans — with overage disabled
If you flip Allow overage charges off in /settings, paid plans behave like Free — hard block at the quota, returning 429 with reason: "overage_disabled". Choose this when you want cost certainty above all else.
Hard cap — safety ceiling
Even with overage enabled, we never let usage run unbounded. Your hard cap is:
hard_cap = monthly_limit × overage_cap_multiplier
= 100,000 × 5 (Starter, default) = 500,000
= 500,000 × 5 (Team, default) = 2,500,000textRequests past the hard cap return 429 with reason: "hard_cap". You can raise or lower the multiplier (1–100) in /settings to match your risk tolerance — for example set it to 1 to never pay more than the base plan fee, or 10 to absorb a huge traffic spike.
Overage pricing
Billed in 1,000-request units. Any partial unit rounds up.
| Plan | Overage rate | Example: 135,000 requests on Starter |
|---|---|---|
| Starter | $0.10 per 1,000 requests | 35,000 over → ceil(35,000 / 1,000) = 35 units × $0.10 = $3.50 on next invoice |
| Team | $0.08 per 1,000 requests | 100,000 over → 100 units × $0.08 = $8.00 on next invoice |
| Enterprise | Negotiated | Included or custom — contact sales |
Free plan has no overage rate — past 10K, it's a hard block. Upgrade to enable overage billing.
What your invoice looks like
Paddle generates one invoice per billing period. Overage from the prior period is bundled into the next invoice as an additional line item — you get one email per month, not one per charge:
Invoice — May 1, 2026
Spanlens Starter Subscription $19.00
Starter - Overage unit (per 1,000 requests) × 35 $3.50
─────────────────────────────────────────────────────────
Subtotal $22.50
Tax (automatically handled by Paddle) $ 2.25
─────────────────────────────────────────────────────────
Total $24.75textWarning emails
The organization owner receives automatic email warnings as usage grows:
- 80% — heads-up that you're approaching the limit. Message varies based on whether overage is on (“overage will absorb the overflow”) or off (“extra requests will 429”).
- 100% — with overage on: “overage billing is now active, you'll be billed on the next invoice.” With overage off: “requests are being rejected.”
Each threshold fires at most once per calendar month per org — no spam. See Alerts for the counting semantics.
FAQ
Can I change plans mid-month? Is it prorated?
Yes — Paddle handles plan changes with automatic proration. Upgrading mid-month gives you the new plan's higher quota immediately; the monthly fee difference is charged proportionally for the remainder of the period. Downgrading takes effect at the next period boundary.
What happens to overage if I downgrade?
Overage accrued on the old plan is billed on the final invoice at the old plan's rate. Requests on the new plan from that point forward use the new plan's quota and overage rate.
Can I cap my monthly bill at a specific dollar amount?
Yes, via the overage cap multiplier. Set it to 1 to never pay more than the base plan fee (overage disabled equivalent). Set it to 3 on Starter to cap at $19 + 300 × $0.10 = $49. Precise dollar limits will come in a future release.
Do I pay for retries / failed requests?
Yes — any request that reaches our proxy counts, regardless of the upstream response code. A 500 from OpenAI still uses one request. Rationale: the proxy did the work (auth, logging, forwarding, response buffering) and we have no way to distinguish “legitimate retry” from “duplicate because you have a bug.”
Do streaming requests count differently?
No — one stream = one request. Token cost is captured accurately via our stream parser (see Cost tracking), but the request counter increments by 1.
What if I self-host?
Self-hosted Spanlens has no billing — you pay your own infra costs. Plan quotas and overage logic only exist on the hosted service at spanlens.io. See self-hosting.
Where's my invoice history?
Every invoice is emailed to your account email. You can also view + download from /billing (powered by Paddle's customer portal).
Related: Overage settings, Per-request cost tracking, Alerts & quota emails, /billing dashboard.