Quotas & rate limits
How SimplyFill counts requests, when it warns you, and what happens at 100%.
Quotas & rate limits
SimplyFill enforces three kinds of limits: hourly rate limits (requests per hour), monthly quotas (PDFs generated and AI generations consumed), and feature limits (templates and API keys). Every limit is tier-based and visible from the dashboard.
This page is the operational reference. If you only want a price comparison, see Pricing.
Hourly rate limits
The rate limit is a sliding-window counter, measured per API key per hour. Every authenticated request increments the counter; the counter ticks back down as requests age out.
| Tier | Requests / hour |
|---|---|
| FREE | 100 |
| PRO | 1,000 |
| BUSINESS | 10,000 |
| ENTERPRISE | 100,000 |
When the counter hits the limit, the next request returns 429 Too Many Requests with a Retry-After header naming the number of seconds until the oldest request ages out. Production-grade HTTP clients should honour Retry-After automatically — see the API errors reference for the retry policy contract.
Rate-limit headers are returned on every response, hit or miss:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | The hourly cap for this key |
X-RateLimit-Remaining | Requests left in the current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Monthly PDF generation quotas
The PDF quota is a monthly counter that resets on the first of each calendar month at 00:00 UTC. Each successful POST /api/v1/generate/pdf (or its bulk equivalents) increments the counter by one per output PDF.
| Tier | PDFs / month | Overage allowed | Overage price |
|---|---|---|---|
| FREE | 100 | No (blocked) | n/a |
| PRO | 1,000 | Yes | $0.10 / PDF |
| BUSINESS | 10,000 | Yes | $0.05 / PDF |
| ENTERPRISE | Unlimited | n/a | n/a |
On PRO and BUSINESS the overage is metered through Stripe and billed at month-end. On FREE the 101st PDF returns 402 Payment Required and the dashboard surfaces an upgrade prompt.
Monthly AI generation quotas
The AI generation counter is independent from the PDF counter. AI generations cover automated mapping suggestions and template intelligence features — see Templates for what triggers an AI generation.
| Tier | AI generations / month | Overage |
|---|---|---|
| FREE | 10 | Blocked |
| PRO | 100 | Blocked |
| BUSINESS | Unlimited | n/a |
| ENTERPRISE | Unlimited | n/a |
AI-quota exhaustion never blocks ordinary PDF generation. You'll see 402 Payment Required only when calling the AI endpoints themselves.
Feature limits
Two hard caps that don't reset monthly:
Templates per account
| Tier | Max templates |
|---|---|
| FREE | 3 |
| PRO | Unlimited |
| BUSINESS | Unlimited |
| ENTERPRISE | Unlimited |
POST /api/v1/templates/upload returns 403 Forbidden when the cap is reached. Existing templates aren't affected — you keep generating, you just can't add a new one until you delete an old one or upgrade.
API keys per account
| Tier | Max API keys |
|---|---|
| FREE | 1 |
| PRO | 5 |
| BUSINESS | 20 |
| ENTERPRISE | Unlimited |
Spanning the cap across environments is your call — see Environments.
HTTP status codes
| Scenario | Status | Response body |
|---|---|---|
| Hourly rate limit exceeded | 429 Too Many Requests | { "error": "rate_limit_exceeded", "retry_after": 1247 }. Retry-After header set. |
| Monthly PDF quota exceeded (FREE) | 402 Payment Required | { "error": "quota_exceeded", "tier": "FREE", "upgrade_url": "https://simplyfill.app/billing" } |
| Template count limit reached | 403 Forbidden | { "error": "feature_limit_reached", "limit": "templates", "tier": "FREE" } |
| Monthly AI quota exceeded | 402 Payment Required | { "error": "ai_quota_exceeded", "tier": "PRO" } |
These are the exact codes the backend emits — see also API errors.
Warning thresholds
You won't be surprised by an outage. SimplyFill sends email notifications at three thresholds during the month:
| Threshold | Action |
|---|---|
| 80% | Warning email to the account owner |
| 95% | Urgent warning email + dashboard banner |
| 100% | FREE blocked; PRO/BUSINESS start incurring overage billing |
The emails include the exact counts (824 / 1000 PDFs this month) and a one-click link to upgrade. If you've delegated billing to another team member, configure the notification recipient in Settings → Notifications.
Worked example: a FREE-tier account at 100%
You're on FREE. You've generated 100 PDFs this month. Here's what happens to call #101:
-
Your backend calls
POST /api/v1/generate/pdfwith a valid API key. -
SimplyFill sees the request, validates the key, and increments the counter.
-
The counter hits 101 — past the FREE cap of 100.
-
The response is
402 Payment Required:{ "error": "quota_exceeded", "message": "Monthly PDF quota exceeded for FREE tier.", "tier": "FREE", "limit": 100, "used": 100, "upgrade_url": "https://simplyfill.app/billing", "resets_at": "2026-06-01T00:00:00Z" } -
The dashboard shows a red banner inviting an upgrade. Generation resumes immediately after the user picks a paid plan; no need to wait for month-end.
On PRO or BUSINESS the same sequence runs but step 4 returns 200 OK (the generation succeeds) and step 5 surfaces a yellow overage banner instead — you'll be billed $0.10 × overage (PRO) or $0.05 × overage (BUSINESS) at month-end.
Where these values come from
The backend app/config.py file is the single source of truth:
RATE_LIMIT_FREE: int = 100
RATE_LIMIT_PRO: int = 1000
RATE_LIMIT_BUSINESS: int = 10000
RATE_LIMIT_ENTERPRISE: int = 100000
QUOTA_PDF_FREE: int = 100
QUOTA_PDF_PRO: int = 1000
QUOTA_PDF_BUSINESS: int = 10000
QUOTA_PDF_ENTERPRISE: int = 999999 # unlimited
QUOTA_AI_FREE: int = 10
QUOTA_AI_PRO: int = 100
STRIPE_OVERAGE_PRICE_PRO: int = 10 # cents per PDF
STRIPE_OVERAGE_PRICE_BUSINESS: int = 5 # cents per PDFIf you're self-hosting (Enterprise), these are environment-overridable.
What's next
- Environments — per-environment quota counters
- Webhooks — usage events you can subscribe to
- Billing API — read your current quota state programmatically