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:

PlanMonthly feeIncluded requestsLog retentionProjects
Free$010,0007 days1
Starter$19100,00030 days5
Team$49500,00090 daysunlimited
Enterprisecustomunlimited1 yearunlimited

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"
}
json

Requests 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,000
text

Requests 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.

PlanOverage rateExample: 135,000 requests on Starter
Starter$0.10 per 1,000 requests35,000 over → ceil(35,000 / 1,000) = 35 units × $0.10 = $3.50 on next invoice
Team$0.08 per 1,000 requests100,000 over → 100 units × $0.08 = $8.00 on next invoice
EnterpriseNegotiatedIncluded 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.75
text

Warning 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.